https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63375
--- Comment #4 from Martin Jambor <jamborm at gcc dot gnu.org> ---
SRA is indeed quite guilty, the following patch fixes it:
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 8259dba..fb24114 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1064,6 +1064,11 @@ build_access_from_expr_1 (tree expr, gimple stmt, bool
write)
"component.");
return NULL;
}
+ if (TREE_THIS_VOLATILE (expr))
+ {
+ disqualify_base_of_expr (expr, "part of a volatile reference.");
+ return NULL;
+ }
switch (TREE_CODE (expr))
{
Nevertheless, it is apparently not the only culprit. Even on trunk
with -fno-tree-sra we produce exactly the same assembly output. From
a brief look at the dumps it seems that RTL fwprop1 is the pass moving
the load, however I have not had a look if it is its fault or if
expansion looses the volatility information somehow.