OSDN Git Service

2012-04-13 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 13 Apr 2012 12:27:02 +0000 (12:27 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 13 Apr 2012 12:27:02 +0000 (12:27 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186417 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 67b638e..b33f326 100644 (file)
@@ -1,5 +1,12 @@
 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  Richard Guenther  <rguenther@suse.de>
+
        PR c/52862
        * convert.c (convert_to_pointer): Remove special-casing of
        zero.
index 865e676..0559adc 100644 (file)
@@ -1,5 +1,10 @@
 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/52862
        * gcc.dg/pr52862.c: New testcase.
 
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 ca9503f..9d09f0f 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);