diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2017-01-29 11:48:03 +0100 |
|---|---|---|
| committer | Christopher Li <sparse@chrisli.org> | 2017-02-13 09:34:45 +0800 |
| commit | e8cb94f5ecd7ecc5eae7e03c62cbcfe3886f96fb (patch) | |
| tree | 754dcdfb1c62f5989e5ff2979b445e0f893ee5cb | |
| parent | 412a61828670c1eb8c474640d787b522f9384222 (diff) | |
| download | sparse-dev-e8cb94f5ecd7ecc5eae7e03c62cbcfe3886f96fb.tar.gz | |
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>
| -rw-r--r-- | simplify.c | 1 | ||||
| -rw-r--r-- | validation/kill-phi-node.c | 18 |
2 files changed, 19 insertions, 0 deletions
@@ -202,6 +202,7 @@ void kill_instruction(struct instruction *insn) return; case OP_PHI: + clear_phi(insn); insn->bb = NULL; repeat_phase |= REPEAT_CSE; return; diff --git a/validation/kill-phi-node.c b/validation/kill-phi-node.c new file mode 100644 index 00000000..88de9f96 --- /dev/null +++ b/validation/kill-phi-node.c @@ -0,0 +1,18 @@ +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; +} + +/* + * check-name: kill-phi-node + * check-command: test-linearize $file + * + * check-output-ignore + * check-output-excludes: phisrc\\. + */ |
