[llvm] 81003f2 - [X86] combineBitcastvxi1 - peek through FREEZE nodes when determining width of the original SETCC node
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Fri May 3 05:22:41 PDT 2024
Author: Simon Pilgrim
Date: 2024-05-03T13:22:16+01:00
New Revision: 81003f23f0361aeb05b98489ba659edad40506f8
URL: https://github.com/llvm/llvm-project/commit/81003f23f0361aeb05b98489ba659edad40506f8
DIFF: https://github.com/llvm/llvm-project/commit/81003f23f0361aeb05b98489ba659edad40506f8.diff
LOG: [X86] combineBitcastvxi1 - peek through FREEZE nodes when determining width of the original SETCC node
Fixes #90847
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/pr90847.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 9ac3f6d4445e4f..cf4a64ffded2e8 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -42836,6 +42836,8 @@ static bool checkBitcastSrcVectorSize(SDValue Src, unsigned Size,
[[fallthrough]];
case ISD::SETCC:
return Src.getOperand(0).getValueSizeInBits() == Size;
+ case ISD::FREEZE:
+ return checkBitcastSrcVectorSize(Src.getOperand(0), Size, AllowTruncate);
case ISD::AND:
case ISD::XOR:
case ISD::OR:
@@ -42905,6 +42907,7 @@ static SDValue signExtendBitcastSrcVector(SelectionDAG &DAG, EVT SExtVT,
SDValue Src, const SDLoc &DL) {
switch (Src.getOpcode()) {
case ISD::SETCC:
+ case ISD::FREEZE:
case ISD::TRUNCATE:
case ISD::BUILD_VECTOR:
return DAG.getNode(ISD::SIGN_EXTEND, DL, SExtVT, Src);
diff --git a/llvm/test/CodeGen/X86/pr90847.ll b/llvm/test/CodeGen/X86/pr90847.ll
index 65cebfb88df899..7aa0ceb26e1acb 100644
--- a/llvm/test/CodeGen/X86/pr90847.ll
+++ b/llvm/test/CodeGen/X86/pr90847.ll
@@ -2,7 +2,7 @@
; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX1
; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2
-; TODO: PR90847 - failure to peek through FREEZE(SETCC()) results in VPMOVSMSKB(TRUNC()) instead of VMOVMSKPS
+; PR90847 - failure to peek through FREEZE(SETCC()) results in VPMOVSMSKB(TRUNC()) instead of VMOVMSKPS
define i32 @PR90847(<8 x float> %x) nounwind {
; AVX1-LABEL: PR90847:
@@ -14,14 +14,10 @@ define i32 @PR90847(<8 x float> %x) nounwind {
; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm1[2,3,0,1]
; AVX1-NEXT: vminps %ymm2, %ymm1, %ymm1
; AVX1-NEXT: vcmpeqps %ymm0, %ymm1, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
-; AVX1-NEXT: testb %al, %al
+; AVX1-NEXT: vmovmskps %ymm0, %eax
+; AVX1-NEXT: testl %eax, %eax
; AVX1-NEXT: je .LBB0_1
; AVX1-NEXT: # %bb.2: # %cond.false
-; AVX1-NEXT: movzbl %al, %eax
; AVX1-NEXT: rep bsfl %eax, %eax
; AVX1-NEXT: vzeroupper
; AVX1-NEXT: retq
@@ -39,14 +35,10 @@ define i32 @PR90847(<8 x float> %x) nounwind {
; AVX2-NEXT: vpermpd {{.*#+}} ymm2 = ymm1[2,3,0,1]
; AVX2-NEXT: vminps %ymm2, %ymm1, %ymm1
; AVX2-NEXT: vcmpeqps %ymm0, %ymm1, %ymm0
-; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
-; AVX2-NEXT: vpmovmskb %xmm0, %eax
-; AVX2-NEXT: testb %al, %al
+; AVX2-NEXT: vmovmskps %ymm0, %eax
+; AVX2-NEXT: testl %eax, %eax
; AVX2-NEXT: je .LBB0_1
; AVX2-NEXT: # %bb.2: # %cond.false
-; AVX2-NEXT: movzbl %al, %eax
; AVX2-NEXT: rep bsfl %eax, %eax
; AVX2-NEXT: vzeroupper
; AVX2-NEXT: retq
More information about the llvm-commits
mailing list