http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57896
--- Comment #22 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Uroš Bizjak from comment #21) > --- config/i386/i386.c (revision 207935) > +++ config/i386/i386.c (working copy) > @@ -40666,9 +40666,9 @@ ix86_vectorize_vec_perm_const_ok (enum machine_mod > if (!d.one_operand_p) > d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3); > > - start_sequence (); > + init_dummy_function_start (); > ret = ix86_expand_vec_perm_const_1 (&d); > - end_sequence (); > + expand_dummy_function_end (); > > return ret; > } > --cut here-- > > Jakub, what do you think about this patch? IMHO that is way too expensive. So, say expand_vec_perm_interleave2 is only called with d->testing_p from ix86_vectorize_vec_perm_const_ok, and thus I'd say something like: if (!d->testing_p) { dremap.target = gen_reg_rtx (dremap.vmode); dfinal.op0 = gen_lowpart (dfinal.vmode, dremap.target); } dfinal.op1 = dfinal.op0; should fix expand_vec_perm_interleave2. I think dfinal.op0 should have dfinal.vmode already from the caller (we can easily perhaps gcc_checking_assert double check it when testing the patch).