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).