diff options
author | Richard Guenther <rguenther@suse.de> | 2008-12-30 21:20:08 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-12-30 21:20:08 +0000 |
commit | 66e8b99c2aa6f09af3151d972da33d15e09a8d75 (patch) | |
tree | c2715b7747017c8deeb4499cf75d222f6d9a931a /gcc/tree-ssa-dom.c | |
parent | c13edb6795a08b73e7d82b5d81fd443deb2b72b4 (diff) | |
download | gcc-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.c | 40 |
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 |