aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-dom.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-12-30 21:20:08 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-12-30 21:20:08 +0000
commit66e8b99c2aa6f09af3151d972da33d15e09a8d75 (patch)
treec2715b7747017c8deeb4499cf75d222f6d9a931a /gcc/tree-ssa-dom.c
parentc13edb6795a08b73e7d82b5d81fd443deb2b72b4 (diff)
downloadgcc-66e8b99c2aa6f09af3151d972da33d15e09a8d75.zip
gcc-66e8b99c2aa6f09af3151d972da33d15e09a8d75.tar.gz
gcc-66e8b99c2aa6f09af3151d972da33d15e09a8d75.tar.bz2
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
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r--gcc/tree-ssa-dom.c40
1 files changed, 10 insertions, 30 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index bf2049e..6d6d02b 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -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