Skip to content

Commit 0f23557

Browse files
committed
[X86] Fold broadcast(scalar) -> scalar_to_vector(scalar) if only the lowest element is demanded.
1 parent eaeb1fb commit 0f23557

File tree

3 files changed

+7
-6
lines changed

3 files changed

+7
-6
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42863,15 +42863,18 @@ bool X86TargetLowering::SimplifyDemandedVectorEltsForTargetNode(
4286342863
case X86ISD::VBROADCAST: {
4286442864
SDValue Src = Op.getOperand(0);
4286542865
MVT SrcVT = Src.getSimpleValueType();
42866-
if (!SrcVT.isVector())
42867-
break;
4286842866
// Don't bother broadcasting if we just need the 0'th element.
4286942867
if (DemandedElts == 1) {
42868+
if (!SrcVT.isVector())
42869+
return TLO.CombineTo(
42870+
Op, TLO.DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(Op), VT, Src));
4287042871
if (Src.getValueType() != VT)
4287142872
Src = widenSubVector(VT.getSimpleVT(), Src, false, Subtarget, TLO.DAG,
4287242873
SDLoc(Op));
4287342874
return TLO.CombineTo(Op, Src);
4287442875
}
42876+
if (!SrcVT.isVector())
42877+
break;
4287542878
APInt SrcUndef, SrcZero;
4287642879
APInt SrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(), 0);
4287742880
if (SimplifyDemandedVectorElts(Src, SrcElts, SrcUndef, SrcZero, TLO,

llvm/test/CodeGen/X86/pr29222.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,7 @@ define i32 @PR29222(i32) nounwind {
5454
; X64-AVX-NEXT: movd %edi, %mm0
5555
; X64-AVX-NEXT: pshufw $68, %mm0, %mm0 # mm0 = mm0[0,1,0,1]
5656
; X64-AVX-NEXT: packsswb %mm0, %mm0
57-
; X64-AVX-NEXT: movq %mm0, %rax
58-
; X64-AVX-NEXT: vmovq %rax, %xmm0
59-
; X64-AVX-NEXT: vpbroadcastq %xmm0, %xmm0
57+
; X64-AVX-NEXT: movq2dq %mm0, %xmm0
6058
; X64-AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
6159
; X64-AVX-NEXT: vmovd %xmm0, %eax
6260
; X64-AVX-NEXT: retq

llvm/test/CodeGen/X86/shuffle-half.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ define <32 x half> @build_vec(ptr %p, <32 x i1> %mask) {
225225
; CHECK-NEXT: testl $65536, %eax # imm = 0x10000
226226
; CHECK-NEXT: je .LBB1_35
227227
; CHECK-NEXT: .LBB1_34: # %cond.load46
228-
; CHECK-NEXT: vpbroadcastw 32(%rdi), %xmm1
228+
; CHECK-NEXT: vpinsrw $0, 32(%rdi), %xmm0, %xmm1
229229
; CHECK-NEXT: vextracti64x4 $1, %zmm0, %ymm2
230230
; CHECK-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
231231
; CHECK-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm2[4,5,6,7]

0 commit comments

Comments
 (0)