https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88873
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- Didn't yet help for the original testcase in the description. We RTL expand from vect__1.11_14 = MEM <vector(2) double> [(double *)&c]; vect__2.5_12 = MEM <vector(2) double> [(double *)&b]; vect__3.8_13 = MEM <vector(2) double> [(double *)&a]; vect__4.12_15 = .FMA (vect__2.5_12, vect__3.8_13, vect__1.11_14); MEM <vector(2) double> [(double *)&D.4349] = vect__4.12_15; return D.4349; and get (insn 2 21 3 2 (set (reg:DF 91) (reg:DF 20 xmm0 [ a ])) "t.c":8:1 -1 (nil)) (insn 3 2 4 2 (set (reg:DF 92) (reg:DF 21 xmm1 [ a+8 ])) "t.c":8:1 -1 (nil)) (insn 4 3 5 2 (set (reg:TI 90) (const_int 0 [0])) "t.c":8:1 -1 (nil)) (insn 5 4 6 2 (set (subreg:DF (reg:TI 90) 0) (reg:DF 91)) "t.c":8:1 -1 (nil)) (insn 6 5 7 2 (set (subreg:DF (reg:TI 90) 8) (reg:DF 92)) "t.c":8:1 -1 (nil)) (insn 7 6 8 2 (set (reg/v:TI 89 [ a ]) (reg:TI 90)) "t.c":8:1 -1 (nil)) ... (insn 23 20 24 2 (set (reg:V2DF 85 [ vect__4.12 ]) (fma:V2DF (subreg:V2DF (reg/v:TI 93 [ b ]) 0) (subreg:V2DF (reg/v:TI 89 [ a ]) 0) (subreg:V2DF (reg/v:TI 97 [ c ]) 0))) "t.c":9:18 -1 (nil)) so the ABI passess struct s_t in two %xmm regs but the backend gives it TImode. Nothing cleans this up, we end up with horrible code in the end. The subreg pass is likely "confused" by the V2DFmode subreg of the TImode pseudos, maybe it needs to learn to turn the TImode pseudo into a V2DFmode one ...