Commit 46fbb29c by Steven Bosscher Committed by Steven Bosscher

re PR tree-optimization/23049 (ICE with -O3 -ftree-vectorize on 4.1.x)

2005-10-05  Steven Bosscher  <stevenb@suse.de>
gcc/
	PR tree-optimization/23049
	* tree-ssa-dom.c (thread_across_edge): Make sure that the condition
	of a COND_EXPR is folded before calling fold on the whole rhs of a
	conditional assignment.
	* doc/tree-ssa.texi: Update the GIMPLE grammar for a valid rhs to
	document that a COND_EXPR may appear there.

testsuite/
	* gcc.dg/pr23049.c: New test.

	* gcc.dg/ucnid-4.c: Fix test.

From-SVN: r104938
parent 36dd6d31
2005-10-05 Steven Bosscher <stevenb@suse.de>
PR tree-optimization/23049
* tree-ssa-dom.c (thread_across_edge): Make sure that the condition
of a COND_EXPR is folded before calling fold on the whole rhs of a
conditional assignment.
* doc/tree-ssa.texi: Update the GIMPLE grammar for a valid rhs to
document that a COND_EXPR may appear there.
2005-10-03 Diego Novillo <dnovillo@redhat.com>
PR 23445
......
......@@ -728,6 +728,10 @@ void f()
| RELOP
op0 -> val
op1 -> val
| COND_EXPR
op0 -> condition
op1 -> val
op2 -> val
@end smallexample
@node Annotations
......
2005-10-05 Steven Bosscher <stevenb@suse.de>
* gcc.dg/pr23049.c: New test.
* gcc.dg/ucnid-4.c: Fix test.
2005-10-03 Diego Novillo <dnovillo@redhat.com>
PR 23445
/* This was an ICE in fold where we tried to fold something like,
a = 0 == 0 ? 0 : 3988292384
after doing if-conversion for the vectorizer. Folding "0 == 0"
should have been done before calling fold on the whole rhs of
the above expression. */
/* { dg-do compile } */
/* { dg-options "-O3 -ftree-vectorize" } */
static unsigned short int crc_table[256];
void AC3_encode_init(void)
{
unsigned int c, n, k;
for(n=0; n<256; n++)
{
c = n << 8;
for (k = 0; k < 8; k++)
{
if (c & (1 << 15))
c = ((c << 1) & 0xffff) ^ (((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)) & 0xffff);
}
crc_table[n] = c;
}
}
/* { dg-do run */
/* { dg-do run } */
/* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "*" } { "" } } */
/* { dg-options "-std=c99 -fextended-identifiers" } */
void abort (void);
......
......@@ -666,7 +666,7 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e)
statements. This does not prevent threading through E->dest. */
for (bsi = bsi_start (e->dest); ! bsi_end_p (bsi); bsi_next (&bsi))
{
tree cached_lhs;
tree cached_lhs = NULL;
stmt = bsi_stmt (bsi);
......@@ -705,7 +705,7 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e)
else
{
/* Copy the operands. */
tree *copy;
tree *copy, pre_fold_expr;
ssa_op_iter iter;
use_operand_p use_p;
unsigned int num, i = 0;
......@@ -729,12 +729,31 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e)
/* Try to fold/lookup the new expression. Inserting the
expression into the hash table is unlikely to help
simplify anything later, so just query the hashtable. */
cached_lhs = fold (TREE_OPERAND (stmt, 1));
if (TREE_CODE (cached_lhs) != SSA_NAME
&& !is_gimple_min_invariant (cached_lhs))
cached_lhs = lookup_avail_expr (stmt, false);
Sadly, we have to handle conditional assignments specially
here, because fold expects all the operands of an expression
to be folded before the expression itself is folded, but we
can't just substitute the folded condition here. */
if (TREE_CODE (TREE_OPERAND (stmt, 1)) == COND_EXPR)
{
tree cond = COND_EXPR_COND (TREE_OPERAND (stmt, 1));
cond = fold (cond);
if (cond == boolean_true_node)
pre_fold_expr = COND_EXPR_THEN (TREE_OPERAND (stmt, 1));
else if (cond == boolean_false_node)
pre_fold_expr = COND_EXPR_ELSE (TREE_OPERAND (stmt, 1));
else
pre_fold_expr = TREE_OPERAND (stmt, 1);
}
else
pre_fold_expr = TREE_OPERAND (stmt, 1);
if (pre_fold_expr)
{
cached_lhs = fold (pre_fold_expr);
if (TREE_CODE (cached_lhs) != SSA_NAME
&& !is_gimple_min_invariant (cached_lhs))
cached_lhs = lookup_avail_expr (stmt, false);
}
/* Restore the statement's original uses/defs. */
i = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment