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.

Reply via email to