[Bug tree-optimization/38645] [4.4 Regression] ICE with volatile
jamborm at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Dec 30 16:59:00 GMT 2008
------- Comment #3 from jamborm at gcc dot gnu dot org 2008-12-30 16:58 -------
I discussed this bug with Richi on IRC and was told that we should
avoid having the statement marked as volatile since it is not an
access through a volatile variable in the original source code.
Instead, we should try preventing the propagation of &a to uses of p.
The patch is below, it prevents ccp and dom1 from carrying out the
propagation. However, fwprop does this propagation, albeit using a
VIEW_CONVERT_EXP and, moreover, fold_stmt_inplace() it calls marks the
statement volatile anyway. This propagation is performed because
fwprop checks types (not decls) for volatility and apparently the type
of a is not volatile (as opposed to a[0] which probably is).
The declaration of a is volatile though. However, when I changed it
to check the declaration, nrv pass did the propagation, creating
invalid gimple along the way. Because the such change would possibly
be incorrect it is not included below. Anyway, the test case with
this patch compiles ans it is possibly slightly more correct, though
the final result is not all that different.
2008-12-30 Martin Jambor <mjambor@suse.cz>
* tree-ssa-dom.c (cprop_operand): Always check the return value of
may_propagate_copy.
* tree-ssa-copy.c (may_propagate_copy): Do not allow propagation
of addresses of volatile declarations.
Index: gcc/tree-ssa-dom.c
===================================================================
--- gcc/tree-ssa-dom.c (revision 142962)
+++ gcc/tree-ssa-dom.c (working copy)
@@ -2092,7 +2092,7 @@ cprop_operand (gimple stmt, use_operand_
/* 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 copies if the propagated value is at a deeper loop
Index: gcc/tree-ssa-copy.c
===================================================================
--- gcc/tree-ssa-copy.c (revision 142962)
+++ gcc/tree-ssa-copy.c (working copy)
@@ -73,6 +73,15 @@ may_propagate_copy (tree dest, tree orig
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest))
return false;
+ if (TREE_CODE (orig) == ADDR_EXPR)
+ {
+ tree base = TREE_OPERAND (orig, 0);
+ while (handled_component_p (base))
+ base = TREE_OPERAND (base, 0);
+ if (TREE_THIS_VOLATILE (base))
+ return false;
+ }
+
/* For memory partitions, copies are OK as long as the memory symbol
belongs to the partition. */
if (TREE_CODE (dest) == SSA_NAME
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38645
More information about the Gcc-bugs
mailing list