fix killing OP_PHI instructions
commite8cb94f5ecd7ecc5eae7e03c62cbcfe3886f96fb
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>
Sun, 29 Jan 2017 10:48:03 +0000 (29 11:48 +0100)
committerChristopher Li <sparse@chrisli.org>
Mon, 13 Feb 2017 01:34:45 +0000 (13 09:34 +0800)
tree754dcdfb1c62f5989e5ff2979b445e0f893ee5cb
parent412a61828670c1eb8c474640d787b522f9384222
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>
simplify.c
validation/kill-phi-node.c [new file with mode: 0644]