[Bug rtl-optimization/63483] Scheduler performs Invalid move of aliased memory reference

ubizjak at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Oct 8 08:44:00 GMT 2014


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63483

--- Comment #3 from Uroš Bizjak <ubizjak at gmail dot com> ---
The patched compiler creates prevents scheduler to move "unchanging" reference
over possibly aliasing memory:

    7: r74:QI=0x1
    5: r73:DI=`a'
   14: r79:DI=`b'
    6: r72:DI=[r73:DI]
      REG_DEAD r73:DI
    9: r75:DI=r72:DI+0x1
    8: r76:DI=[r72:DI+0x1&0xfffffffffffffff8]
   11: r77:DI=zero_extend(r74:QI)<<r75:DI<<0x3
      REG_DEAD r75:DI
      REG_EQUAL 0x1<<r75:DI<<0x3
   10: r76:DI=!0xff<<r75:DI<<0x3&r76:DI
   12: r77:DI=r77:DI|r76:DI
      REG_DEAD r76:DI
   13: [r72:DI+0x1&0xfffffffffffffff8]=r77:DI
      REG_DEAD r77:DI
      REG_DEAD r72:DI
   15: r78:DI=[r79:DI]
      REG_DEAD r79:DI
   18: r81:DI=r78:DI+0x2
   17: r82:DI=[r78:DI+0x2&0xfffffffffffffff8]
   20: r83:DI=zero_extend(r74:QI)<<r81:DI<<0x3
      REG_DEAD r81:DI
      REG_DEAD r74:QI
      REG_EQUAL 0x1<<r81:DI<<0x3
   19: r82:DI=!0xff<<r81:DI<<0x3&r82:DI
   21: r83:DI=r83:DI|r82:DI
      REG_DEAD r82:DI
   22: [r78:DI+0x2&0xfffffffffffffff8]=r83:DI
      REG_DEAD r83:DI
      REG_DEAD r78:DI
   25: NOTE_INSN_DELETED

which results in:

$foo..ng:
        .prologue 1
        lda $1,1($31)    # 7    *movqi/2        [length = 4]
        lda $2,a         # 5    *movdi/7        [length = 4]
        ldq $2,0($2)     # 6    *movdi/8        [length = 4]
        bis $31,$31,$31  # 34   nop     [length = 4]
        lda $5,1($2)     # 9    *adddi_internal/2       [length = 4]
        ldq_u $4,1($2)   # 8    *movdi/8        [length = 4]
        insbl $1,$5,$3   # 11   insbl   [length = 4]
        mskbl $4,$5,$4   # 10   mskxl   [length = 4]
        bis $3,$4,$3     # 12   iordi3/1        [length = 4]
        stq_u $3,1($2)   # 13   *movdi/9        [length = 4]
        lda $2,b         # 26   *movdi/7        [length = 4]
        ldq $2,0($2)     # 15   *movdi/8        [length = 4]
        lda $4,2($2)     # 18   *adddi_internal/2       [length = 4]
        ldq_u $3,2($2)   # 17   *movdi/8        [length = 4]
        insbl $1,$4,$1   # 20   insbl   [length = 4]
        mskbl $3,$4,$3   # 19   mskxl   [length = 4]
        bis $1,$3,$1     # 21   iordi3/1        [length = 4]
        stq_u $1,2($2)   # 22   *movdi/9        [length = 4]
        ret $31,($26),1  # 33   *return_internal        [length = 4]
        .end foo

e.g. (insn 15) stays after possibly aliasing (insn 13).


More information about the Gcc-bugs mailing list