Skip to content

Commit 114a7df

Browse files
committed
[ValueTracking] Handle icmp pred (trunc X), C in computeKnownBitsFromCmp
1 parent cd2d469 commit 114a7df

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,25 @@ static void computeKnownBitsFromCmp(const Value *V, CmpInst::Predicate Pred,
708708
}
709709
}
710710

711+
static void computeKnownBitsFromICmpCond(const Value *V, ICmpInst *Cmp,
712+
KnownBits &Known,
713+
const SimplifyQuery &SQ, bool Invert) {
714+
ICmpInst::Predicate Pred =
715+
Invert ? Cmp->getInversePredicate() : Cmp->getPredicate();
716+
Value *LHS = Cmp->getOperand(0);
717+
Value *RHS = Cmp->getOperand(1);
718+
719+
// Handle icmp pred (trunc V), C
720+
if (match(LHS, m_Trunc(m_Specific(V)))) {
721+
KnownBits DstKnown(LHS->getType()->getScalarSizeInBits());
722+
computeKnownBitsFromCmp(LHS, Pred, LHS, RHS, DstKnown, SQ);
723+
Known = Known.unionWith(DstKnown.anyext(Known.getBitWidth()));
724+
return;
725+
}
726+
727+
computeKnownBitsFromCmp(V, Pred, LHS, RHS, Known, SQ);
728+
}
729+
711730
static void computeKnownBitsFromCond(const Value *V, Value *Cond,
712731
KnownBits &Known, unsigned Depth,
713732
const SimplifyQuery &SQ, bool Invert) {
@@ -727,9 +746,7 @@ static void computeKnownBitsFromCond(const Value *V, Value *Cond,
727746
}
728747

729748
if (auto *Cmp = dyn_cast<ICmpInst>(Cond))
730-
computeKnownBitsFromCmp(
731-
V, Invert ? Cmp->getInversePredicate() : Cmp->getPredicate(),
732-
Cmp->getOperand(0), Cmp->getOperand(1), Known, SQ);
749+
computeKnownBitsFromICmpCond(V, Cmp, Known, SQ, Invert);
733750
}
734751

735752
void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
@@ -815,8 +832,7 @@ void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
815832
if (!isValidAssumeForContext(I, Q.CxtI, Q.DT))
816833
continue;
817834

818-
computeKnownBitsFromCmp(V, Cmp->getPredicate(), Cmp->getOperand(0),
819-
Cmp->getOperand(1), Known, Q);
835+
computeKnownBitsFromICmpCond(V, Cmp, Known, Q, /*Invert=*/false);
820836
}
821837

822838
// Conflicting assumption: Undefined behavior will occur on this execution
@@ -9133,7 +9149,7 @@ addValueAffectedByCondition(Value *V,
91339149

91349150
// Peek through unary operators to find the source of the condition.
91359151
Value *Op;
9136-
if (match(I, m_PtrToInt(m_Value(Op)))) {
9152+
if (match(I, m_CombineOr(m_PtrToInt(m_Value(Op)), m_Trunc(m_Value(Op))))) {
91379153
if (isa<Instruction>(Op) || isa<Argument>(Op))
91389154
InsertAffected(Op);
91399155
}

llvm/test/Transforms/InstCombine/known-bits.ll

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,7 @@ define i32 @test_icmp_trunc1(i32 %x){
350350
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[Y]], 7
351351
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
352352
; CHECK: then:
353-
; CHECK-NEXT: [[Z:%.*]] = and i32 [[X]], 15
354-
; CHECK-NEXT: ret i32 [[Z]]
353+
; CHECK-NEXT: ret i32 7
355354
; CHECK: else:
356355
; CHECK-NEXT: ret i32 0
357356
;
@@ -372,8 +371,7 @@ define i32 @test_icmp_trunc_assume(i32 %x){
372371
; CHECK-NEXT: [[Y:%.*]] = trunc i32 [[X:%.*]] to i16
373372
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[Y]], 7
374373
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
375-
; CHECK-NEXT: [[Z:%.*]] = and i32 [[X]], 15
376-
; CHECK-NEXT: ret i32 [[Z]]
374+
; CHECK-NEXT: ret i32 7
377375
;
378376
entry:
379377
%y = trunc i32 %x to i16
@@ -389,9 +387,8 @@ define i64 @test_icmp_trunc2(i64 %x) {
389387
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CONV]], 12
390388
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
391389
; CHECK: if.then:
392-
; CHECK-NEXT: [[SEXT:%.*]] = shl i64 [[X]], 32
393-
; CHECK-NEXT: [[RET:%.*]] = ashr exact i64 [[SEXT]], 32
394-
; CHECK-NEXT: ret i64 [[RET]]
390+
; CHECK-NEXT: [[SEXT:%.*]] = and i64 [[X]], 2147483647
391+
; CHECK-NEXT: ret i64 [[SEXT]]
395392
; CHECK: if.else:
396393
; CHECK-NEXT: ret i64 0
397394
;
@@ -414,7 +411,7 @@ define i64 @test_icmp_trunc3(i64 %n) {
414411
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 96
415412
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
416413
; CHECK: if.then:
417-
; CHECK-NEXT: [[RET:%.*]] = and i64 [[N]], 4294967295
414+
; CHECK-NEXT: [[RET:%.*]] = and i64 [[N]], 127
418415
; CHECK-NEXT: ret i64 [[RET]]
419416
; CHECK: if.else:
420417
; CHECK-NEXT: ret i64 0
@@ -439,7 +436,7 @@ define i8 @test_icmp_trunc4(i64 %n) {
439436
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
440437
; CHECK: if.then:
441438
; CHECK-NEXT: [[CONV2:%.*]] = trunc i64 [[N]] to i8
442-
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[CONV2]], 48
439+
; CHECK-NEXT: [[ADD:%.*]] = or disjoint i8 [[CONV2]], 48
443440
; CHECK-NEXT: ret i8 [[ADD]]
444441
; CHECK: if.else:
445442
; CHECK-NEXT: ret i8 0
@@ -465,8 +462,8 @@ define i64 @test_icmp_trunc5(i64 %n) {
465462
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CONV1]], -13
466463
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
467464
; CHECK: if.then:
468-
; CHECK-NEXT: [[AND:%.*]] = and i64 [[SHR]], 4294967295
469-
; CHECK-NEXT: [[NOT:%.*]] = xor i64 [[AND]], 4294967295
465+
; CHECK-NEXT: [[TMP0:%.*]] = and i64 [[SHR]], 15
466+
; CHECK-NEXT: [[NOT:%.*]] = xor i64 [[TMP0]], 15
470467
; CHECK-NEXT: ret i64 [[NOT]]
471468
; CHECK: if.else:
472469
; CHECK-NEXT: ret i64 13

0 commit comments

Comments
 (0)