@@ -812,6 +812,69 @@ define <16 x i16> @mul_v16i16_neg9(<16 x i16> %a0) nounwind {
812812 ret <16 x i16 > %1
813813}
814814
815+ ; PR47422 - check mul-shl-add sequence expands to adds.
816+ define <16 x i16 > @madd_v16i16_3 (<16 x i16 > %a0 , <16 x i16 > %a1 ) nounwind {
817+ ; X86-SSE-LABEL: madd_v16i16_3:
818+ ; X86-SSE: # %bb.0:
819+ ; X86-SSE-NEXT: pushl %ebp
820+ ; X86-SSE-NEXT: movl %esp, %ebp
821+ ; X86-SSE-NEXT: andl $-16, %esp
822+ ; X86-SSE-NEXT: subl $16, %esp
823+ ; X86-SSE-NEXT: movdqa %xmm1, %xmm3
824+ ; X86-SSE-NEXT: paddw %xmm1, %xmm3
825+ ; X86-SSE-NEXT: paddw %xmm3, %xmm1
826+ ; X86-SSE-NEXT: movdqa %xmm0, %xmm3
827+ ; X86-SSE-NEXT: paddw %xmm0, %xmm3
828+ ; X86-SSE-NEXT: paddw %xmm2, %xmm0
829+ ; X86-SSE-NEXT: paddw %xmm3, %xmm0
830+ ; X86-SSE-NEXT: paddw 8(%ebp), %xmm1
831+ ; X86-SSE-NEXT: movl %ebp, %esp
832+ ; X86-SSE-NEXT: popl %ebp
833+ ; X86-SSE-NEXT: retl
834+ ;
835+ ; X64-SSE-LABEL: madd_v16i16_3:
836+ ; X64-SSE: # %bb.0:
837+ ; X64-SSE-NEXT: movdqa %xmm1, %xmm4
838+ ; X64-SSE-NEXT: paddw %xmm1, %xmm4
839+ ; X64-SSE-NEXT: movdqa %xmm0, %xmm5
840+ ; X64-SSE-NEXT: paddw %xmm0, %xmm5
841+ ; X64-SSE-NEXT: paddw %xmm2, %xmm0
842+ ; X64-SSE-NEXT: paddw %xmm5, %xmm0
843+ ; X64-SSE-NEXT: paddw %xmm3, %xmm1
844+ ; X64-SSE-NEXT: paddw %xmm4, %xmm1
845+ ; X64-SSE-NEXT: retq
846+ ;
847+ ; X64-XOP-LABEL: madd_v16i16_3:
848+ ; X64-XOP: # %bb.0:
849+ ; X64-XOP-NEXT: vpaddw %xmm0, %xmm0, %xmm2
850+ ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm3
851+ ; X64-XOP-NEXT: vpaddw %xmm3, %xmm3, %xmm4
852+ ; X64-XOP-NEXT: vextractf128 $1, %ymm1, %xmm5
853+ ; X64-XOP-NEXT: vpaddw %xmm5, %xmm3, %xmm3
854+ ; X64-XOP-NEXT: vpaddw %xmm3, %xmm4, %xmm3
855+ ; X64-XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm0
856+ ; X64-XOP-NEXT: vpaddw %xmm0, %xmm2, %xmm0
857+ ; X64-XOP-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
858+ ; X64-XOP-NEXT: retq
859+ ;
860+ ; X64-AVX2-LABEL: madd_v16i16_3:
861+ ; X64-AVX2: # %bb.0:
862+ ; X64-AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm2
863+ ; X64-AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0
864+ ; X64-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0
865+ ; X64-AVX2-NEXT: retq
866+ ;
867+ ; X64-AVX512DQ-LABEL: madd_v16i16_3:
868+ ; X64-AVX512DQ: # %bb.0:
869+ ; X64-AVX512DQ-NEXT: vpaddw %ymm0, %ymm0, %ymm2
870+ ; X64-AVX512DQ-NEXT: vpaddw %ymm1, %ymm0, %ymm0
871+ ; X64-AVX512DQ-NEXT: vpaddw %ymm2, %ymm0, %ymm0
872+ ; X64-AVX512DQ-NEXT: retq
873+ %mul = mul <16 x i16 > %a0 , splat (i16 3 )
874+ %add = add <16 x i16 > %mul , %a1
875+ ret <16 x i16 > %add
876+ }
877+
815878define <32 x i8 > @mul_v32i8_neg5 (<32 x i8 > %a0 ) nounwind {
816879; SSE-LABEL: mul_v32i8_neg5:
817880; SSE: # %bb.0:
0 commit comments