Skip to content

Commit 170c525

Browse files
committed
[X86] combineExtractVectorElt - fold extract(trunc(x),c) -> trunc(extract(x,c))
1 parent cf7d36f commit 170c525

File tree

7 files changed

+52
-68
lines changed

7 files changed

+52
-68
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44710,6 +44710,17 @@ static SDValue combineExtractVectorElt(SDNode *N, SelectionDAG &DAG,
4471044710
}
4471144711
}
4471244712

44713+
// Attempt to fold extract(trunc(x),c) -> trunc(extract(x,c)).
44714+
if (CIdx && InputVector.getOpcode() == ISD::TRUNCATE) {
44715+
SDValue TruncSrc = InputVector.getOperand(0);
44716+
EVT TruncSVT = TruncSrc.getValueType().getScalarType();
44717+
if (DCI.isBeforeLegalize() && TLI.isTypeLegal(TruncSVT)) {
44718+
SDValue NewExt =
44719+
DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, TruncSVT, TruncSrc, EltIdx);
44720+
return DAG.getAnyExtOrTrunc(NewExt, dl, VT);
44721+
}
44722+
}
44723+
4471344724
return SDValue();
4471444725
}
4471544726

llvm/test/CodeGen/X86/avx512-insert-extract.ll

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,11 +1050,9 @@ define zeroext i8 @test_extractelement_v32i1(<32 x i8> %a, <32 x i8> %b) nounwin
10501050
; KNL: ## %bb.0:
10511051
; KNL-NEXT: vpminub %xmm1, %xmm0, %xmm1
10521052
; KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
1053-
; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1054-
; KNL-NEXT: vpmovsxbd %xmm0, %zmm0
1055-
; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0
1056-
; KNL-NEXT: kshiftrw $2, %k0, %k0
1057-
; KNL-NEXT: kmovw %k0, %eax
1053+
; KNL-NEXT: vpextrb $2, %xmm0, %eax
1054+
; KNL-NEXT: notb %al
1055+
; KNL-NEXT: movzbl %al, %eax
10581056
; KNL-NEXT: andl $1, %eax
10591057
; KNL-NEXT: vzeroupper
10601058
; KNL-NEXT: retq
@@ -1081,11 +1079,9 @@ define zeroext i8 @test_extractelement_v64i1(<64 x i8> %a, <64 x i8> %b) nounwin
10811079
; KNL-NEXT: vpminub %ymm1, %ymm0, %ymm1
10821080
; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
10831081
; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0
1084-
; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1085-
; KNL-NEXT: vpmovsxbd %xmm0, %zmm0
1086-
; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0
1087-
; KNL-NEXT: kshiftrw $15, %k0, %k0
1088-
; KNL-NEXT: kmovw %k0, %ecx
1082+
; KNL-NEXT: vpextrb $15, %xmm0, %eax
1083+
; KNL-NEXT: notb %al
1084+
; KNL-NEXT: movzbl %al, %ecx
10891085
; KNL-NEXT: andl $1, %ecx
10901086
; KNL-NEXT: movl $4, %eax
10911087
; KNL-NEXT: subl %ecx, %eax
@@ -1116,15 +1112,10 @@ define zeroext i8 @extractelement_v64i1_alt(<64 x i8> %a, <64 x i8> %b) nounwind
11161112
; KNL-NEXT: vpminub %ymm1, %ymm0, %ymm1
11171113
; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
11181114
; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0
1119-
; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1120-
; KNL-NEXT: vpmovsxbd %xmm0, %zmm0
1121-
; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0
1122-
; KNL-NEXT: kshiftrw $15, %k0, %k0
1123-
; KNL-NEXT: kmovw %k0, %eax
1124-
; KNL-NEXT: andb $1, %al
1125-
; KNL-NEXT: movb $4, %cl
1126-
; KNL-NEXT: subb %al, %cl
1127-
; KNL-NEXT: movzbl %cl, %eax
1115+
; KNL-NEXT: vpextrb $15, %xmm0, %eax
1116+
; KNL-NEXT: notb %al
1117+
; KNL-NEXT: addb $4, %al
1118+
; KNL-NEXT: movzbl %al, %eax
11281119
; KNL-NEXT: vzeroupper
11291120
; KNL-NEXT: retq
11301121
;

