re PR tree-optimization/49073 (g++ optimizer breaks do-while code)
authorJakub Jelinek <jakub@redhat.com>
Fri, 20 May 2011 14:19:05 +0000 (16:19 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 20 May 2011 14:19:05 +0000 (16:19 +0200)
PR tree-optimization/49073
* gimple-fold.c (and_comparisons_1, or_comparisons_1): Return
NULL if PHI argument is SSA_NAME, whose def_stmt is dominated
by the PHI.
* tree-ssa-ifcombine.c (tree_ssa_ifcombine): Calculate dominators.

* gcc.c-torture/execute/pr49073.c: New test.

From-SVN: r173948

gcc/ChangeLog
gcc/gimple-fold.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr49073.c [new file with mode: 0644]
gcc/tree-ssa-ifcombine.c

index 3bd18b854b8fe078e4ca6af38c4a305e4f68b2f7..7a99c9133bf8e9800926b21630c04e8f1650d1cb 100644 (file)
@@ -1,3 +1,11 @@
+2011-05-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/49073
+       * gimple-fold.c (and_comparisons_1, or_comparisons_1): Return
+       NULL if PHI argument is SSA_NAME, whose def_stmt is dominated
+       by the PHI.
+       * tree-ssa-ifcombine.c (tree_ssa_ifcombine): Calculate dominators.
+
 2011-05-20  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/48849
index e5303e31f7e93bae2341cfff3d84ddbdc865af60..933a47b01066d9587dacc7d75772b6619e9cd527 100644 (file)
@@ -1,5 +1,5 @@
 /* Statement simplification on GIMPLE.
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
    Split out from tree-ssa-ccp.c.
 
 This file is part of GCC.
@@ -2278,8 +2278,19 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
                    }
                  else if (TREE_CODE (arg) == SSA_NAME)
                    {
-                     tree temp = and_var_with_comparison (arg, invert,
-                                                          code2, op2a, op2b);
+                     tree temp;
+                     gimple def_stmt = SSA_NAME_DEF_STMT (arg);
+                     /* In simple cases we can look through PHI nodes,
+                        but we have to be careful with loops.
+                        See PR49073.  */
+                     if (! dom_info_available_p (CDI_DOMINATORS)
+                         || gimple_bb (def_stmt) == gimple_bb (stmt)
+                         || dominated_by_p (CDI_DOMINATORS,
+                                            gimple_bb (def_stmt),
+                                            gimple_bb (stmt)))
+                       return NULL_TREE;
+                     temp = and_var_with_comparison (arg, invert, code2,
+                                                     op2a, op2b);
                      if (!temp)
                        return NULL_TREE;
                      else if (!result)
@@ -2728,8 +2739,19 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
                    }
                  else if (TREE_CODE (arg) == SSA_NAME)
                    {
-                     tree temp = or_var_with_comparison (arg, invert,
-                                                         code2, op2a, op2b);
+                     tree temp;
+                     gimple def_stmt = SSA_NAME_DEF_STMT (arg);
+                     /* In simple cases we can look through PHI nodes,
+                        but we have to be careful with loops.
+                        See PR49073.  */
+                     if (! dom_info_available_p (CDI_DOMINATORS)
+                         || gimple_bb (def_stmt) == gimple_bb (stmt)
+                         || dominated_by_p (CDI_DOMINATORS,
+                                            gimple_bb (def_stmt),
+                                            gimple_bb (stmt)))
+                       return NULL_TREE;
+                     temp = or_var_with_comparison (arg, invert, code2,
+                                                    op2a, op2b);
                      if (!temp)
                        return NULL_TREE;
                      else if (!result)
index c3a1f83e2ae7fa51fc1c290174da8d3bfe818bff..5e2bffedcc67920f59d6c7e8303962f07e6c6cd1 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/49073
+       * gcc.c-torture/execute/pr49073.c: New test.
+
 2011-06-19  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/18918
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr49073.c b/gcc/testsuite/gcc.c-torture/execute/pr49073.c
new file mode 100644 (file)
index 0000000..92b923b
--- /dev/null
@@ -0,0 +1,26 @@
+/* PR tree-optimization/49073 */
+
+extern void abort (void);
+int a[] = { 1, 2, 3, 4, 5, 6, 7 }, c;
+
+int
+main ()
+{
+  int d = 1, i = 1;
+  _Bool f = 0;
+  do
+    {
+      d = a[i];
+      if (f && d == 4)
+       {
+         ++c;
+         break;
+       }
+      i++;
+      f = (d == 3);
+    }
+  while (d < 7);
+  if (c != 1)
+    abort ();
+  return 0;
+}
index e23bb763d19bf98c344554aa0fdfdedd914a714a..9063bfdcd55db4c496678746cd7130d690e97f49 100644 (file)
@@ -1,5 +1,5 @@
 /* Combining of if-expressions on trees.
-   Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
    Contributed by Richard Guenther <rguenther@suse.de>
 
 This file is part of GCC.
@@ -625,6 +625,7 @@ tree_ssa_ifcombine (void)
   int i;
 
   bbs = blocks_in_phiopt_order ();
+  calculate_dominance_info (CDI_DOMINATORS);
 
   for (i = 0; i < n_basic_blocks - NUM_FIXED_BLOCKS; ++i)
     {