kill uses of replaced instructions
commit412a61828670c1eb8c474640d787b522f9384222
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>
Sun, 29 Jan 2017 10:48:02 +0000 (29 11:48 +0100)
committerChristopher Li <sparse@chrisli.org>
Mon, 13 Feb 2017 01:34:45 +0000 (13 09:34 +0800)
treebfe6433bbddd1201ed73cc1f02df20cc811b31d9
parentb5e06b1c455c544e43dbe14badbef0fd07687d64
kill uses of replaced instructions

When an instruction is replaced by a pseudo, the 'usage' of its
operands should be removed too but it's not the case.

The fix consists in calling kill_use() for each operands after
the pseudo is replaced.
Not all types of instruction are considered, only those which
can be replaced by a pseudo.

The following example illustrate the situation. When looking at
the output of test-linearize, the following function:

static int kill_add(int a, int b)
{
return (a + b) && 0;
}

without the patch, gives this output:

kill_add:
add.32      %r3 <- %arg1, %arg2
ret.32      $0

The 'add' instruction is obviously unneeded but nevertheless present.

Before any optimization the code was something like:

kill_add:
add.32      %r3 <- %arg1, %arg2
and_bool.32 %r4 <- %r3, $0
ret.32      %r4

During the simplification phase, the result of the 'and' instruction (%r4)
have been replaced by '0' and the instruction itself is discarded.
But '%r3' usage has not been adjusted and the further phases are not
aware that '%r3' is not needed anymore and so the 'add' instruction is kept
while not needed by anything.

With the patch the 'add' instruction is correctly discarded, giving the
expected output:

kill_add:
ret.32      $0

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Signed-off-by: Christopher Li <sparse@chrisli.org>
simplify.c
validation/kill-replaced-insn.c [new file with mode: 0644]