Commit 2ed4b0ce by Daniel Berlin Committed by Daniel Berlin

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
parent ada22a82
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> 2006-05-16 H.J. Lu <hongjiu.lu@intel.com>
* doc/options.texi: Move the Negative option. * doc/options.texi: Move the Negative option.
......
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, ...@@ -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. 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 Often this will allow for removal of an ADDR_EXPR and INDIRECT_REF
node or for recovery of array indexing from pointer arithmetic. 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 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 name = TREE_OPERAND (stmt, 0);
tree lhs, rhs, array_ref; tree lhs, rhs, array_ref;
...@@ -686,6 +691,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt) ...@@ -686,6 +691,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
TREE_OPERAND (lhs, 0) = unshare_expr (TREE_OPERAND (stmt, 1)); TREE_OPERAND (lhs, 0) = unshare_expr (TREE_OPERAND (stmt, 1));
fold_stmt_inplace (use_stmt); fold_stmt_inplace (use_stmt);
tidy_after_forward_propagate_addr (use_stmt); tidy_after_forward_propagate_addr (use_stmt);
if (changed)
*changed = true;
} }
/* Trivial case. The use statement could be a trivial copy. We /* 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) ...@@ -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)); TREE_OPERAND (use_stmt, 1) = unshare_expr (TREE_OPERAND (stmt, 1));
tidy_after_forward_propagate_addr (use_stmt); tidy_after_forward_propagate_addr (use_stmt);
if (changed)
*changed = true;
return true; return true;
} }
...@@ -719,6 +728,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt) ...@@ -719,6 +728,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
TREE_OPERAND (rhs, 0) = unshare_expr (TREE_OPERAND (stmt, 1)); TREE_OPERAND (rhs, 0) = unshare_expr (TREE_OPERAND (stmt, 1));
fold_stmt_inplace (use_stmt); fold_stmt_inplace (use_stmt);
tidy_after_forward_propagate_addr (use_stmt); tidy_after_forward_propagate_addr (use_stmt);
if (changed)
*changed = true;
return true; return true;
} }
...@@ -751,6 +762,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt) ...@@ -751,6 +762,8 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
if (fold_stmt_inplace (use_stmt)) if (fold_stmt_inplace (use_stmt))
{ {
tidy_after_forward_propagate_addr (use_stmt); tidy_after_forward_propagate_addr (use_stmt);
if (changed)
*changed = true;
return true; return true;
} }
else else
...@@ -771,9 +784,14 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt) ...@@ -771,9 +784,14 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
different type than their operands. */ different type than their operands. */
&& lang_hooks.types_compatible_p (TREE_TYPE (name), TREE_TYPE (rhs))) && lang_hooks.types_compatible_p (TREE_TYPE (name), TREE_TYPE (rhs)))
{ {
bool res;
tree offset_stmt = SSA_NAME_DEF_STMT (TREE_OPERAND (rhs, 1)); 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 /* 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) ...@@ -784,9 +802,13 @@ forward_propagate_addr_expr_1 (tree stmt, tree use_stmt)
different type than their operands. */ different type than their operands. */
&& lang_hooks.types_compatible_p (TREE_TYPE (name), TREE_TYPE (rhs))) && lang_hooks.types_compatible_p (TREE_TYPE (name), TREE_TYPE (rhs)))
{ {
bool res;
tree offset_stmt = SSA_NAME_DEF_STMT (TREE_OPERAND (rhs, 0)); tree offset_stmt = SSA_NAME_DEF_STMT (TREE_OPERAND (rhs, 0));
return forward_propagate_addr_into_variable_array_index (offset_stmt, lhs, res = forward_propagate_addr_into_variable_array_index (offset_stmt, lhs,
stmt, use_stmt); stmt, use_stmt);
if (res && changed)
*changed = true;
return res;
} }
return false; return false;
} }
...@@ -830,9 +852,8 @@ forward_propagate_addr_expr (tree stmt, bool *some) ...@@ -830,9 +852,8 @@ forward_propagate_addr_expr (tree stmt, bool *some)
continue; continue;
} }
result = forward_propagate_addr_expr_1 (stmt, use_stmt); result = forward_propagate_addr_expr_1 (stmt, use_stmt, some);
if (some) *some |= result;
*some |= result;
all &= result; all &= result;
} }
......
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