]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Allow non-symmetrical equivalences.
authorAndrew MacLeod <amacleod@redhat.com>
Mon, 19 Jul 2021 19:54:57 +0000 (15:54 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Thu, 22 Jul 2021 12:51:59 +0000 (08:51 -0400)
Don't trap if equivalences are processed out of DOM order, and aren't
completely symmetrical.  We will eventually resolve this, but its OK for now.

gcc/
PR tree-optimization/101511
* value-relation.cc (relation_oracle::query_relation): Check if ssa1
is in ssa2's equiv set, and don't trap if so.

gcc/testsuite/
* g++.dg/pr101511.C: New.

gcc/testsuite/g++.dg/pr101511.C [new file with mode: 0644]
gcc/value-relation.cc

diff --git a/gcc/testsuite/g++.dg/pr101511.C b/gcc/testsuite/g++.dg/pr101511.C
new file mode 100644 (file)
index 0000000..ee2c7fd
--- /dev/null
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-O2 -Wno-div-by-zero" }
+
+void __assert_fail(const char *, const char *, int, const char *)
+    __attribute__((__noreturn__));
+template <typename T> void test_uint() {
+  long __trans_tmp_3, __trans_tmp_1;
+  int Error;
+  for (;;) {
+    {
+      unsigned long Tmp = -1;
+      __trans_tmp_3 = Tmp - Tmp % 0;
+    }
+    Error += 0 == __trans_tmp_3 ? 0 : 1;
+    !Error ? void() : __assert_fail("", "", 3, __PRETTY_FUNCTION__);
+    T Tmp = -1;
+    __trans_tmp_1 = Tmp - Tmp % 0;
+    Error += 0 == __trans_tmp_1 ? 0 : 1;
+    !Error ? void() : __assert_fail("", "", 7, __PRETTY_FUNCTION__);
+  }
+}
+void test() { test_uint<unsigned long>(); }
index 43fcab7995ae8c91258588a9244ad17c211123d9..bcfe388acf13b0ca7e2a3da5d771694d6e739999 100644 (file)
@@ -873,11 +873,15 @@ relation_oracle::query_relation (basic_block bb, tree ssa1, tree ssa2)
   if (kind != VREL_NONE)
     return kind;
 
-  // If one is not found, see if there is a relationship between equivalences.
   // If v2 isn't in v1s equiv set, then v1 shouldn't be in v2's set either.
+  // It is possible for out-of-order dominator processing to have an out of
+  // sync set of equivalences..  Down the road, when we do full updates,
+  // change this to an assert to ensure everything is in sync.
   const_bitmap equiv2 = equiv_set (ssa2, bb);
-  gcc_checking_assert (!equiv2 || !bitmap_bit_p (equiv2, v1));
+  if (equiv2 && bitmap_bit_p (equiv2, v1))
+    return EQ_EXPR;
 
+  // If not equal, see if there is a relationship between equivalences.
   if (!equiv1 && !equiv2)
     kind = VREL_NONE;
   else if (!equiv1)