https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91767
--- Comment #5 from Dimitry Andric <dimitry at andric dot com> --- Hmm, it appears that this diff "fixes" it: diff --git a/gcc/config/i386/i386-features.c b/gcc/config/i386/i386-features.c index 9505b4a1330..091a59f3cb9 100644 --- a/gcc/config/i386/i386-features.c +++ b/gcc/config/i386/i386-features.c @@ -1166,7 +1166,11 @@ general_scalar_chain::convert_registers () bitmap_iterator bi; unsigned id; EXECUTE_IF_SET_IN_BITMAP (defs_conv, 0, id, bi) - defs_map.put (regno_reg_rtx[id], gen_reg_rtx (smode)); + { + rtx key = regno_reg_rtx[id]; + rtx val = gen_reg_rtx (smode); + defs_map.put (key, val); + } EXECUTE_IF_SET_IN_BITMAP (insns_conv, 0, id, bi) for (df_ref ref = DF_INSN_UID_DEFS (id); ref; ref = DF_REF_NEXT_LOC (ref)) if (bitmap_bit_p (defs_conv, DF_REF_REGNO (ref))) but obviously that can't be right, unless gen_reg_rtx() is doing something horrible to regno_reg_rtx[]. I only see it adding another element at the end, though. I think this might indeed be some clang code generation bug, as the assembly looks a little different with the above patch applied. Digging further...