re PR tree-optimization/28900 (ICE verify_stmts failed (invalid operand to unary...
authorRichard Guenther <rguenther@suse.de>
Tue, 5 Sep 2006 08:39:42 +0000 (08:39 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 5 Sep 2006 08:39:42 +0000 (08:39 +0000)
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.

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

From-SVN: r116697

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

index 30a49bb379fed9dbd2677f60abf60b3e11e122db..ba5a9e0d2d0e04f2dbb3ebca3a50e4882f84ed0d 100644 (file)
@@ -1,3 +1,9 @@
+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
index a1946dddf419709e8de95778a390d515715119b9..ac55cac729d4a3d87854f2556b85927e0e79c4a2 100644 (file)
@@ -1,3 +1,8 @@
+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
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 ecd1368cd272384b98c999406df368a89ba863d8..6e16a40a9c360c0fd369acda0a444c5c8b20cb5e 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;