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

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #3)
> Yes, it looks very very similar.
> 
> In peephole2 the redundant load/store pair keeping the = 2 store data
> dependent on the later load vanishes (with -fdisable-rtl-combine, otherwise
> combine deletes it, see PR101641).  Then sched2 comes along and
> breaks things.
> 
> So, -fdisable-rtl-combine -fdisable-rtl-peephole2 fixes this.  Let's keep
> this instance of the bug for the peephole2 bug.  These kind of peepholes
> might not apply before scheduling at least - in reality after such
> patterns -fno-strict-aliasing should be enforced.
> 
> ;; Attempt to optimize away memory stores of values the memory already
> ;; has.  See PR79593.
> (define_peephole2
>   [(set (match_operand 0 "register_operand")
>         (match_operand 1 "memory_operand"))
>    (set (match_operand 2 "memory_operand") (match_dup 0))]
>   "!MEM_VOLATILE_P (operands[1])
>    && !MEM_VOLATILE_P (operands[2])
>    && rtx_equal_p (operands[1], operands[2])
>    && !reg_overlap_mentioned_p (operands[0], operands[2])"
>   [(set (match_dup 0) (match_dup 1))])

Possibly the following would fix it (not sure where to place the required
#include of alias.h)

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index e170da3b0e6..3cfb54abbd0 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -28489,6 +28489,7 @@
   "!MEM_VOLATILE_P (operands[1])
    && !MEM_VOLATILE_P (operands[2])
    && rtx_equal_p (operands[1], operands[2])
+   && mems_same_for_tbaa_p (operands[1], operands[2])
    && !reg_overlap_mentioned_p (operands[0], operands[2])"
   [(set (match_dup 0) (match_dup 1))])

Reply via email to