Skip to content

Commit e9974f0

Browse files
committed
[X86] canCreateUndefOrPoisonForTargetNode - PMADDWD/PMADDUBSW nodes don't create poison
Help with regression identified on #84924
1 parent 05671ce commit e9974f0

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43315,6 +43315,9 @@ bool X86TargetLowering::canCreateUndefOrPoisonForTargetNode(
4331543315
bool PoisonOnly, bool ConsiderFlags, unsigned Depth) const {
4331643316

4331743317
switch (Op.getOpcode()) {
43318+
// SSE vector multiplies are either inbounds or saturate.
43319+
case X86ISD::VPMADDUBSW:
43320+
case X86ISD::VPMADDWD:
4331843321
// SSE vector shifts handle out of bounds shift amounts.
4331943322
case X86ISD::VSHLI:
4332043323
case X86ISD::VSRLI:

llvm/test/CodeGen/X86/combine-pmadd.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,11 @@ define <8 x i32> @combine_pmaddwd_concat_freeze(<8 x i16> %a0, <8 x i16> %a1) {
8181
;
8282
; AVX2-LABEL: combine_pmaddwd_concat_freeze:
8383
; AVX2: # %bb.0:
84+
; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
8485
; AVX2-NEXT: vpbroadcastw {{.*#+}} xmm2 = [1,1,1,1,1,1,1,1]
85-
; AVX2-NEXT: vpmaddwd %xmm2, %xmm0, %xmm0
86-
; AVX2-NEXT: vpmaddwd %xmm2, %xmm1, %xmm1
8786
; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
87+
; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm2, %ymm1
88+
; AVX2-NEXT: vpmaddwd %ymm1, %ymm0, %ymm0
8889
; AVX2-NEXT: retq
8990
%lo = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a0, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
9091
%hi = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
@@ -227,10 +228,11 @@ define <16 x i16> @combine_pmaddubsw_concat_freeze(<16 x i8> %a0, <16 x i8> %a1)
227228
;
228229
; AVX2-LABEL: combine_pmaddubsw_concat_freeze:
229230
; AVX2: # %bb.0:
231+
; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
230232
; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
231-
; AVX2-NEXT: vpmaddubsw %xmm2, %xmm0, %xmm0
232-
; AVX2-NEXT: vpmaddubsw %xmm2, %xmm1, %xmm1
233233
; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
234+
; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm2, %ymm1
235+
; AVX2-NEXT: vpmaddubsw %ymm1, %ymm0, %ymm0
234236
; AVX2-NEXT: retq
235237
%lo = call <8 x i16> @llvm.x86.ssse3.pmadd.ub.sw.128(<16 x i8> %a0, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)
236238
%hi = call <8 x i16> @llvm.x86.ssse3.pmadd.ub.sw.128(<16 x i8> %a1, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)

0 commit comments

Comments
 (0)