]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/61140 (wrong code at -O1 and above on x86_64-linux-gnu)
authorMarc Glisse <marc.glisse@inria.fr>
Sat, 17 May 2014 12:37:58 +0000 (14:37 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Sat, 17 May 2014 12:37:58 +0000 (12:37 +0000)
2014-05-17  Marc Glisse  <marc.glisse@inria.fr>

PR tree-optimization/61140
PR tree-optimization/61150
PR tree-optimization/61197
gcc/
* tree-ssa-phiopt.c (value_replacement): Punt on multiple phis.
gcc/testsuite/
* gcc.dg/tree-ssa/pr61140.c: New file.
* gcc.dg/tree-ssa/pr61150.c: New file.
* gcc.dg/tree-ssa/pr61197.c: New file.

From-SVN: r210554

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr61140.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr61150.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr61197.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.c

index 84345c08bc768d24366a752b62ab5adb8a40cf50..daf6e1a1137157d26522ae67be44b0f2266ef294 100644 (file)
@@ -1,3 +1,10 @@
+2014-05-17  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR tree-optimization/61140
+       PR tree-optimization/61150
+       PR tree-optimization/61197
+       * tree-ssa-phiopt.c (value_replacement): Punt on multiple phis.
+
 2014-05-17  Uros Bizjak  <ubizjak@gmail.com>
 
        * doc/invoke.texi (free): Mention Alpha.  Also enabled at -Os.
index c4007679cd3e8d25f534f7a1a99e59a91e95bea1..3c7ff36e95fa42454a87093a39897730d7e5a13f 100644 (file)
@@ -1,3 +1,12 @@
+2014-05-17  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR tree-optimization/61140
+       PR tree-optimization/61150
+       PR tree-optimization/61197
+       * gcc.dg/tree-ssa/pr61140.c: New file.
+       * gcc.dg/tree-ssa/pr61150.c: New file.
+       * gcc.dg/tree-ssa/pr61197.c: New file.
+
 2014-05-17  Uros Bizjak  <ubizjak@gmail.com>
 
        * g++.dg/pr60969.C: Compile for all ilp32 x86 targets.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61140.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61140.c
new file mode 100644 (file)
index 0000000..2f175cb
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+int a[1] = { 1 }, b = 1, c; 
+
+int
+main ()
+{
+  for (; c < 1; c++)
+    if (a[0])
+    {
+      a[0] &= 1;
+      b = 0;
+    }
+  if (b)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61150.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61150.c
new file mode 100644 (file)
index 0000000..c11798c
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+int a, b, c, d = 1;
+
+int
+main ()
+{
+  int e = d;
+  for (b = 0; b < 5; b++)
+  {
+    for (a = 0; a < 1; a++)
+    {
+      if (e)
+       break;
+      for (c = 0; c < 1; c++)
+       ;
+    }
+    e |= 1;
+  }
+  if (c)
+    __builtin_abort();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61197.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61197.c
new file mode 100644 (file)
index 0000000..919578b
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+int a, b = 1, *c = &a; 
+
+int
+foo ()
+{
+  if (b)
+    b |= 1;
+  else
+    {
+      b = 1;
+      return 0;
+    }
+  return 1;
+}
+
+int
+main ()
+{
+  *c = foo ();
+  if (a != 1) 
+    __builtin_abort (); 
+  return 0;
+}
index d4aaf42b2a5f0eada943dfbfa40a8f39ff155b7b..e3b6f1dd6a37c777255accac193f01a6deb1a759 100644 (file)
@@ -849,6 +849,10 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
          && !POINTER_TYPE_P (TREE_TYPE (arg0))))
     return 0;
 
+  /* Only transform if it removes the condition.  */
+  if (!single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)), e0, e1))
+    return 0;
+
   /* Size-wise, this is always profitable.  */
   if (optimize_bb_for_speed_p (cond_bb)
       /* The special case is useless if it has a low probability.  */