llvm/test/CodeGen/X86/insertelement-var-index.ll

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2294,13 +2294,13 @@ define i32 @PR44139(ptr %p) {
22942294
;
22952295
; AVX1-LABEL: PR44139:
22962296
; AVX1: # %bb.0:
2297+
; AVX1-NEXT: movq (%rdi), %rax
22972298
; AVX1-NEXT: vbroadcastsd (%rdi), %ymm0
2298-
; AVX1-NEXT: vpinsrq $1, (%rdi), %xmm0, %xmm1
2299+
; AVX1-NEXT: vpinsrq $1, %rax, %xmm0, %xmm1
22992300
; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm0[4,5,6,7]
23002301
; AVX1-NEXT: vmovaps %ymm0, 64(%rdi)
23012302
; AVX1-NEXT: vmovaps %ymm0, 96(%rdi)
23022303
; AVX1-NEXT: vmovaps %ymm0, 32(%rdi)
2303-
; AVX1-NEXT: movl (%rdi), %eax
23042304
; AVX1-NEXT: vmovaps %ymm1, (%rdi)
23052305
; AVX1-NEXT: leal 2147483647(%rax), %ecx
23062306
; AVX1-NEXT: testl %eax, %eax
@@ -2315,13 +2315,13 @@ define i32 @PR44139(ptr %p) {
23152315
;
23162316
; AVX2-LABEL: PR44139:
23172317
; AVX2: # %bb.0:
2318+
; AVX2-NEXT: movq (%rdi), %rax
23182319
; AVX2-NEXT: vpbroadcastq (%rdi), %ymm0
2319-
; AVX2-NEXT: vpinsrq $1, (%rdi), %xmm0, %xmm1
2320+
; AVX2-NEXT: vpinsrq $1, %rax, %xmm0, %xmm1
23202321
; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm0[4,5,6,7]
23212322
; AVX2-NEXT: vmovdqa %ymm0, 64(%rdi)
23222323
; AVX2-NEXT: vmovdqa %ymm0, 96(%rdi)
23232324
; AVX2-NEXT: vmovdqa %ymm0, 32(%rdi)
2324-
; AVX2-NEXT: movl (%rdi), %eax
23252325
; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
23262326
; AVX2-NEXT: leal 2147483647(%rax), %ecx
23272327
; AVX2-NEXT: testl %eax, %eax
@@ -2336,14 +2336,12 @@ define i32 @PR44139(ptr %p) {
23362336
;
23372337
; AVX512-LABEL: PR44139:
23382338
; AVX512: # %bb.0:
2339-
; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
2340-
; AVX512-NEXT: vpbroadcastq (%rdi), %zmm1
2341-
; AVX512-NEXT: vpmovqd %zmm0, %ymm0
2342-
; AVX512-NEXT: vpinsrq $1, (%rdi), %xmm1, %xmm2
2343-
; AVX512-NEXT: vinserti32x4 $0, %xmm2, %zmm1, %zmm2
2344-
; AVX512-NEXT: vmovdqa64 %zmm1, 64(%rdi)
2345-
; AVX512-NEXT: vmovdqa64 %zmm2, (%rdi)
2346-
; AVX512-NEXT: vmovd %xmm0, %eax
2339+
; AVX512-NEXT: movq (%rdi), %rax
2340+
; AVX512-NEXT: vpbroadcastq (%rdi), %zmm0
2341+
; AVX512-NEXT: vpinsrq $1, %rax, %xmm0, %xmm1
2342+
; AVX512-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm1
2343+
; AVX512-NEXT: vmovdqa64 %zmm0, 64(%rdi)
2344+
; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)
23472345
; AVX512-NEXT: leal 2147483647(%rax), %ecx
23482346
; AVX512-NEXT: testl %eax, %eax
23492347
; AVX512-NEXT: cmovnsl %eax, %ecx

llvm/test/CodeGen/X86/movmsk-cmp.ll

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3682,18 +3682,12 @@ define i1 @movmsk_v16i8(<16 x i8> %x, <16 x i8> %y) {
36823682
; KNL-LABEL: movmsk_v16i8:
36833683
; KNL: # %bb.0:
36843684
; KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
3685-
; KNL-NEXT: vpmovsxbd %xmm0, %zmm0
3686-
; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0
3687-
; KNL-NEXT: kshiftrw $15, %k0, %k1
3688-
; KNL-NEXT: kmovw %k1, %ecx
3689-
; KNL-NEXT: kshiftrw $8, %k0, %k1
3690-
; KNL-NEXT: kmovw %k1, %edx
3691-
; KNL-NEXT: kshiftrw $3, %k0, %k0
3692-
; KNL-NEXT: kmovw %k0, %eax
3693-
; KNL-NEXT: xorb %dl, %al
3694-
; KNL-NEXT: andb %cl, %al
3685+
; KNL-NEXT: vpextrb $15, %xmm0, %ecx
3686+
; KNL-NEXT: vpextrb $8, %xmm0, %edx
3687+
; KNL-NEXT: vpextrb $3, %xmm0, %eax
3688+
; KNL-NEXT: xorl %edx, %eax
3689+
; KNL-NEXT: andl %ecx, %eax
36953690
; KNL-NEXT: # kill: def $al killed $al killed $eax
3696-
; KNL-NEXT: vzeroupper
36973691
; KNL-NEXT: retq
36983692
;
36993693
; SKX-LABEL: movmsk_v16i8:

llvm/test/CodeGen/X86/pr63439.ll

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,SSE
3-
; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX
2+
; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s
3+
; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s
44

55
define i16 @mulhs(i16 %a0, i16 %a1) {
66
; CHECK-LABEL: mulhs:
77
; CHECK: # %bb.0:
8-
; CHECK-NEXT: movswl %si, %ecx
9-
; CHECK-NEXT: movswl %di, %eax
8+
; CHECK-NEXT: movswl %di, %ecx
9+
; CHECK-NEXT: movswl %si, %eax
1010
; CHECK-NEXT: imull %ecx, %eax
1111
; CHECK-NEXT: shrl $16, %eax
1212
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
@@ -23,23 +23,14 @@ define i16 @mulhs(i16 %a0, i16 %a1) {
2323
}
2424

2525
define i16 @mulhu(i16 %a0, i16 %a1) {
26-
; SSE-LABEL: mulhu:
27-
; SSE: # %bb.0:
28-
; SSE-NEXT: movzwl %si, %ecx
29-
; SSE-NEXT: movzwl %di, %eax
30-
; SSE-NEXT: imull %ecx, %eax
31-
; SSE-NEXT: shrl $16, %eax
32-
; SSE-NEXT: # kill: def $ax killed $ax killed $eax
33-
; SSE-NEXT: retq
34-
;
35-
; AVX-LABEL: mulhu:
36-
; AVX: # %bb.0:
37-
; AVX-NEXT: vmovd %edi, %xmm0
38-
; AVX-NEXT: vmovd %esi, %xmm1
39-
; AVX-NEXT: vpmulhuw %xmm1, %xmm0, %xmm0
40-
; AVX-NEXT: vmovd %xmm0, %eax
41-
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
42-
; AVX-NEXT: retq
26+
; CHECK-LABEL: mulhu:
27+
; CHECK: # %bb.0:
28+
; CHECK-NEXT: movzwl %di, %ecx
29+
; CHECK-NEXT: movzwl %si, %eax
30+
; CHECK-NEXT: imull %ecx, %eax
31+
; CHECK-NEXT: shrl $16, %eax
32+
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
33+
; CHECK-NEXT: retq
4334
%x0 = zext i16 %a0 to i32
4435
%x1 = zext i16 %a1 to i32
4536
%v0 = insertelement <1 x i32> <i32 undef>, i32 %x0, i32 0

llvm/test/CodeGen/X86/pr64439.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
define void @f(ptr %0, <32 x i1> %1, i32 %2) nounwind {
55
; CHECK-LABEL: f:
66
; CHECK: # %bb.0:
7-
; CHECK-NEXT: vpsllw $7, %ymm0, %ymm0
8-
; CHECK-NEXT: vpmovb2m %ymm0, %k0
9-
; CHECK-NEXT: kshiftrd $3, %k0, %k1
10-
; CHECK-NEXT: kmovd %k1, %eax
7+
; CHECK-NEXT: vpsllw $7, %ymm0, %ymm1
8+
; CHECK-NEXT: vpmovb2m %ymm1, %k0
9+
; CHECK-NEXT: vpextrb $3, %xmm0, %eax
1110
; CHECK-NEXT: vpbroadcastb %esi, %ymm0
1211
; CHECK-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k1
1312
; CHECK-NEXT: vpmovm2b %k0, %ymm0

llvm/test/CodeGen/X86/vec_cast.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ define <3 x i16> @h(<3 x i32> %a) nounwind {
156156
; CHECK-WIN-LABEL: h:
157157
; CHECK-WIN: # %bb.0:
158158
; CHECK-WIN-NEXT: movdqa (%rcx), %xmm0
159-
; CHECK-WIN-NEXT: movd %xmm0, %eax
159+
; CHECK-WIN-NEXT: movl (%rcx), %eax
160160
; CHECK-WIN-NEXT: pextrw $2, %xmm0, %edx
161161
; CHECK-WIN-NEXT: pextrw $4, %xmm0, %ecx
162162
; CHECK-WIN-NEXT: # kill: def $ax killed $ax killed $eax

0 commit comments

Comments
 (0)