2006-09-05 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Sep 2006 08:39:42 +0000 (08:39 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Sep 2006 08:39:42 +0000 (08:39 +0000)
PR tree-optimization/28900
* tree-if-conv.c (find_phi_replacement_condition): Gimplify
compound conditional before creating COND_EXPR condition.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116697 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 30a49bb..ba5a9e0 100644 (file)
@@ -1,5 +1,11 @@
 2006-09-05  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/28900
+       * tree-if-conv.c (find_phi_replacement_condition): Gimplify
+       compound conditional before creating COND_EXPR condition.
+
+2006-09-05  Richard Guenther  <rguenther@suse.de>
+
        PR tree-optimization/28905
        * tree-vrp.c (fix_equivalence_set): Manually implement
        !value_ranges_intersect_p to also handle symbolic ranges.
index a1946dd..ac55cac 100644 (file)
@@ -1,5 +1,10 @@
 2006-09-05  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/28900
+       * gcc.dg/torture/pr28900.c: New testcase
+
+2006-09-05  Richard Guenther  <rguenther@suse.de>
+
        PR tree-optimization/28905
        * gcc.c-torture/compile/pr28905.c: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr28900.c b/gcc/testsuite/gcc.dg/torture/pr28900.c
new file mode 100644 (file)
index 0000000..75555f4
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-ftree-vectorize" } */
+
+int synths_ ( float * rc)
+{
+  float r1, r2;
+  int i;
+  for (i = 0; i < 128; ++i)
+    {
+      r2 = rc[i];
+      r1 = ((r2) <= (.99f) ? (r2) : (.99f));
+      rc[i] = ((r1) >= (-.99f) ? (r1) : (-.99f));
+    }
+}
+
index ecd1368..6e16a40 100644 (file)
@@ -666,7 +666,7 @@ find_phi_replacement_condition (struct loop *loop,
 {
   basic_block first_bb = NULL;
   basic_block second_bb = NULL;
-  tree tmp_cond;
+  tree tmp_cond, new_stmts;
 
   gcc_assert (EDGE_COUNT (bb->preds) == 2);
   first_bb = (EDGE_PRED (bb, 0))->src;
@@ -732,6 +732,9 @@ find_phi_replacement_condition (struct loop *loop,
      value as condition. Various targets use different means to communicate
      condition in vector compare operation. Using gimple value allows compiler
      to emit vector compare and select RTL without exposing compare's result.  */
+  *cond = force_gimple_operand (*cond, &new_stmts, false, NULL_TREE);
+  if (new_stmts)
+    bsi_insert_before (bsi, new_stmts, BSI_SAME_STMT);
   if (!is_gimple_reg (*cond) && !is_gimple_condexpr (*cond))
     {
       tree new_stmt;