https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71114
--- Comment #13 from Ilya Enkovich <ienkovich at gcc dot gnu.org> --- Looks I found the problem. validize_mem generates new instructions which are placed wrongly. This patch should help. Unfortunately I can't test it properly on Darwin. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 046717b..5fdd12b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3688,7 +3688,13 @@ dimode_scalar_chain::convert_op (rtx *op, rtx_insn *insn) gen_rtvec (2, *op, const0_rtx)); if (!standard_sse_constant_p (vec_cst, V2DImode)) - vec_cst = validize_mem (force_const_mem (V2DImode, vec_cst)); + { + start_sequence (); + vec_cst = validize_mem (force_const_mem (V2DImode, vec_cst)); + rtx_insn *seq = get_insns (); + end_sequence (); + emit_insn_before (insns, insn) + } emit_insn_before (gen_move_insn (tmp, vec_cst), insn); *op = tmp;