Skip to content

Commit 63f3383

Browse files
committed
[X86][AVX] Fold broadcast(bitcast(src)) -> bitcast(broadcast(src))
llvm-svn: 352751
1 parent 140f75f commit 63f3383

File tree

4 files changed

+16
-12
lines changed

4 files changed

+16
-12
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -31938,6 +31938,14 @@ static SDValue combineTargetShuffle(SDValue N, SelectionDAG &DAG,
3193831938
return DAG.getNode(X86ISD::VBROADCAST, DL, VT,
3193931939
DAG.getBitcast(SrcVT, Res));
3194031940
}
31941+
// broadcast(bitcast(src)) -> bitcast(broadcast(src))
31942+
// 32-bit targets have to bitcast i64 to f64, so better to bitcast upward.
31943+
if (Src.getOpcode() == ISD::BITCAST &&
31944+
SrcVT.getScalarSizeInBits() == BCVT.getScalarSizeInBits()) {
31945+
EVT NewVT = EVT::getVectorVT(*DAG.getContext(), BCVT.getScalarType(),
31946+
VT.getVectorNumElements());
31947+
return DAG.getBitcast(VT, DAG.getNode(X86ISD::VBROADCAST, DL, NewVT, BC));
31948+
}
3194131949
return SDValue();
3194231950
}
3194331951
case X86ISD::PSHUFD:

llvm/test/CodeGen/X86/avx-vbroadcast.ll

+4-4
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ define <4 x i64> @A2(i64* %ptr, i64* %ptr2) nounwind uwtable readnone ssp {
4545
; X64-LABEL: A2:
4646
; X64: ## %bb.0: ## %entry
4747
; X64-NEXT: movq (%rdi), %rax
48-
; X64-NEXT: vmovq %rax, %xmm0
4948
; X64-NEXT: movq %rax, (%rsi)
50-
; X64-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]
49+
; X64-NEXT: vmovq %rax, %xmm0
50+
; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
5151
; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
5252
; X64-NEXT: retq
5353
entry:
@@ -110,17 +110,17 @@ define <8 x i32> @B3(i32* %ptr, i32* %ptr2) nounwind uwtable readnone ssp {
110110
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
111111
; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
112112
; X32-NEXT: movl (%ecx), %ecx
113-
; X32-NEXT: vmovd %ecx, %xmm0
114113
; X32-NEXT: movl %ecx, (%eax)
114+
; X32-NEXT: vmovd %ecx, %xmm0
115115
; X32-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
116116
; X32-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
117117
; X32-NEXT: retl
118118
;
119119
; X64-LABEL: B3:
120120
; X64: ## %bb.0: ## %entry
121121
; X64-NEXT: movl (%rdi), %eax
122-
; X64-NEXT: vmovd %eax, %xmm0
123122
; X64-NEXT: movl %eax, (%rsi)
123+
; X64-NEXT: vmovd %eax, %xmm0
124124
; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
125125
; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
126126
; X64-NEXT: retq

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,7 @@ define <16 x i16> @broadcast_mem_v4i16_v16i16(<4 x i16>* %ptr) {
244244
; X32-LABEL: broadcast_mem_v4i16_v16i16:
245245
; X32: ## %bb.0:
246246
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
247-
; X32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
248-
; X32-NEXT: vbroadcastsd %xmm0, %ymm0
247+
; X32-NEXT: vbroadcastsd (%eax), %ymm0
249248
; X32-NEXT: retl
250249
;
251250
; X64-LABEL: broadcast_mem_v4i16_v16i16:

llvm/test/CodeGen/X86/subvector-broadcast.ll

+3-6
Original file line numberDiff line numberDiff line change
@@ -1592,15 +1592,13 @@ define <8 x i32> @test_2xi32_to_8xi32_mem(<2 x i32>* %vp) {
15921592
; X32-AVX2-LABEL: test_2xi32_to_8xi32_mem:
15931593
; X32-AVX2: # %bb.0:
15941594
; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
1595-
; X32-AVX2-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
1596-
; X32-AVX2-NEXT: vbroadcastsd %xmm0, %ymm0
1595+
; X32-AVX2-NEXT: vbroadcastsd (%eax), %ymm0
15971596
; X32-AVX2-NEXT: retl
15981597
;
15991598
; X32-AVX512-LABEL: test_2xi32_to_8xi32_mem:
16001599
; X32-AVX512: # %bb.0:
16011600
; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax
1602-
; X32-AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
1603-
; X32-AVX512-NEXT: vbroadcastsd %xmm0, %ymm0
1601+
; X32-AVX512-NEXT: vbroadcastsd (%eax), %ymm0
16041602
; X32-AVX512-NEXT: retl
16051603
;
16061604
; X64-AVX1-LABEL: test_2xi32_to_8xi32_mem:
@@ -1635,8 +1633,7 @@ define <16 x i32> @test_2xi32_to_16xi32_mem(<2 x i32>* %vp) {
16351633
; X32-AVX2-LABEL: test_2xi32_to_16xi32_mem:
16361634
; X32-AVX2: # %bb.0:
16371635
; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
1638-
; X32-AVX2-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
1639-
; X32-AVX2-NEXT: vbroadcastsd %xmm0, %ymm0
1636+
; X32-AVX2-NEXT: vbroadcastsd (%eax), %ymm0
16401637
; X32-AVX2-NEXT: vmovaps %ymm0, %ymm1
16411638
; X32-AVX2-NEXT: retl
16421639
;

0 commit comments

Comments
 (0)