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.