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

--- Comment #2 from Alexander Monakov <amonakov at gcc dot gnu.org> ---
This is caused by overflowing subtraction in autopref_rank_for_schedule:

      if (!irrel1 && !irrel2)
        /* Sort memory references from lowest offset to the largest.  */
        r = data1->offset - data2->offset;

When offsets are arbitrary this pattern (anti-pattern?) is inappropriate for
producing a less/equal/greater comparison result. The following (or variants)
is safe:

diff --git a/gcc/haifa-sched.cc b/gcc/haifa-sched.cc
index 4efaa9445..11bf10645 100644
--- a/gcc/haifa-sched.cc
+++ b/gcc/haifa-sched.cc
@@ -5686,7 +5686,7 @@ autopref_rank_for_schedule (const rtx_insn *insn1, const
rtx_insn *insn2)

       if (!irrel1 && !irrel2)
        /* Sort memory references from lowest offset to the largest.  */
-       r = data1->offset - data2->offset;
+       r = (data1->offset > data2->offset) - (data1->offset < data2->offset);
       else if (write)
        /* Schedule "irrelevant" insns before memory stores to resolve
           as many producer dependencies of stores as possible.  */

Reply via email to