re PR tree-optimization/57326 (Piecewise folding of operations on PHI nodes)
authorRichard Biener <rguenther@suse.de>
Fri, 12 Aug 2016 12:58:15 +0000 (12:58 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 12 Aug 2016 12:58:15 +0000 (12:58 +0000)
2016-08-12  Richard Biener  <rguenther@suse.de>

PR tree-optimization/57326
* tree-ssa-pre.c (fully_constant_expression): Handle simplification
returning an SSA name.
(phi_translate_1): When fully_constant_expression returns a NAME
make sure we have a leader for it.

* gcc.dg/tree-ssa/ssa-pre-32.c: New testcase.
* gcc.dg/tree-ssa/loadpre14.c: Adjust.
* gcc.dg/tree-ssa/pr35287.c: Likewise.
* gcc.target/i386/pr45685.c: Likewise.
* gcc.dg/tree-ssa/predcom-1.c: Disable PRE.
* gcc.dg/tree-ssa/predcom-2.c: Likewise.
* gcc.dg/tree-ssa/predcom-3.c: Likewise.
* gcc.dg/tree-ssa/ssa-sink-10.c: Likewise.
* gfortran.dg/pr34163.f90: Likewise.

From-SVN: r239414

12 files changed:
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/loadpre14.c
gcc/testsuite/gcc.dg/tree-ssa/pr35287.c
gcc/testsuite/gcc.dg/tree-ssa/predcom-1.c
gcc/testsuite/gcc.dg/tree-ssa/predcom-2.c
gcc/testsuite/gcc.dg/tree-ssa/predcom-3.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-32.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/ssa-sink-10.c
gcc/testsuite/gcc.target/i386/pr45685.c
gcc/testsuite/gfortran.dg/pr34163.f90
gcc/tree-ssa-pre.c

index 14f95cf1a92173ed2f07c0e5ccb37a6ada0805cb..355f80d20dcbf47317a8926476e8ed82a48af7cb 100644 (file)
@@ -1,3 +1,11 @@
+2016-08-12  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/57326
+       * tree-ssa-pre.c (fully_constant_expression): Handle simplification
+       returning an SSA name.
+       (phi_translate_1): When fully_constant_expression returns a NAME
+       make sure we have a leader for it.
+
 2016-08-12  Martin Liska  <mliska@suse.cz>
 
            Adam Fineman  <afineman@afineman.com>
index 7700cec8b2d12a1c1a676742577aaecc1554e0a7..1691c25a76702295ed0a1aa90d1ee0373ec274d1 100644 (file)
@@ -1,3 +1,16 @@
+2016-08-12  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/57326
+       * gcc.dg/tree-ssa/ssa-pre-32.c: New testcase.
+       * gcc.dg/tree-ssa/loadpre14.c: Adjust.
+       * gcc.dg/tree-ssa/pr35287.c: Likewise.
+       * gcc.target/i386/pr45685.c: Likewise.
+       * gcc.dg/tree-ssa/predcom-1.c: Disable PRE.
+       * gcc.dg/tree-ssa/predcom-2.c: Likewise.
+       * gcc.dg/tree-ssa/predcom-3.c: Likewise.
+       * gcc.dg/tree-ssa/ssa-sink-10.c: Likewise.
+       * gfortran.dg/pr34163.f90: Likewise.
+
 2016-08-12  Martin Liska  <mliska@suse.cz>
 
        * g++.dg/gcov/gcov-16.C: New test.
index 989d933266275c6cf922fb92c73eaf5ad05a33e5..456c89f99419e391e983a50c32b56ddc19df5c46 100644 (file)
@@ -6,7 +6,8 @@ int foo(type *a, int argc)
   type c = {0, 1};
   int d, e;
 
-  /* Should be able to eliminate the second load of *a along the main path. */
+  /* Should be able to eliminate the second load of *a and the add of zero
+     along the main path. */
   d = (*a)[0];
   if (argc)
     {
@@ -15,4 +16,4 @@ int foo(type *a, int argc)
   e = (*a)[0];
   return d + e;
 }
-/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre"} } */
+/* { dg-final { scan-tree-dump-times "Eliminated: 2" 1 "pre"} } */
index b091ba85cc384610842e1ee91a2951dc94230d0c..f7cc5c0426211b82caeb3fd0d894e8c4f3702a1f 100644 (file)
@@ -10,5 +10,6 @@ int foo(int p)
   return (*gp + t);
 }
 
-/* We will eliminate one load of gp and one indirect load of *gp. */
-/* { dg-final { scan-tree-dump-times "Eliminated: 2" 1 "pre"} } */
+/* We will eliminate one load of gp and one indirect load of *gp and
+   the add of zero. */
+/* { dg-final { scan-tree-dump-times "Eliminated: 3" 1 "pre"} } */
index 062b3da71ceeaef9e9cf92195de9e2ada2df3f80..4bc2ea5659b32a90a10180e1d915ab986bf61831 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-do run } */
-/* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details" } */
+/* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details -fno-tree-pre" } */
 
 void abort (void);
 
