Hi,
df_mw_compare tries to order df_mw_hardreg structures lexicographically, but
the last comparison step wrongly tests one field (mw_reg) while subtracting
another (mw_order). This makes the comparison non-transitive.
Fix this by simply returning difference of mw_order.
Patch pre-approved by Richi in the Bugzilla, bootstrapped on x86_64, applied.
Alexander
PR rtl-optimization/86096
* df-scan.c (df_mw_compare): Do not check mw_reg fields when
comparing mw_order values.
--- a/gcc/df-scan.c
+++ b/gcc/df-scan.c
@@ -2208,10 +2208,7 @@ df_mw_compare (const df_mw_hardreg *mw1, const
df_mw_hardreg *mw2)
if (mw1->end_regno != mw2->end_regno)
return mw1->end_regno - mw2->end_regno;
- if (mw1->mw_reg != mw2->mw_reg)
- return mw1->mw_order - mw2->mw_order;
-
- return 0;
+ return mw1->mw_order - mw2->mw_order;
}
/* Like df_mw_compare, but compare two df_mw_hardreg** pointers R1 and R2. */