fix killing OP_PHI instructions
Currently kill_instruction() doesn't do anything with the
sources of OP_PHI instructions. But when these instructions
are removed the 'usage' of the associated sources must also
be removed. This is not done and as result the instructions
producing the phi-sources are not optimized away as expected.
This patch fixes that by calling clear_phi() when killing a
phi-instruction.
For example, when looking at the output of test-linearize,
the following function:
void foo(int a, int *b, unsigned int g);
void foo(int a, int *b, unsigned int g)
{
int d = 0;
if ((!a || *b) && g)
d = 16;
else
d = 8;
}
gives this output without the patch:
foo:
br %arg1, .L1, .L2
.L1:
phisrc.32 %phi1 <- $1
br .L3
.L2:
load.32 %r3 <- 0[%arg2]
phisrc.32 %phi2 <- %r3
br .L3
.L3:
ret
The 'phisrc' instructions are obviously unneeded but nevertheless present.
With the patch, the output is much closer to what's expected:
foo:
br %arg1, .L3, .L2
.L2:
load.32 %r3 <- 0[%arg2]
br .L3
.L3:
ret
Note 1) The 'load' instruction is also dead and should have been removed
but it's separate problem.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Signed-off-by: Christopher Li <sparse@chrisli.org>