]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Return VARYING in range_on_path_entry if nothing found.
authorAldy Hernandez <aldyh@redhat.com>
Tue, 28 Sep 2021 07:38:50 +0000 (09:38 +0200)
committerAldy Hernandez <aldyh@redhat.com>
Tue, 28 Sep 2021 09:11:20 +0000 (11:11 +0200)
The problem here is that the solver's code solving unknown SSAs on entry
to a path was returning UNDEFINED if there were no incoming edges to the
start of the path that were not the function entry block.  This caused a
cascade of pain down stream.

Tested on x86-64 Linux.

PR tree-optimization/102511

gcc/ChangeLog:

* gimple-range-path.cc (path_range_query::range_on_path_entry):
Return VARYING when nothing found.

gcc/testsuite/ChangeLog:

* gcc.dg/pr102511.c: New test.
* gcc.dg/tree-ssa/ssa-dom-thread-14.c: Adjust.

gcc/gimple-range-path.cc
gcc/testsuite/gcc.dg/pr102511.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-14.c

index 71e04e4deba11f64fb6480f985d1112cfe109b03..9da67d2a35be3eb73834e60cfc48b3f40cd081b9 100644 (file)
@@ -136,14 +136,23 @@ path_range_query::range_on_path_entry (irange &r, tree name)
 {
   int_range_max tmp;
   basic_block entry = entry_bb ();
+  bool changed = false;
+
   r.set_undefined ();
   for (unsigned i = 0; i < EDGE_COUNT (entry->preds); ++i)
     {
       edge e = EDGE_PRED (entry, i);
       if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
          && m_ranger.range_on_edge (tmp, e, name))
-       r.union_ (tmp);
+       {
+         r.union_ (tmp);
+         changed = true;
+       }
     }
+
+  // Make sure we don't return UNDEFINED by mistake.
+  if (!changed)
+    r.set_varying (TREE_TYPE (name));
 }
 
 // Return the range of NAME at the end of the path being analyzed.
diff --git a/gcc/testsuite/gcc.dg/pr102511.c b/gcc/testsuite/gcc.dg/pr102511.c
new file mode 100644 (file)
index 0000000..8a9af34
--- /dev/null
@@ -0,0 +1,21 @@
+// { dg-do run }
+// { dg-options "-O3" }
+
+char arr_15 [8];
+__attribute__((noipa))
+void test(signed char a, unsigned short b, unsigned long long c,
+          unsigned short f) {
+  for (int d = b - 8; d < b; d += 2)
+    for (short e = 0; e < (unsigned short)((f ? 122 : 0) ^ (a ? c : 0)) - 64055;
+         e += 3)
+      arr_15[d] = 42;
+}
+int main() {
+    test(37, 8, 12325048486467861044ULL, 45936);
+    for (int i = 0; i < 8; ++i)
+      {
+        if (arr_15[i] != ((i&1) ? 0 : 42))
+          __builtin_abort();
+      }
+  return 0;
+}
index 3bc4b3795cbee214c6acb0b3d2abd8eebd3c7d5f..a25fe8bd89e80ab9a763749e03bfd6638fb9ff60 100644 (file)
@@ -37,5 +37,5 @@ expand_shift_1 (int code, int unsignedp, int rotate,
    we will enter the TRUE arm of the conditional and we can thread
    the test to compute the first first argument of the expand_binop
    call if we look backwards through the boolean logicals.  */
-/* { dg-final { scan-tree-dump-times "Threaded" 1 "dom2"} } */
+/* { dg-final { scan-tree-dump-times "Threaded" 2 "dom2"} } */