re PR tree-optimization/37242 (missed FRE opportunity because of signedness of addition)
authorRichard Biener <rguenther@suse.de>
Tue, 20 Aug 2019 12:02:56 +0000 (12:02 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 20 Aug 2019 12:02:56 +0000 (12:02 +0000)
2019-08-20  Richard Biener  <rguenther@suse.de>

PR tree-optimization/37242
* tree-ssa-sccvn.c (visit_nary_op): Also CSE (T)(a + b)
to (T)a + (T)b if we know that a + b does not overflow.

* gcc.dg/tree-ssa/ssa-fre-80.c: New testcase.

From-SVN: r274746

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-80.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index 7130cdab526dde9584a2907f6c38aa0dc35d321a..b750de4b421d4815c7d6005a0a0451bd95bf8140 100644 (file)
@@ -1,3 +1,9 @@
+2019-08-20  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/37242
+       * tree-ssa-sccvn.c (visit_nary_op): Also CSE (T)(a + b)
+       to (T)a + (T)b if we know that a + b does not overflow.
+
 2019-08-20  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR rtl-optimization/91347
index f18ea5f7dd1bc8cbac14353f6b07a0e1dc0cf7c7..5316e07a434e647f52286cc033a033c60949f3fa 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-20  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/37242
+       * gcc.dg/tree-ssa/ssa-fre-80.c: New testcase.
+
 2019-08-20  Ed Schonberg  <schonberg@adacore.com>
 
        * gnat.dg/storage_size1.adb: New testcase.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-80.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-80.c
new file mode 100644 (file)
index 0000000..0176508
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-fre1" } */
+
+unsigned long a, b;
+void foo (int m, int f)
+{
+  unsigned long tem = (unsigned long)m;
+  a = tem + 1;
+  if (f)
+    {
+      int tem2 = m + 1;
+      b = (unsigned long)tem2;  /* Eliminated to a.  */
+    }
+}
+
+/* { dg-final { scan-tree-dump-times "\\(long unsigned int\\)" 1 "fre1" } } */
index eb7e4be09e699783173f37b0504dbc733a05ea9c..76cad432ea4243ce4390d74af221a29f3bf3b762 100644 (file)
@@ -4312,8 +4312,12 @@ visit_nary_op (tree lhs, gassign *stmt)
         operation.  */
       if (INTEGRAL_TYPE_P (type)
          && TREE_CODE (rhs1) == SSA_NAME
-         /* We only handle sign-changes or zero-extension -> & mask.  */
-         && ((TYPE_UNSIGNED (TREE_TYPE (rhs1))
+         /* We only handle sign-changes, zero-extension -> & mask or
+            sign-extension if we know the inner operation doesn't
+            overflow.  */
+         && (((TYPE_UNSIGNED (TREE_TYPE (rhs1))
+               || (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
+                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (rhs1))))
               && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (rhs1)))
              || TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (rhs1))))
        {
@@ -4347,7 +4351,9 @@ visit_nary_op (tree lhs, gassign *stmt)
                    {
                      unsigned lhs_prec = TYPE_PRECISION (type);
                      unsigned rhs_prec = TYPE_PRECISION (TREE_TYPE (rhs1));
-                     if (lhs_prec == rhs_prec)
+                     if (lhs_prec == rhs_prec
+                         || (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
+                             && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (rhs1))))
                        {
                          gimple_match_op match_op (gimple_match_cond::UNCOND,
                                                    NOP_EXPR, type, ops[0]);