Skip to content

Commit 2e810b5

Browse files
committed
[CodeGenPrepare] Use isKnownNonZero
1 parent bf11b6d commit 2e810b5

File tree

3 files changed

+12
-17
lines changed

3 files changed

+12
-17
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2114,22 +2114,17 @@ bool CodeGenPrepare::optimizeURem(Instruction *Rem) {
21142114
/// Some targets have better codegen for `ctpop(X) u< 2` than `ctpop(X) == 1`.
21152115
/// This function converts `ctpop(X) ==/!= 1` into `ctpop(X) u</u> 2/1` if the
21162116
/// result cannot be zero.
2117-
static bool adjustIsPower2Test(CmpInst *Cmp) {
2117+
static bool adjustIsPower2Test(CmpInst *Cmp, const DataLayout &DL) {
21182118
ICmpInst::Predicate Pred;
21192119
if (!match(Cmp, m_ICmp(Pred, m_Intrinsic<Intrinsic::ctpop>(), m_One())))
21202120
return false;
21212121
if (!ICmpInst::isEquality(Pred))
21222122
return false;
21232123
auto *II = cast<IntrinsicInst>(Cmp->getOperand(0));
2124-
if (auto Range = II->getRange()) {
2125-
Type *Ty = II->getType();
2126-
unsigned BitWidth = Ty->getScalarSizeInBits();
2127-
if (Range->contains(APInt::getZero(BitWidth)))
2128-
return false;
2129-
2124+
if (isKnownNonZero(II, DL)) {
21302125
if (Pred == ICmpInst::ICMP_EQ) {
21312126
Cmp->setPredicate(ICmpInst::ICMP_ULT);
2132-
Cmp->setOperand(1, ConstantInt::get(Ty, 2));
2127+
Cmp->setOperand(1, ConstantInt::get(II->getType(), 2));
21332128
} else
21342129
Cmp->setPredicate(ICmpInst::ICMP_UGT);
21352130
return true;
@@ -2156,7 +2151,7 @@ bool CodeGenPrepare::optimizeCmp(CmpInst *Cmp, ModifyDT &ModifiedDT) {
21562151
if (foldFCmpToFPClassTest(Cmp, *TLI, *DL))
21572152
return true;
21582153

2159-
if (adjustIsPower2Test(Cmp))
2154+
if (adjustIsPower2Test(Cmp, *DL))
21602155
return true;
21612156

21622157
return false;

llvm/test/CodeGen/X86/ispow2.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ define <4 x i1> @is_pow2_non_zero_4xv64(<4 x i64> %xin) {
102102
; CHECK-AVX512: # %bb.0:
103103
; CHECK-AVX512-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
104104
; CHECK-AVX512-NEXT: vpopcntq %ymm0, %ymm0
105-
; CHECK-AVX512-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
105+
; CHECK-AVX512-NEXT: vpcmpltq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
106106
; CHECK-AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
107107
; CHECK-AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
108108
; CHECK-AVX512-NEXT: vzeroupper
@@ -155,7 +155,7 @@ define <4 x i1> @neither_pow2_non_zero_4xv64(<4 x i64> %xin) {
155155
; CHECK-AVX512: # %bb.0:
156156
; CHECK-AVX512-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
157157
; CHECK-AVX512-NEXT: vpopcntq %ymm0, %ymm0
158-
; CHECK-AVX512-NEXT: vpcmpneqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
158+
; CHECK-AVX512-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
159159
; CHECK-AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
160160
; CHECK-AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
161161
; CHECK-AVX512-NEXT: vzeroupper

llvm/test/CodeGen/X86/known-never-zero.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -555,9 +555,9 @@ define <4 x i32> @smax_known_zero_vec(<4 x i32> %x, <4 x i32> %y) {
555555
; X86-NEXT: por %xmm2, %xmm0
556556
; X86-NEXT: pcmpeqd %xmm1, %xmm1
557557
; X86-NEXT: paddd %xmm0, %xmm1
558-
; X86-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
559-
; X86-NEXT: pxor %xmm1, %xmm0
560-
; X86-NEXT: pcmpgtd %xmm1, %xmm0
558+
; X86-NEXT: pand %xmm1, %xmm0
559+
; X86-NEXT: pxor %xmm1, %xmm1
560+
; X86-NEXT: pcmpeqd %xmm1, %xmm0
561561
; X86-NEXT: psrld $31, %xmm0
562562
; X86-NEXT: retl
563563
;
@@ -566,10 +566,10 @@ define <4 x i32> @smax_known_zero_vec(<4 x i32> %x, <4 x i32> %y) {
566566
; X64-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
567567
; X64-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
568568
; X64-NEXT: vpaddd %xmm1, %xmm0, %xmm1
569-
; X64-NEXT: vpxor %xmm1, %xmm0, %xmm0
570-
; X64-NEXT: vpminud %xmm1, %xmm0, %xmm1
569+
; X64-NEXT: vpand %xmm1, %xmm0, %xmm0
570+
; X64-NEXT: vpxor %xmm1, %xmm1, %xmm1
571571
; X64-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
572-
; X64-NEXT: vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
572+
; X64-NEXT: vpsrld $31, %xmm0, %xmm0
573573
; X64-NEXT: retq
574574
%z = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %x, <4 x i32> <i32 54, i32 23, i32 12, i32 1>)
575575
%r = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %z)

0 commit comments

Comments
 (0)