This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR28900, non-gimple from tree-ifcvt
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 3 Sep 2006 16:30:33 +0200 (CEST)
- Subject: [PATCH] Fix PR28900, non-gimple from tree-ifcvt
This fixes PR28900 by ensuring to properly gimplify trees created
by collecting conditions.
Bootstrapped and tested on x86_64-unknown-linux-gnu.
Ok for mainline?
Thanks,
Richard.
:ADDPATCH middle-end:
2006-09-03 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
Index: tree-if-conv.c
===================================================================
*** tree-if-conv.c (revision 116660)
--- tree-if-conv.c (working copy)
*************** find_phi_replacement_condition (struct l
*** 666,672 ****
{
basic_block first_bb = NULL;
basic_block second_bb = NULL;
! tree tmp_cond;
gcc_assert (EDGE_COUNT (bb->preds) == 2);
first_bb = (EDGE_PRED (bb, 0))->src;
--- 666,672 ----
{
basic_block first_bb = NULL;
basic_block second_bb = NULL;
! tree tmp_cond, new_stmts;
gcc_assert (EDGE_COUNT (bb->preds) == 2);
first_bb = (EDGE_PRED (bb, 0))->src;
*************** find_phi_replacement_condition (struct l
*** 732,737 ****
--- 732,740 ----
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;
Index: testsuite/gcc.dg/torture/pr28900.c
===================================================================
*** testsuite/gcc.dg/torture/pr28900.c (revision 0)
--- testsuite/gcc.dg/torture/pr28900.c (revision 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));
+ }
+ }
+