https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112366
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- _33 = (int) rd_27; ... _103 = _93 ^ _33; <--- use of _33 ... __asm__("" : "=r" rd_41 : "" tt2_40); _113 = {rd_27, rd_41}; vect__33.17_123 = (vector(2) int) _113; _133 = BIT_FIELD_REF <vect__33.17_123, 32, 0>; _42 = (int) rd_41; and here's the vector result of the conversion. The { rd_27, rd_41 } CTOR can appear only after the last scalar def but there are other uses of the components earlier. The other uses are not really constrained in any way, so the assert is bougs. I'll just remove it. Ideally we'd avoid having any scalar ops participating in the SLP that dominate any of the external defs (as traditionally external defs happen before the vector code, not interleaved as we have it here after we build operands from scalar defs from inside the vectorized region).