Skip to content

Commit a98c294

Browse files
authored
[X86] Handle multiple use freeze(undef) in LowerAVXCONCAT_VECTORS as zero vectors (llvm#128830)
Follow up of llvm@ee52af7 Handles the multiple use come from different vectors: https://godbolt.org/z/GMb3Endhr
1 parent 5cbff43 commit a98c294

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9486,16 +9486,19 @@ static SDValue LowerAVXCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
94869486
unsigned NumZero = 0;
94879487
unsigned NumNonZero = 0;
94889488
unsigned NonZeros = 0;
9489+
SmallSet<SDValue, 4> Undefs;
94899490
for (unsigned i = 0; i != NumOperands; ++i) {
94909491
SDValue SubVec = Op.getOperand(i);
94919492
if (SubVec.isUndef())
94929493
continue;
94939494
if (ISD::isFreezeUndef(SubVec.getNode())) {
94949495
// If the freeze(undef) has multiple uses then we must fold to zero.
9495-
if (SubVec.hasOneUse())
9496+
if (SubVec.hasOneUse()) {
94969497
++NumFreezeUndef;
9497-
else
9498+
} else {
94989499
++NumZero;
9500+
Undefs.insert(SubVec);
9501+
}
94999502
}
95009503
else if (ISD::isBuildVectorAllZeros(SubVec.getNode()))
95019504
++NumZero;
@@ -9522,6 +9525,11 @@ static SDValue LowerAVXCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
95229525
: (NumFreezeUndef ? DAG.getFreeze(DAG.getUNDEF(ResVT))
95239526
: DAG.getUNDEF(ResVT));
95249527

9528+
// Replace Undef operands with ZeroVector.
9529+
for (SDValue U : Undefs)
9530+
DAG.ReplaceAllUsesWith(
9531+
U, getZeroVector(U.getSimpleValueType(), Subtarget, DAG, dl));
9532+
95259533
MVT SubVT = Op.getOperand(0).getSimpleValueType();
95269534
unsigned NumSubElems = SubVT.getVectorNumElements();
95279535
for (unsigned i = 0; i != NumOperands; ++i) {

llvm/test/CodeGen/X86/avx2-arith.ll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,3 +260,31 @@ define <4 x i32> @mul_const11(<4 x i32> %x) {
260260
%m = mul <4 x i32> %x, <i32 2155905152, i32 2155905152, i32 2155905152, i32 2155905152>
261261
ret <4 x i32> %m
262262
}
263+
264+
; check we will zero both vectors.
265+
define void @multi_freeze(<2 x double> %x, <2 x double> %y) nounwind {
266+
; X86-LABEL: multi_freeze:
267+
; X86: # %bb.0:
268+
; X86-NEXT: vmovaps %xmm0, %xmm0
269+
; X86-NEXT: vmovaps %xmm1, %xmm1
270+
; X86-NEXT: calll foo@PLT
271+
; X86-NEXT: vzeroupper
272+
; X86-NEXT: retl
273+
;
274+
; X64-LABEL: multi_freeze:
275+
; X64: # %bb.0:
276+
; X64-NEXT: pushq %rax
277+
; X64-NEXT: vmovaps %xmm0, %xmm0
278+
; X64-NEXT: vmovaps %xmm1, %xmm1
279+
; X64-NEXT: callq foo@PLT
280+
; X64-NEXT: popq %rax
281+
; X64-NEXT: vzeroupper
282+
; X64-NEXT: retq
283+
%1 = freeze <2 x double> poison
284+
%2 = shufflevector <2 x double> %x, <2 x double> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
285+
%3 = shufflevector <2 x double> %y, <2 x double> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
286+
call void @foo(<4 x double> %2, <4 x double> %3)
287+
ret void
288+
}
289+
290+
declare void @foo(<4 x double>, <4 x double>)

0 commit comments

Comments
 (0)