mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-12 14:04:22 +08:00
re PR tree-optimization/27373 (ICE: add_virtual_operand with pointers to arrays)
2006-05-16 Daniel Berlin <dberlin@dberlin.org> Fix PR tree-optimization/27373 * tree-ssa-forwprop.c: (forward_propagate_addr_expr_1): Add argument. (forward_propagate_addr_expr): Update call. From-SVN: r113840
This commit is contained in:
parent
ada22a8299
commit
2ed4b0ce33
@ -1,3 +1,9 @@
|
||||
2006-05-16 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
Fix PR tree-optimization/27373
|
||||
* tree-ssa-forwprop.c: (forward_propagate_addr_expr_1): Add argument.
|
||||
(forward_propagate_addr_expr): Update call.
|
||||
|
||||
2006-05-16 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* doc/options.texi: Move the Negative option.
|
||||
|
40
gcc/testsuite/gcc.c-torture/compile/pr27373.c
Normal file
40
gcc/testsuite/gcc.c-torture/compile/pr27373.c
Normal file
@ -0,0 +1,40 @@
|
||||
typedef struct atype
|
||||
{
|
||||
float bg[1], cg[1];
|
||||
_Bool ant;
|
||||
}atype;
|
||||
|
||||
|
||||
void cp_assert(_Bool*, float*, int*, _Bool*);
|
||||
|
||||
void f(atype **rng_stream, int *error, float u)
|
||||
{
|
||||
_Bool t = *rng_stream != 0;
|
||||
float routinep;
|
||||
_Bool failure;
|
||||
cp_assert ( &t, &routinep, error, &failure);
|
||||
if (failure == 0)
|
||||
{
|
||||
typedef float ty[1];
|
||||
ty *tt = &((*rng_stream)->bg);
|
||||
int i = 1;
|
||||
|
||||
do
|
||||
{
|
||||
(*tt)[i - 1] = u;
|
||||
i ++;
|
||||
}while (i > 1);
|
||||
{
|
||||
ty *tt = &(*rng_stream)->cg;
|
||||
int i = 1;
|
||||
|
||||
do
|
||||
{
|
||||
(*tt)[i - 1] = u;
|
||||
i ++;
|
||||
}while (i > 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -663,10 +663,15 @@ forward_propagate_addr_into_variable_array_index (tree offset, tree lhs,
|
||||
Try to forward propagate the ADDR_EXPR into the use USE_STMT.
|
||||
Often this will allow for removal of an ADDR_EXPR and INDIRECT_REF
|
||||
node or for recovery of array indexing from pointer arithmetic.
|
||||
Return true, if the propagation was successful. */
|
||||
|
||||
CHANGED is an optional pointer to a boolean variable set to true if
|
||||
either the LHS or RHS was changed in the USE_STMT.
|
||||
|
||||
Return true if the propagation was successful (the propagation can
|
||||
be not totally successful, yet things may have been changed). */
|
||||
|
||||
static bool
|
||||
forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
|
||||
forward_propagate_addr_expr_1 (tree stmt, tree use_stmt, bool *changed)
|
||||
{
|
||||
tree name = TREE_OPERAND (stmt, 0);
|
||||
tree lhs, rhs, array_ref;
|
||||
@ -686,6 +691,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
|
||||
TREE_OPERAND (lhs, 0) = unshare_expr (TREE_OPERAND (stmt, 1));
|
||||
fold_stmt_inplace (use_stmt);
|
||||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
if (changed)
|
||||
*changed = true;
|
||||
}
|
||||
|
||||
/* Trivial case. The use statement could be a trivial copy. We
|
||||
@ -699,6 +706,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
|
||||
{
|
||||
TREE_OPERAND (use_stmt, 1) = unshare_expr (TREE_OPERAND (stmt, 1));
|
||||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
if (changed)
|
||||
*changed = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -719,6 +728,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
|
||||
TREE_OPERAND (rhs, 0) = unshare_expr (TREE_OPERAND (stmt, 1));
|
||||
fold_stmt_inplace (use_stmt);
|
||||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
if (changed)
|
||||
*changed = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -751,6 +762,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
|
||||
if (fold_stmt_inplace (use_stmt))
|
||||
{
|
||||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
if (changed)
|
||||
*changed = true;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@ -771,9 +784,14 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
|
||||
different type than their operands. */
|
||||
&& lang_hooks.types_compatible_p (TREE_TYPE (name), TREE_TYPE (rhs)))
|
||||
{
|
||||
bool res;
|
||||
tree offset_stmt = SSA_NAME_DEF_STMT (TREE_OPERAND (rhs, 1));
|
||||
return forward_propagate_addr_into_variable_array_index (offset_stmt, lhs,
|
||||
stmt, use_stmt);
|
||||
|
||||
res = forward_propagate_addr_into_variable_array_index (offset_stmt, lhs,
|
||||
stmt, use_stmt);
|
||||
if (res && changed)
|
||||
*changed = true;
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Same as the previous case, except the operands of the PLUS_EXPR
|
||||
@ -784,9 +802,13 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
|
||||
different type than their operands. */
|
||||
&& lang_hooks.types_compatible_p (TREE_TYPE (name), TREE_TYPE (rhs)))
|
||||
{
|
||||
bool res;
|
||||
tree offset_stmt = SSA_NAME_DEF_STMT (TREE_OPERAND (rhs, 0));
|
||||
return forward_propagate_addr_into_variable_array_index (offset_stmt, lhs,
|
||||
stmt, use_stmt);
|
||||
res = forward_propagate_addr_into_variable_array_index (offset_stmt, lhs,
|
||||
stmt, use_stmt);
|
||||
if (res && changed)
|
||||
*changed = true;
|
||||
return res;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -830,9 +852,8 @@ forward_propagate_addr_expr (tree stmt, bool *some)
|
||||
continue;
|
||||
}
|
||||
|
||||
result = forward_propagate_addr_expr_1 (stmt, use_stmt);
|
||||
if (some)
|
||||
*some |= result;
|
||||
result = forward_propagate_addr_expr_1 (stmt, use_stmt, some);
|
||||
*some |= result;
|
||||
all &= result;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user