@@ -45,6 +45,6 @@ int main(void)
 /* Verify that both loops were transformed and unrolled.  */
 /* { dg-final { scan-tree-dump-times "Unrolling 2 times." 2 "pcom"} } */
 
-/* Also check that we undid the transformation previously made by PRE.  */
-/* { dg-final { scan-tree-dump-times "looparound ref" 1 "pcom"} } */
-
+/* Also check that we undid the transformation previously made by PRE.
+   ???  PRE now does the predictive commoning in count_averages.  */
+/* dg-final { scan-tree-dump-times "looparound ref" 1 "pcom" } */
index 0d92f8e230717b65d7a5f8839a16fe6fae0526f8..d8fe51c5a6c9f84f308cf629d93cd8f4b209aaff 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details" } */
+/* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details -fno-tree-pre" } */
 
 void abort (void);
 
index bfddb793e53b7ea2b6053a88828c545bcbfb58f9..1174cd17eec5527b16dad071fa90a74ffca12be2 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details" } */
+/* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details -fno-tree-pre" } */
 
 int a[1000], b[1000];
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-32.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-32.c
new file mode 100644 (file)
index 0000000..d9bd3a9
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-pre" } */
+
+unsigned f(unsigned x, unsigned y, _Bool b)
+{
+#define m (b?-1:0)
+  return (x&m)|(y&~m);
+#undef m
+}
+
+/* { dg-final { scan-tree-dump "# prephitmp_\[0-9\]+ = PHI <\[xy\]_\[0-9\]+\\(D\\)\[^,\]*, \[xy\]_\[0-9\]+\\(D\\)" "pre" } } */
index 4031e10289d22eca1c5cb54c3eb55e570f5bae2a..37e4d2fe687199ffc3cf677dcdc8775c14ff0bca 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-sink-details" } */
+/* { dg-options "-O2 -fdump-tree-sink-details -fno-tree-pre" } */
 
 int x[1024], y[1024], z[1024], w[1024];
 void foo (void)
index 93c6686b8cb3969185c1f65c4cec3b245f5637b8..f9ed973dd5fe3e15623ca355cab2387cad650630 100644 (file)
@@ -36,4 +36,4 @@ int summation_helper_2(int64_t* products, uint64_t count)
        return s;
 }
 
-/* { dg-final { scan-assembler-times "cmov" 4 } } */
+/* { dg-final { scan-assembler-times "cmov" 6 } } */
index 1c948961ed9f8ff7ba2b2781f3ed93660dd081d7..5ce8d00e4c5277197b43efea6303d0d8e73fde3b 100644 (file)
@@ -1,5 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-O2 -fpredictive-commoning -fdump-tree-pcom-details" }
+! { dg-options "-O2 -fno-tree-pre -fpredictive-commoning -fdump-tree-pcom-details" }
 subroutine trisolve2(x,i1,i2,nxyz)
 integer :: nxyz
 real,dimension(nxyz):: au1
index c2c7495d02d912c2f664bdcb4cc4e5ef545e021b..edc3fdf2a790e3ed3679187e5628ef4672fb84b6 100644 (file)
@@ -1201,7 +1201,7 @@ get_or_alloc_expr_for (tree t)
 }
 
 /* Return the folded version of T if T, when folded, is a gimple
-   min_invariant.  Otherwise, return T.  */
+   min_invariant or an SSA name.  Otherwise, return T.  */
 
 static pre_expr
 fully_constant_expression (pre_expr e)
@@ -1218,10 +1218,8 @@ fully_constant_expression (pre_expr e)
          return e;
        if (is_gimple_min_invariant (res))
          return get_or_alloc_expr_for_constant (res);
-       /* We might have simplified the expression to a
-          SSA_NAME for example from x_1 * 1.  But we cannot
-          insert a PHI for x_1 unconditionally as x_1 might
-          not be available readily.  */
+       if (TREE_CODE (res) == SSA_NAME)
+         return get_or_alloc_expr_for_name (res);
        return e;
       }
     case REFERENCE:
@@ -1464,7 +1462,20 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
            constant = fully_constant_expression (expr);
            PRE_EXPR_NARY (expr) = nary;
            if (constant != expr)
-             return constant;
+             {
+               /* For non-CONSTANTs we have to make sure we can eventually
+                  insert the expression.  Which means we need to have a
+                  leader for it.  */
+               if (constant->kind != CONSTANT)
+                 {
+                   unsigned value_id = get_expr_value_id (constant);
+                   constant = find_leader_in_sets (value_id, set1, set2);
+                   if (constant)
+                     return constant;
+                 }
+               else
+                 return constant;
+             }
 
            tree result = vn_nary_op_lookup_pieces (newnary->length,
                                                    newnary->opcode,