https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61594
Patrick Marlier <patrick.marlier at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |aldyh at gcc dot gnu.org, | |rth at gcc dot gnu.org --- Comment #2 from Patrick Marlier <patrick.marlier at gmail dot com> --- In requires_barrier, the tree is a TARGET_MEM_REF and the operand is a STRING_CST. Because STRING_CST is constant and cannot be modified, it does not need a barrier. So this could be solved like this: Index: gcc/trans-mem.c =================================================================== --- gcc/trans-mem.c (revision 212229) +++ gcc/trans-mem.c (working copy) @@ -1512,7 +1512,7 @@ requires_barrier (basic_block entry_block, tree x, if (TREE_CODE (TMR_BASE (x)) != ADDR_EXPR) return true; x = TREE_OPERAND (TMR_BASE (x), 0); - if (TREE_CODE (x) == PARM_DECL) + if (TREE_CODE (x) == PARM_DECL || TREE_CODE (x) == STRING_CST) return false; gcc_assert (TREE_CODE (x) == VAR_DECL); /* FALLTHRU */ However I think that we should not instrument for all constants (INTEGER_CST, ...) and even for read-only. So I would prefer solving the issue like this: Index: gcc/trans-mem.c =================================================================== --- gcc/trans-mem.c (revision 212229) +++ gcc/trans-mem.c (working copy) @@ -1512,7 +1512,7 @@ requires_barrier (basic_block entry_block, tree x, if (TREE_CODE (TMR_BASE (x)) != ADDR_EXPR) return true; x = TREE_OPERAND (TMR_BASE (x), 0); - if (TREE_CODE (x) == PARM_DECL) + if (TREE_CODE (x) == PARM_DECL || TREE_CONSTANT (x) || TREE_READONLY (x)) return false; gcc_assert (TREE_CODE (x) == VAR_DECL); /* FALLTHRU */ Note that 4.8 is also affected.