]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Always track arguments, even when ignoring equiv params.
authorAndrew MacLeod <amacleod@redhat.com>
Mon, 29 Nov 2021 14:19:34 +0000 (09:19 -0500)
committerAndrew MacLeod <amacleod@redhat.com>
Tue, 30 Nov 2021 14:07:21 +0000 (09:07 -0500)
To "ignore" ranges from equivalences, we should track the range separately,
but still do the other name processing which determiens if there is a single
name or not for equivalence.  Otherwise we mistakently think we can introduce
an equivalences.

gcc/
PR tree-optimization/103440
* gimple-range-fold.cc (fold_using_range::range_of_phi): Continue
normal param processing for equiv params.

gcc/testsuite/
* gcc.dg/pr103440.c: New.

gcc/gimple-range-fold.cc
gcc/testsuite/gcc.dg/pr103440.c [new file with mode: 0644]

index d66ada5bb7c469f3962abf44b5783885942d0866..58122297c0b19594da8598a711e5e4a40a895eb1 100644 (file)
@@ -795,20 +795,17 @@ fold_using_range::range_of_phi (irange &r, gphi *phi, fur_source &src)
       // Get the range of the argument on its edge.
       src.get_phi_operand (arg_range, arg, e);
 
-      // Likewise, if the incoming PHI argument is equivalent to this
-      // PHI definition, it provides no new info.  Accumulate these ranges
-      // in case all arguments are equivalences.
-      if (src.query ()->query_relation (e, arg, phi_def, false) == EQ_EXPR)
-       {
-         single_arg = arg;
-         equiv_range.union_(arg_range);
-         continue;
-       }
-
       if (!arg_range.undefined_p ())
        {
          // Register potential dependencies for stale value tracking.
-         r.union_ (arg_range);
+         // Likewise, if the incoming PHI argument is equivalent to this
+         // PHI definition, it provides no new info.  Accumulate these ranges
+         // in case all arguments are equivalences.
+         if (src.query ()->query_relation (e, arg, phi_def, false) == EQ_EXPR)
+           equiv_range.union_(arg_range);
+         else
+           r.union_ (arg_range);
+
          if (gimple_range_ssa_p (arg) && src.gori ())
            src.gori ()->register_dependency (phi_def, arg);
 
@@ -829,7 +826,7 @@ fold_using_range::range_of_phi (irange &r, gphi *phi, fur_source &src)
 
     // If all arguments were equivalences, use the equivalence ranges as no
     // arguments were processed.
-    if (!seen_arg)
+    if (r.undefined_p () && !equiv_range.undefined_p ())
       r = equiv_range;
 
     // If the PHI boils down to a single effective argument, look at it.
diff --git a/gcc/testsuite/gcc.dg/pr103440.c b/gcc/testsuite/gcc.dg/pr103440.c
new file mode 100644 (file)
index 0000000..b97f45c
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-Os" } */
+/* { dg-timeout 10 } */
+
+int a, b, c, d, e;
+int main() {
+  int f = 2, g = 1, h = -3;
+L1:
+  c = b ^ 1;
+  if (!f)
+    goto L3;
+  if (d)
+    g = e;
+  f = h;
+  if (!c)
+    goto L1;
+L2:
+  if (g)
+    a = 0;
+L3:
+  if (d == g)
+    goto L2;
+  return 0;
+}