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
This commit is contained in:
parent
36dd6d31e4
commit
46fbb29c2e
@ -1,3 +1,12 @@
|
||||
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
|
||||
|
@ -1,3 +1,9 @@
|
||||
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
|
||||
|
26
gcc/testsuite/gcc.dg/pr23049.c
Normal file
26
gcc/testsuite/gcc.dg/pr23049.c
Normal file
@ -0,0 +1,26 @@
|
||||
/* 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;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
/* { 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;
|
||||
|
Loading…
Reference in New Issue
Block a user