Drop overflow from constants while building ranges in ranger.
authorAldy Hernandez <aldyh@redhat.com>
Thu, 5 Nov 2020 11:40:51 +0000 (12:40 +0100)
committerAldy Hernandez <aldyh@redhat.com>
Thu, 5 Nov 2020 16:16:20 +0000 (17:16 +0100)
Sometimes the overflow flag will leak into the IL.  Drop it while
creating ranges.

There are various places we could plug this.  This patch just plugs things
at get_tree_range which is the entry point for ranges from tree expressions.
It fixes the PR, and probably fixes the ranger entirely, but we may need
to revisit this.

For example, I looked to see if there were other places that created
ranges with TREE_OVERFLOW set, and there are various.  For example,
the following code pattern appears multiple times in vr-values.c:

  else if (is_gimple_min_invariant (op0))
    vr0.set (op0);

This can pick up TREE_OVERFLOW from the IL if present.  However, the
ranger won't see them so we're good.

At some point we should audit all this.  Or perhaps just nuke all
TREE_OVERFLOW's at irange::set.

For now, this will do.

gcc/ChangeLog:

PR tree-optimization/97721
* gimple-range.cc (get_tree_range): Drop overflow from constants.

gcc/testsuite/ChangeLog:

* gcc.dg/pr97721.c: New test.

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

index ef65e00cc1d3db6d24361a582c9242780e70b063..0c8ec40448fb0b577b2e04ee78b4f40c4027d757 100644 (file)
@@ -165,6 +165,8 @@ get_tree_range (irange &r, tree expr)
   switch (TREE_CODE (expr))
     {
       case INTEGER_CST:
+       if (TREE_OVERFLOW_P (expr))
+         expr = drop_tree_overflow (expr);
        r.set (expr, expr);
        return true;
 
diff --git a/gcc/testsuite/gcc.dg/pr97721.c b/gcc/testsuite/gcc.dg/pr97721.c
new file mode 100644 (file)
index 0000000..c2a2848
--- /dev/null
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-O -fno-tree-dominator-opts" }
+
+int ot;
+
+void
+z6 (char *tw)
+{ 
+  while (ot >= 0)
+    --ot;
+
+  __builtin_strcpy (&tw[ot], tw);
+}