Skip to content

Commit ee52af7

Browse files
committed
[X86] Handle multiple use freeze(undef) in LowerAVXCONCAT_VECTORS as zero vectors
Replacement for D144903 If we're concatenating freeze(undef) subvector ops with multiple uses then we can't treat them as a wider freeze(undef), but we can replace them with a zero subvector, which is cheap on AVX Differential Revision: https://reviews.llvm.org/D149249
1 parent cbbd00b commit ee52af7

File tree

3 files changed

+11
-18
lines changed

3 files changed

+11
-18
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11663,8 +11663,13 @@ static SDValue LowerAVXCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
1166311663
SDValue SubVec = Op.getOperand(i);
1166411664
if (SubVec.isUndef())
1166511665
continue;
11666-
if (ISD::isFreezeUndef(SubVec.getNode()) && SubVec.hasOneUse())
11667-
++NumFreezeUndef;
11666+
if (ISD::isFreezeUndef(SubVec.getNode())) {
11667+
// If the freeze(undef) has multiple uses then we must fold to zero.
11668+
if (SubVec.hasOneUse())
11669+
++NumFreezeUndef;
11670+
else
11671+
++NumZero;
11672+
}
1166811673
else if (ISD::isBuildVectorAllZeros(SubVec.getNode()))
1166911674
++NumZero;
1167011675
else {

llvm/test/CodeGen/X86/avx512-intrinsics.ll

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7495,10 +7495,7 @@ declare <8 x i64> @llvm.x86.avx512.psrlv.q.512(<8 x i64>, <8 x i64>) nounwind re
74957495
define <8 x double> @test_mm256_castpd128_pd256_freeze(<2 x double> %a0) nounwind {
74967496
; CHECK-LABEL: test_mm256_castpd128_pd256_freeze:
74977497
; CHECK: # %bb.0:
7498-
; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
7499-
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
7500-
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
7501-
; CHECK-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
7498+
; CHECK-NEXT: vmovaps %xmm0, %xmm0
75027499
; CHECK-NEXT: ret{{[l|q]}}
75037500
%a1 = freeze <2 x double> poison
75047501
%res = shufflevector <2 x double> %a0, <2 x double> %a1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3>
@@ -7520,10 +7517,7 @@ define <8 x double> @test_mm256_castpd256_pd256_freeze(<4 x double> %a0) nounwin
75207517
define <16 x float> @test_mm256_castps128_ps512_freeze(<4 x float> %a0) nounwind {
75217518
; CHECK-LABEL: test_mm256_castps128_ps512_freeze:
75227519
; CHECK: # %bb.0:
7523-
; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
7524-
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
7525-
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
7526-
; CHECK-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
7520+
; CHECK-NEXT: vmovaps %xmm0, %xmm0
75277521
; CHECK-NEXT: ret{{[l|q]}}
75287522
%a1 = freeze <4 x float> poison
75297523
%res = shufflevector <4 x float> %a0, <4 x float> %a1, <16x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7>
@@ -7545,10 +7539,7 @@ define <16 x float> @test_mm256_castps256_ps512_freeze(<8 x float> %a0) nounwind
75457539
define <8 x i64> @test_mm512_castsi128_si512_freeze(<2 x i64> %a0) nounwind {
75467540
; CHECK-LABEL: test_mm512_castsi128_si512_freeze:
75477541
; CHECK: # %bb.0:
7548-
; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
7549-
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
7550-
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
7551-
; CHECK-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
7542+
; CHECK-NEXT: vmovaps %xmm0, %xmm0
75527543
; CHECK-NEXT: ret{{[l|q]}}
75537544
%a1 = freeze <2 x i64> poison
75547545
%res = shufflevector <2 x i64> %a0, <2 x i64> %a1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3>

llvm/test/CodeGen/X86/avx512fp16-intrinsics.ll

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,10 +1231,7 @@ define <16 x half> @test_mm256_castph128_ph256_freeze(<8 x half> %a0) nounwind {
12311231
define <32 x half> @test_mm512_castph128_ph512_freeze(<8 x half> %a0) nounwind {
12321232
; CHECK-LABEL: test_mm512_castph128_ph512_freeze:
12331233
; CHECK: # %bb.0:
1234-
; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1235-
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
1236-
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
1237-
; CHECK-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1234+
; CHECK-NEXT: vmovaps %xmm0, %xmm0
12381235
; CHECK-NEXT: retq
12391236
%a1 = freeze <8 x half> poison
12401237
%res = shufflevector <8 x half> %a0, <8 x half> %a1, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>

0 commit comments

Comments
 (0)