https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71372
--- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
On the C++ cp_fold side, I think
--- cp-gimplify.c.jj1 2016-05-26 10:38:01.000000000 +0200
+++ cp-gimplify.c 2016-06-02 10:21:33.903655321 +0200
@@ -2035,7 +2035,16 @@ cp_fold (tree x)
if (op0 == error_mark_node)
x = error_mark_node;
else
- x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
+ {
+ x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
+ if (code == INDIRECT_REF
+ && (INDIRECT_REF_P (x) || TREE_CODE (x) == MEM_REF))
+ {
+ TREE_READONLY (x) = TREE_READONLY (org_x);
+ TREE_SIDE_EFFECTS (x) = TREE_SIDE_EFFECTS (org_x);
+ TREE_THIS_VOLATILE (x) = TREE_THIS_VOLATILE (org_x);
+ }
+ }
}
else
x = fold (x);
@@ -2312,7 +2321,12 @@ cp_fold (tree x)
|| op3 == error_mark_node)
x = error_mark_node;
else
- x = build4_loc (loc, code, TREE_TYPE (x), op0, op1, op2, op3);
+ {
+ x = build4_loc (loc, code, TREE_TYPE (x), op0, op1, op2, op3);
+ TREE_READONLY (x) = TREE_READONLY (org_x);
+ TREE_SIDE_EFFECTS (x) = TREE_SIDE_EFFECTS (org_x);
+ TREE_THIS_VOLATILE (x) = TREE_THIS_VOLATILE (org_x);
+ }
}
x = fold (x);
could be enough, at least I don't see folding of any other *_REF right now.
In the C FE, I wonder if fold or fold_build1_loc can turn INDIRECT_REF into
MEM_REF, if yes, then it would be wrong. Also for COMPONENT_REF the C FE
doesn't copy TREE_SIDE_EFFECTS bit, that might be incorrect if it copies
TREE_THIS_VOLATILE?
And, for C++ I'm missing e.g. any kind of folding of COMPONENT_REF, that is
really strange. In fold_builtin_arith_overflow, I guess we also fail to add
TREE_THIS_VOLATILE/TREE_SIDE_EFFECTS if the pointer points to volatile type.
Plus fold...