Skip to content

Commit 81003f2

Browse files
committed
[X86] combineBitcastvxi1 - peek through FREEZE nodes when determining width of the original SETCC node
Fixes #90847
1 parent 70d11ff commit 81003f2

File tree

2 files changed

+8
-13
lines changed

2 files changed

+8
-13
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42836,6 +42836,8 @@ static bool checkBitcastSrcVectorSize(SDValue Src, unsigned Size,
4283642836
[[fallthrough]];
4283742837
case ISD::SETCC:
4283842838
return Src.getOperand(0).getValueSizeInBits() == Size;
42839+
case ISD::FREEZE:
42840+
return checkBitcastSrcVectorSize(Src.getOperand(0), Size, AllowTruncate);
4283942841
case ISD::AND:
4284042842
case ISD::XOR:
4284142843
case ISD::OR:
@@ -42905,6 +42907,7 @@ static SDValue signExtendBitcastSrcVector(SelectionDAG &DAG, EVT SExtVT,
4290542907
SDValue Src, const SDLoc &DL) {
4290642908
switch (Src.getOpcode()) {
4290742909
case ISD::SETCC:
42910+
case ISD::FREEZE:
4290842911
case ISD::TRUNCATE:
4290942912
case ISD::BUILD_VECTOR:
4291042913
return DAG.getNode(ISD::SIGN_EXTEND, DL, SExtVT, Src);

llvm/test/CodeGen/X86/pr90847.ll

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX1
33
; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2
44

5-
; TODO: PR90847 - failure to peek through FREEZE(SETCC()) results in VPMOVSMSKB(TRUNC()) instead of VMOVMSKPS
5+
; PR90847 - failure to peek through FREEZE(SETCC()) results in VPMOVSMSKB(TRUNC()) instead of VMOVMSKPS
66

77
define i32 @PR90847(<8 x float> %x) nounwind {
88
; AVX1-LABEL: PR90847:
@@ -14,14 +14,10 @@ define i32 @PR90847(<8 x float> %x) nounwind {
1414
; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm1[2,3,0,1]
1515
; AVX1-NEXT: vminps %ymm2, %ymm1, %ymm1
1616
; AVX1-NEXT: vcmpeqps %ymm0, %ymm1, %ymm0
17-
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
18-
; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
19-
; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
20-
; AVX1-NEXT: vpmovmskb %xmm0, %eax
21-
; AVX1-NEXT: testb %al, %al
17+
; AVX1-NEXT: vmovmskps %ymm0, %eax
18+
; AVX1-NEXT: testl %eax, %eax
2219
; AVX1-NEXT: je .LBB0_1
2320
; AVX1-NEXT: # %bb.2: # %cond.false
24-
; AVX1-NEXT: movzbl %al, %eax
2521
; AVX1-NEXT: rep bsfl %eax, %eax
2622
; AVX1-NEXT: vzeroupper
2723
; AVX1-NEXT: retq
@@ -39,14 +35,10 @@ define i32 @PR90847(<8 x float> %x) nounwind {
3935
; AVX2-NEXT: vpermpd {{.*#+}} ymm2 = ymm1[2,3,0,1]
4036
; AVX2-NEXT: vminps %ymm2, %ymm1, %ymm1
4137
; AVX2-NEXT: vcmpeqps %ymm0, %ymm1, %ymm0
42-
; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
43-
; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
44-
; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
45-
; AVX2-NEXT: vpmovmskb %xmm0, %eax
46-
; AVX2-NEXT: testb %al, %al
38+
; AVX2-NEXT: vmovmskps %ymm0, %eax
39+
; AVX2-NEXT: testl %eax, %eax
4740
; AVX2-NEXT: je .LBB0_1
4841
; AVX2-NEXT: # %bb.2: # %cond.false
49-
; AVX2-NEXT: movzbl %al, %eax
5042
; AVX2-NEXT: rep bsfl %eax, %eax
5143
; AVX2-NEXT: vzeroupper
5244
; AVX2-NEXT: retq

0 commit comments

Comments
 (0)