Skip to content

Commit 00c1ee4

Browse files
committed
[InstSimplify] Pass SimplifyQuery into simplifyUnsignedRangeCheck() and use it for isKnownNonZero()
This was actually the original intention in D67332, but i messed up and forgot about it. This patch was originally part of D67411, but precommitting this. llvm-svn: 371630
1 parent 8aeb7bb commit 00c1ee4

File tree

2 files changed

+16
-20
lines changed

2 files changed

+16
-20
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,7 +1372,7 @@ Value *llvm::SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
13721372
/// with the parameters swapped.
13731373
static Value *simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp,
13741374
ICmpInst *UnsignedICmp, bool IsAnd,
1375-
const DataLayout &DL) {
1375+
const SimplifyQuery &Q) {
13761376
Value *X, *Y;
13771377

13781378
ICmpInst::Predicate EqPred;
@@ -1399,13 +1399,13 @@ static Value *simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp,
13991399
// X <= Y && Y != 0 --> X <= Y iff X != 0
14001400
// X <= Y || Y != 0 --> Y != 0 iff X != 0
14011401
if (UnsignedPred == ICmpInst::ICMP_ULE && EqPred == ICmpInst::ICMP_NE &&
1402-
isKnownNonZero(X, DL))
1402+
isKnownNonZero(X, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT))
14031403
return IsAnd ? UnsignedICmp : ZeroICmp;
14041404

14051405
// X > Y && Y == 0 --> Y == 0 iff X != 0
14061406
// X > Y || Y == 0 --> X > Y iff X != 0
14071407
if (UnsignedPred == ICmpInst::ICMP_UGT && EqPred == ICmpInst::ICMP_EQ &&
1408-
isKnownNonZero(X, DL))
1408+
isKnownNonZero(X, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT))
14091409
return IsAnd ? ZeroICmp : UnsignedICmp;
14101410

14111411
// X >= Y || Y != 0 --> true
@@ -1600,11 +1600,10 @@ static Value *simplifyAndOfICmpsWithAdd(ICmpInst *Op0, ICmpInst *Op1,
16001600
}
16011601

16021602
static Value *simplifyAndOfICmps(ICmpInst *Op0, ICmpInst *Op1,
1603-
const InstrInfoQuery &IIQ,
1604-
const DataLayout &DL) {
1605-
if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/true, DL))
1603+
const SimplifyQuery &Q) {
1604+
if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/true, Q))
16061605
return X;
1607-
if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/true, DL))
1606+
if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/true, Q))
16081607
return X;
16091608

16101609
if (Value *X = simplifyAndOfICmpsWithSameOperands(Op0, Op1))
@@ -1618,9 +1617,9 @@ static Value *simplifyAndOfICmps(ICmpInst *Op0, ICmpInst *Op1,
16181617
if (Value *X = simplifyAndOrOfICmpsWithZero(Op0, Op1, true))
16191618
return X;
16201619

1621-
if (Value *X = simplifyAndOfICmpsWithAdd(Op0, Op1, IIQ))
1620+
if (Value *X = simplifyAndOfICmpsWithAdd(Op0, Op1, Q.IIQ))
16221621
return X;
1623-
if (Value *X = simplifyAndOfICmpsWithAdd(Op1, Op0, IIQ))
1622+
if (Value *X = simplifyAndOfICmpsWithAdd(Op1, Op0, Q.IIQ))
16241623
return X;
16251624

16261625
return nullptr;
@@ -1674,11 +1673,10 @@ static Value *simplifyOrOfICmpsWithAdd(ICmpInst *Op0, ICmpInst *Op1,
16741673
}
16751674

16761675
static Value *simplifyOrOfICmps(ICmpInst *Op0, ICmpInst *Op1,
1677-
const InstrInfoQuery &IIQ,
1678-
const DataLayout &DL) {
1679-
if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/false, DL))
1676+
const SimplifyQuery &Q) {
1677+
if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/false, Q))
16801678
return X;
1681-
if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/false, DL))
1679+
if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/false, Q))
16821680
return X;
16831681

16841682
if (Value *X = simplifyOrOfICmpsWithSameOperands(Op0, Op1))
@@ -1692,9 +1690,9 @@ static Value *simplifyOrOfICmps(ICmpInst *Op0, ICmpInst *Op1,
16921690
if (Value *X = simplifyAndOrOfICmpsWithZero(Op0, Op1, false))
16931691
return X;
16941692

1695-
if (Value *X = simplifyOrOfICmpsWithAdd(Op0, Op1, IIQ))
1693+
if (Value *X = simplifyOrOfICmpsWithAdd(Op0, Op1, Q.IIQ))
16961694
return X;
1697-
if (Value *X = simplifyOrOfICmpsWithAdd(Op1, Op0, IIQ))
1695+
if (Value *X = simplifyOrOfICmpsWithAdd(Op1, Op0, Q.IIQ))
16981696
return X;
16991697

17001698
return nullptr;
@@ -1753,8 +1751,8 @@ static Value *simplifyAndOrOfCmps(const SimplifyQuery &Q,
17531751
auto *ICmp0 = dyn_cast<ICmpInst>(Op0);
17541752
auto *ICmp1 = dyn_cast<ICmpInst>(Op1);
17551753
if (ICmp0 && ICmp1)
1756-
V = IsAnd ? simplifyAndOfICmps(ICmp0, ICmp1, Q.IIQ, Q.DL)
1757-
: simplifyOrOfICmps(ICmp0, ICmp1, Q.IIQ, Q.DL);
1754+
V = IsAnd ? simplifyAndOfICmps(ICmp0, ICmp1, Q)
1755+
: simplifyOrOfICmps(ICmp0, ICmp1, Q);
17581756

17591757
auto *FCmp0 = dyn_cast<FCmpInst>(Op0);
17601758
auto *FCmp1 = dyn_cast<FCmpInst>(Op1);

llvm/test/Transforms/InstSimplify/redundant-null-check-in-uadd_with_overflow-of-nonnull-ptr.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,8 @@ define i1 @t16(i64 %base, i64 %offset) {
251251
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[BASE:%.*]], 0
252252
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
253253
; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE]], [[OFFSET:%.*]]
254-
; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp ne i64 [[ADJUSTED]], 0
255254
; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp uge i64 [[ADJUSTED]], [[BASE]]
256-
; CHECK-NEXT: [[RES:%.*]] = and i1 [[NON_NULL_AFTER_ADJUSTMENT]], [[NO_OVERFLOW_DURING_ADJUSTMENT]]
257-
; CHECK-NEXT: ret i1 [[RES]]
255+
; CHECK-NEXT: ret i1 [[NO_OVERFLOW_DURING_ADJUSTMENT]]
258256
;
259257
%cmp = icmp slt i64 %base, 0
260258
call void @llvm.assume(i1 %cmp)

0 commit comments

Comments
 (0)