aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-01-29 11:48:03 +0100
committerChristopher Li <sparse@chrisli.org>2017-02-13 09:34:45 +0800
commite8cb94f5ecd7ecc5eae7e03c62cbcfe3886f96fb (patch)
tree754dcdfb1c62f5989e5ff2979b445e0f893ee5cb
parent412a61828670c1eb8c474640d787b522f9384222 (diff)
downloadsparse-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.c1
-rw-r--r--validation/kill-phi-node.c18
2 files changed, 19 insertions, 0 deletions
diff --git a/simplify.c b/simplify.c
index ed41e441..90998021 100644
--- a/simplify.c
+++ b/simplify.c
@@ -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\\.
+ */