re PR tree-optimization/38645 (ICE with volatile)

2008-12-30  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/38645
	* tree-ssa-ccp.c (fold_gimple_assign): Use the correct pointer
	type.
	* tree-ssa-dom.c (cprop_operand): Simplify.  Do not propagate
	volatileness changing operands.

	* gcc.dg/pr38645.c: New testcase.

From-SVN: r142967
This commit is contained in:
Richard Guenther 2008-12-30 21:20:08 +00:00 committed by Richard Biener
parent c13edb6795
commit 66e8b99c2a
5 changed files with 53 additions and 34 deletions

View File

@ -1,3 +1,11 @@
2008-12-30 Richard Guenther <rguenther@suse.de>
PR tree-optimization/38645
* tree-ssa-ccp.c (fold_gimple_assign): Use the correct pointer
type.
* tree-ssa-dom.c (cprop_operand): Simplify. Do not propagate
volatileness changing operands.
2008-12-30 Steven Bosscher <steven@gcc.gnu.org>
* tree-cfg.c (verify_eh_throw_stmt_node): Return nonzero,

View File

@ -1,3 +1,8 @@
2008-12-30 Richard Guenther <rguenther@suse.de>
PR tree-optimization/38645
* gcc.dg/pr38645.c: New testcase.
2008-12-30 Andrew Pinski <pinskia@gmail.com>
PR middle-end/38661

View File

@ -0,0 +1,17 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
int foo()
{
volatile int a[1];
int i, *p = (int*)a;
a[0] = 1;
for (i = 0; i < 1; ++i)
if (p[i])
return -1;
return 0;
}
/* { dg-final { scan-tree-dump "a.0. ={v} 1;" "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */

View File

@ -2720,10 +2720,19 @@ fold_gimple_assign (gimple_stmt_iterator *si)
case GIMPLE_BINARY_RHS:
/* Try to fold pointer addition. */
if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR)
result = maybe_fold_stmt_addition (
TREE_TYPE (gimple_assign_lhs (stmt)),
gimple_assign_rhs1 (stmt),
gimple_assign_rhs2 (stmt));
{
tree type = TREE_TYPE (gimple_assign_rhs1 (stmt));
if (TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
{
type = build_pointer_type (TREE_TYPE (TREE_TYPE (type)));
if (!useless_type_conversion_p
(TREE_TYPE (gimple_assign_lhs (stmt)), type))
type = TREE_TYPE (gimple_assign_rhs1 (stmt));
}
result = maybe_fold_stmt_addition (type,
gimple_assign_rhs1 (stmt),
gimple_assign_rhs2 (stmt));
}
if (!result)
result = fold_binary (subcode,

View File

@ -2045,8 +2045,6 @@ cprop_operand (gimple stmt, use_operand_p op_p)
val = SSA_NAME_VALUE (op);
if (val && val != op)
{
tree op_type, val_type;
/* Do not change the base variable in the virtual operand
tables. That would make it impossible to reconstruct
the renamed virtual operand if we later modify this
@ -2063,38 +2061,20 @@ cprop_operand (gimple stmt, use_operand_p op_p)
&& !may_propagate_copy_into_asm (op))
return false;
/* Get the toplevel type of each operand. */
op_type = TREE_TYPE (op);
val_type = TREE_TYPE (val);
/* While both types are pointers, get the type of the object
pointed to. */
while (POINTER_TYPE_P (op_type) && POINTER_TYPE_P (val_type))
{
op_type = TREE_TYPE (op_type);
val_type = TREE_TYPE (val_type);
}
/* Make sure underlying types match before propagating a constant by
converting the constant to the proper type. Note that convert may
return a non-gimple expression, in which case we ignore this
propagation opportunity. */
if (TREE_CODE (val) != SSA_NAME)
{
if (!useless_type_conversion_p (op_type, val_type))
{
val = fold_convert (TREE_TYPE (op), val);
if (!is_gimple_min_invariant (val))
return false;
}
}
/* Certain operands are not allowed to be copy propagated due
to their interaction with exception handling and some GCC
extensions. */
else if (!may_propagate_copy (op, val))
if (!may_propagate_copy (op, val))
return false;
/* Do not propagate addresses that point to volatiles into memory
stmts without volatile operands. */
if (POINTER_TYPE_P (TREE_TYPE (val))
&& TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (val)))
&& gimple_has_mem_ops (stmt)
&& !gimple_has_volatile_ops (stmt))
return false;
/* Do not propagate copies if the propagated value is at a deeper loop
depth than the propagatee. Otherwise, this may move loop variant
variables outside of their loops and prevent coalescing