diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-11-26 21:11:07 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-11-26 22:25:49 +0100 |
commit | fe9dbeb3d0ab6b12448e0eed96df1b8499d91c3c (patch) | |
tree | e43a979c000ebedf56d3ff70fcd78e06218bb6da | |
parent | 540c2c4bf47f0c517c042ff689679b2900bb36a5 (diff) | |
download | sparse-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.c | 4 | ||||
-rw-r--r-- | validation/optim/trivial-phi01.c | 20 |
2 files changed, 22 insertions, 2 deletions
@@ -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\\. + */ |