aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-11-26 21:11:07 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-11-26 22:25:49 +0100
commitfe9dbeb3d0ab6b12448e0eed96df1b8499d91c3c (patch)
treee43a979c000ebedf56d3ff70fcd78e06218bb6da
parent540c2c4bf47f0c517c042ff689679b2900bb36a5 (diff)
downloadsparse-fe9dbeb3d0ab6b12448e0eed96df1b8499d91c3c.tar.gz
fix trivial_phi() when the target is before the single value
A phi-node is called 'trivial' if it only reference itself and a single other value. In this case the only possible value for the phi-node is this single other value which can thus replace the phi-node. However, the current code get this slightly wrong when the first referenced value is itself and not the other value. Fix this by moving up the test checking if it references itself. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--simplify.c4
-rw-r--r--validation/optim/trivial-phi01.c20
2 files changed, 22 insertions, 2 deletions
diff --git a/simplify.c b/simplify.c
index de03d315..5238d33f 100644
--- a/simplify.c
+++ b/simplify.c
@@ -204,14 +204,14 @@ static pseudo_t trivial_phi(pseudo_t pseudo, struct instruction *insn, struct ps
src = def->phi_src; // bypass OP_PHISRC & get the real source
if (src == VOID)
continue;
+ if (src == target)
+ continue;
if (!pseudo) {
pseudo = src;
continue;
}
if (src == pseudo)
continue;
- if (src == target)
- continue;
if (DEF_OPCODE(def, src) == OP_PHI) {
if (pseudo_in_list(*list, src))
continue;
diff --git a/validation/optim/trivial-phi01.c b/validation/optim/trivial-phi01.c
new file mode 100644
index 00000000..40bd343b
--- /dev/null
+++ b/validation/optim/trivial-phi01.c
@@ -0,0 +1,20 @@
+void foo(int a)
+{
+ if (a) {
+ while (a) {
+ switch (0) {
+ default:
+ a = 0;
+ case 0:;
+ }
+ }
+ }
+}
+
+/*
+ * check-name: trivial-phi01
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-excludes: phi\\.
+ */