https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91522
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- So in particular for (ref = DF_INSN_UID_DEFS (insn_uid); ref; ref = DF_REF_NEXT_LOC (ref)) if (!HARD_REGISTER_P (DF_REF_REG (ref))) for (def = DF_REG_DEF_CHAIN (DF_REF_REGNO (ref)); def; def = DF_REF_NEXT_REG (def)) analyze_register_chain (candidates, ref); looks odd since that iterates over all defs in insn_uid, then over all defs of that register everywhere else in the function and analyze_register_chain then iterating over the corresponding def->use chain. I'd say the iteration over all defs everywhere else is not necessary and it should be simply Index: config/i386/i386-features.c =================================================================== --- config/i386/i386-features.c (revision 274764) +++ config/i386/i386-features.c (working copy) @@ -419,10 +419,7 @@ scalar_chain::add_insn (bitmap candidate df_ref def; for (ref = DF_INSN_UID_DEFS (insn_uid); ref; ref = DF_REF_NEXT_LOC (ref)) if (!HARD_REGISTER_P (DF_REF_REG (ref))) - for (def = DF_REG_DEF_CHAIN (DF_REF_REGNO (ref)); - def; - def = DF_REF_NEXT_REG (def)) - analyze_register_chain (candidates, def); + analyze_register_chain (candidates, ref); for (ref = DF_INSN_UID_USES (insn_uid); ref; ref = DF_REF_NEXT_LOC (ref)) if (!DF_REF_REG_MEM_P (ref)) analyze_register_chain (candidates, ref); which fixes the slowness. I'm going to test that.