aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-range-cache.cc7
-rw-r--r--gcc/testsuite/gcc.dg/pr108139.c18
2 files changed, 25 insertions, 0 deletions
diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index ce5a0c8..9848d14 100644
--- a/gcc/gimple-range-cache.cc
+++ b/gcc/gimple-range-cache.cc
@@ -1235,6 +1235,13 @@ ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb)
if (!m_gori.has_edge_range_p (equiv_name))
continue;
+ // PR 108139. It is hazardous to assume an equivalence with
+ // a PHI is the same value. The PHI may be an equivalence
+ // via UNDEFINED arguments which is really a one way equivalence.
+ // PHIDEF == name, but name may not be == PHIDEF.
+ if (is_a<gphi *> (SSA_NAME_DEF_STMT (equiv_name)))
+ continue;
+
// Check if the equiv definition dominates this block
if (equiv_bb == bb ||
(equiv_bb && !dominated_by_p (CDI_DOMINATORS, bb, equiv_bb)))
diff --git a/gcc/testsuite/gcc.dg/pr108139.c b/gcc/testsuite/gcc.dg/pr108139.c
new file mode 100644
index 0000000..6f224e3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr108139.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O1 -ftree-vrp -fdump-tree-vrp" } */
+
+int a, b;
+int main() {
+ int c;
+ if (a > 1)
+ a++;
+ while (a)
+ if (c == b)
+ c = a;
+ return 0;
+}
+
+
+/* { dg-final { scan-tree-dump-not "Folding predicate" "vrp2" } } */
+
+