https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84711
--- Comment #9 from Tamar Christina <tnfchris at gcc dot gnu.org> --- Hi Christophhe, This seems to be a combine issue. It thinks that (set (reg/i:SF 16 s0) (vec_select:SF (reg:V4SF 16 s0 [ xD.6085 ]) (parallel [ (const_int 0 [0]) ]))) is a no-op while it doesn't think that (set (reg/i:SF 16 s0) (vec_select:SF (reg:V4SF 16 s0 [ xD.6082 ]) (parallel [ (const_int 3 [0x3]) ]))) is. It's removing the instruction and there doesn't seem to be anyway for the backend to tell it not to. The reason it worked before seem to be that we were telling it any subreg under big-endian is invalid, so the big-endian code would skip this no-op check. Marking the destination register as a use (use (match_dup 0)) seems to make it skip the first no-op check but later deletes it anyway. So I see no way around this without a mid-end change. As such I will revert the commit for GCC 8.