Skip to content

Commit 01785e0

Browse files
committed
[X86] Handle multiple use freeze(undef) in LowerAVXCONCAT_VECTORS as zero vectors
Follow up of ee52af7 Handles the multiple use come from different vectors: https://godbolt.org/z/GMb3Endhr
1 parent 4d928d5 commit 01785e0

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
@@ -9482,16 +9482,19 @@ static SDValue LowerAVXCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
94829482
unsigned NumZero = 0;
94839483
unsigned NumNonZero = 0;
94849484
unsigned NonZeros = 0;
9485+
SmallSet<SDValue, 4> Undefs;
94859486
for (unsigned i = 0; i != NumOperands; ++i) {
94869487
SDValue SubVec = Op.getOperand(i);
94879488
if (SubVec.isUndef())
94889489
continue;
94899490
if (ISD::isFreezeUndef(SubVec.getNode())) {
94909491
// If the freeze(undef) has multiple uses then we must fold to zero.
9491-
if (SubVec.hasOneUse())
9492+
if (SubVec.hasOneUse()) {
94929493
++NumFreezeUndef;
9493-
else
9494+
} else {
94949495
++NumZero;
9496+
Undefs.insert(SubVec);
9497+
}
94959498
}
94969499
else if (ISD::isBuildVectorAllZeros(SubVec.getNode()))
94979500
++NumZero;
@@ -9518,6 +9521,11 @@ static SDValue LowerAVXCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
95189521
: (NumFreezeUndef ? DAG.getFreeze(DAG.getUNDEF(ResVT))
95199522
: DAG.getUNDEF(ResVT));
95209523

9524+
// Replace Undef operands with ZeroVector.
9525+
for (SDValue U : Undefs)
9526+
DAG.ReplaceAllUsesWith(
9527+
U, getZeroVector(U.getSimpleValueType(), Subtarget, DAG, dl));
9528+
95219529
MVT SubVT = Op.getOperand(0).getSimpleValueType();
95229530
unsigned NumSubElems = SubVT.getVectorNumElements();
95239531
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)