]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/52969 (ICE in in get_expr_operands, at tree-ssa-operands...
authorRichard Guenther <rguenther@suse.de>
Fri, 13 Apr 2012 12:22:16 +0000 (12:22 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 13 Apr 2012 12:22:16 +0000 (12:22 +0000)
2012-04-13  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/52969
* tree-if-conv.c (predicate_mem_writes): Properly gimplify
the condition for the COND_EXPR and handle predicate negation
by swapping the COND_EXPR arms.

* gcc.dg/torture/pr52969.c: New testcase.

From-SVN: r186416

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr52969.c [new file with mode: 0644]
gcc/tree-if-conv.c

index c42ce67354ae41d1a6e82d6e909a07cb16796a36..7eee86a9dccddbc33c3a00ba41a2a66d75d83929 100644 (file)
@@ -1,3 +1,10 @@
+2012-04-13  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/52969
+       * tree-if-conv.c (predicate_mem_writes): Properly gimplify
+       the condition for the COND_EXPR and handle predicate negation
+       by swapping the COND_EXPR arms.
+
 2012-04-13  Nick Clifton  <nickc@redhat.com>
 
        * config/rl78/rl78.c (rl78_devirt_pass): Remove use of
index 9abfbd3bded3dcdb5c69de0733cad89feb245291..f93259258af39e90a58b128bed51266d01aef2cf 100644 (file)
@@ -1,3 +1,8 @@
+2012-04-13  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/52969
+       * gcc.dg/torture/pr52969.c: New testcase.
+
 2012-04-13  Richard Guenther  <rguenther@suse.de>
 
        PR c/52549
diff --git a/gcc/testsuite/gcc.dg/torture/pr52969.c b/gcc/testsuite/gcc.dg/torture/pr52969.c
new file mode 100644 (file)
index 0000000..05331d9
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-ftree-loop-if-convert-stores" } */
+
+int a, b;
+float xsum[100];
+void foo (float *cluster)
+{
+  int j;
+  for (; a ; ++j) {
+      xsum[j] = cluster[j];
+      if (xsum[j] > 0)
+       xsum[j] = 0;
+  }
+  if (xsum[0])
+    b = 0;
+}
index 55616d57667dc803178813603127c05551ffdc4e..c86a4aa55bb8554923b85c9137bc50ccf5c32c95 100644 (file)
@@ -1543,11 +1543,19 @@ predicate_mem_writes (loop_p loop)
       gimple_stmt_iterator gsi;
       basic_block bb = ifc_bbs[i];
       tree cond = bb_predicate (bb);
+      bool swap;
       gimple stmt;
 
       if (is_true_predicate (cond))
        continue;
 
+      swap = false;
+      if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
+       {
+         swap = true;
+         cond = TREE_OPERAND (cond, 0);
+       }
+
       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        if ((stmt = gsi_stmt (gsi))
            && gimple_assign_single_p (stmt)
@@ -1559,6 +1567,15 @@ predicate_mem_writes (loop_p loop)
 
            lhs = ifc_temp_var (type, unshare_expr (lhs), &gsi);
            rhs = ifc_temp_var (type, unshare_expr (rhs), &gsi);
+           if (swap)
+             {
+               tree tem = lhs;
+               lhs = rhs;
+               rhs = tem;
+             }
+           cond = force_gimple_operand_gsi_1 (&gsi, unshare_expr (cond),
+                                              is_gimple_condexpr, NULL_TREE,
+                                              true, GSI_SAME_STMT);
            rhs = build3 (COND_EXPR, type, unshare_expr (cond), rhs, lhs);
            gimple_assign_set_rhs1 (stmt, ifc_temp_var (type, rhs, &gsi));
            update_stmt (stmt);