[PATCH] D94693: Improve KnownBits analyses for SMIN/SMAX DAG nodes.
Ayman Musa via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 14 08:00:14 PST 2021
aymanmus created this revision.
aymanmus added reviewers: RKSimon, ArturGainullin, foad.
Herald added subscribers: pengfei, hiraditya.
aymanmus requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
In computeKnownBits method for SMIN & SMAX opcodes, an early exit can miss opportunities for valuable information.
The code terminates the function in case no bits were known from the 1st operand, while sine valuable information can be extracted about the result's bits from the 2nd operand alone.
For example:
- smax x, 0 --> MSB of x is always 0.
- smin x, -1 --> MSB of x is always 1.
https://reviews.llvm.org/D94693
Files:
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/test/CodeGen/X86/avx512-trunc.ll
llvm/test/CodeGen/X86/known-bits-vector.ll
Index: llvm/test/CodeGen/X86/known-bits-vector.ll
===================================================================
--- llvm/test/CodeGen/X86/known-bits-vector.ll
+++ llvm/test/CodeGen/X86/known-bits-vector.ll
@@ -435,11 +435,7 @@
; X32-NEXT: vpminsd {{\.LCPI.*}}, %xmm0, %xmm0
; X32-NEXT: vpmaxsd {{\.LCPI.*}}, %xmm0, %xmm0
; X32-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,3,3]
-; X32-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
-; X32-NEXT: vpsrld $16, %xmm0, %xmm0
-; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
-; X32-NEXT: vsubps {{\.LCPI.*}}, %xmm0, %xmm0
-; X32-NEXT: vaddps %xmm0, %xmm1, %xmm0
+; X32-NEXT: vcvtdq2ps %xmm0, %xmm0
; X32-NEXT: retl
;
; X64-LABEL: knownbits_smax_smin_shuffle_uitofp:
@@ -447,11 +443,7 @@
; X64-NEXT: vpminsd {{.*}}(%rip), %xmm0, %xmm0
; X64-NEXT: vpmaxsd {{.*}}(%rip), %xmm0, %xmm0
; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,3,3]
-; X64-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
-; X64-NEXT: vpsrld $16, %xmm0, %xmm0
-; X64-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]
-; X64-NEXT: vsubps {{.*}}(%rip), %xmm0, %xmm0
-; X64-NEXT: vaddps %xmm0, %xmm1, %xmm0
+; X64-NEXT: vcvtdq2ps %xmm0, %xmm0
; X64-NEXT: retq
%1 = call <4 x i32> @llvm.x86.sse41.pminsd(<4 x i32> %a0, <4 x i32> <i32 0, i32 -65535, i32 -65535, i32 0>)
%2 = call <4 x i32> @llvm.x86.sse41.pmaxsd(<4 x i32> %1, <4 x i32> <i32 65535, i32 -1, i32 -1, i32 131071>)
Index: llvm/test/CodeGen/X86/avx512-trunc.ll
===================================================================
--- llvm/test/CodeGen/X86/avx512-trunc.ll
+++ llvm/test/CodeGen/X86/avx512-trunc.ll
@@ -1007,21 +1007,14 @@
define void @negative_test1_smax_usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) {
; KNL-LABEL: negative_test1_smax_usat_trunc_wb_256_mem:
; KNL: ## %bb.0:
-; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; KNL-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
-; KNL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; KNL-NEXT: vpminsw %ymm1, %ymm0, %ymm0
-; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
+; KNL-NEXT: vpbroadcastd {{.*#+}} zmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
; KNL-NEXT: vpmovdb %zmm0, (%rdi)
; KNL-NEXT: vzeroupper
; KNL-NEXT: retq
;
; SKX-LABEL: negative_test1_smax_usat_trunc_wb_256_mem:
; SKX: ## %bb.0:
-; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; SKX-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
-; SKX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; SKX-NEXT: vpminsw %ymm1, %ymm0, %ymm0
+; SKX-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; SKX-NEXT: vpmovwb %ymm0, (%rdi)
; SKX-NEXT: vzeroupper
; SKX-NEXT: retq
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -3416,8 +3416,8 @@
}
Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
- if (Known.isUnknown()) break; // Early-out
Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
+ if (Known.isUnknown() && Known2.isUnknown()) break; // Early-out
if (IsMax)
Known = KnownBits::smax(Known, Known2);
else
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D94693.316662.patch
Type: text/x-patch
Size: 3638 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210114/5f49e11f/attachment.bin>
More information about the llvm-commits
mailing list