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>