Skip to content

Commit 359c40a

Browse files
committed
[ValueTracking] Handle icmp pred (trunc X), C in computeKnownBitsFromCmp
1 parent a844e19 commit 359c40a

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -724,10 +724,22 @@ static void computeKnownBitsFromCond(const Value *V, Value *Cond,
724724
Known = Known.unionWith(Known2);
725725
}
726726

727-
if (auto *Cmp = dyn_cast<ICmpInst>(Cond))
728-
computeKnownBitsFromCmp(
729-
V, Invert ? Cmp->getInversePredicate() : Cmp->getPredicate(),
730-
Cmp->getOperand(0), Cmp->getOperand(1), Known, SQ);
727+
if (auto *Cmp = dyn_cast<ICmpInst>(Cond)) {
728+
ICmpInst::Predicate Pred =
729+
Invert ? Cmp->getInversePredicate() : Cmp->getPredicate();
730+
Value *LHS = Cmp->getOperand(0);
731+
Value *RHS = Cmp->getOperand(1);
732+
733+
// Handle icmp pred (trunc V), C
734+
if (match(LHS, m_Trunc(m_Specific(V)))) {
735+
KnownBits DstKnown(LHS->getType()->getScalarSizeInBits());
736+
computeKnownBitsFromCmp(LHS, Pred, LHS, RHS, DstKnown, SQ);
737+
Known = Known.unionWith(DstKnown.anyext(Known.getBitWidth()));
738+
return;
739+
}
740+
741+
computeKnownBitsFromCmp(V, Pred, LHS, RHS, Known, SQ);
742+
}
731743
}
732744

733745
void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
@@ -9111,7 +9123,7 @@ addValueAffectedByCondition(Value *V,
91119123

91129124
// Peek through unary operators to find the source of the condition.
91139125
Value *Op;
9114-
if (match(I, m_PtrToInt(m_Value(Op)))) {
9126+
if (match(I, m_CombineOr(m_PtrToInt(m_Value(Op)), m_Trunc(m_Value(Op))))) {
91159127
if (isa<Instruction>(Op) || isa<Argument>(Op))
91169128
InsertAffected(Op);
91179129
}

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

Lines changed: 7 additions & 9 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,9 +371,8 @@ define i64 @test_icmp_trunc2(i64 %x) {
372371
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CONV]], 12
373372
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
374373
; CHECK: if.then:
375-
; CHECK-NEXT: [[SEXT:%.*]] = shl i64 [[X]], 32
376-
; CHECK-NEXT: [[RET:%.*]] = ashr exact i64 [[SEXT]], 32
377-
; CHECK-NEXT: ret i64 [[RET]]
374+
; CHECK-NEXT: [[SEXT:%.*]] = and i64 [[X]], 2147483647
375+
; CHECK-NEXT: ret i64 [[SEXT]]
378376
; CHECK: if.else:
379377
; CHECK-NEXT: ret i64 0
380378
;
@@ -397,7 +395,7 @@ define i64 @test_icmp_trunc3(i64 %n) {
397395
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 96
398396
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
399397
; CHECK: if.then:
400-
; CHECK-NEXT: [[RET:%.*]] = and i64 [[N]], 4294967295
398+
; CHECK-NEXT: [[RET:%.*]] = and i64 [[N]], 127
401399
; CHECK-NEXT: ret i64 [[RET]]
402400
; CHECK: if.else:
403401
; CHECK-NEXT: ret i64 0
@@ -422,7 +420,7 @@ define i8 @test_icmp_trunc4(i64 %n) {
422420
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
423421
; CHECK: if.then:
424422
; CHECK-NEXT: [[CONV2:%.*]] = trunc i64 [[N]] to i8
425-
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[CONV2]], 48
423+
; CHECK-NEXT: [[ADD:%.*]] = or disjoint i8 [[CONV2]], 48
426424
; CHECK-NEXT: ret i8 [[ADD]]
427425
; CHECK: if.else:
428426
; CHECK-NEXT: ret i8 0
@@ -448,8 +446,8 @@ define i64 @test_icmp_trunc5(i64 %n) {
448446
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CONV1]], -13
449447
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
450448
; CHECK: if.then:
451-
; CHECK-NEXT: [[AND:%.*]] = and i64 [[SHR]], 4294967295
452-
; CHECK-NEXT: [[NOT:%.*]] = xor i64 [[AND]], 4294967295
449+
; CHECK-NEXT: [[TMP0:%.*]] = and i64 [[SHR]], 15
450+
; CHECK-NEXT: [[NOT:%.*]] = xor i64 [[TMP0]], 15
453451
; CHECK-NEXT: ret i64 [[NOT]]
454452
; CHECK: if.else:
455453
; CHECK-NEXT: ret i64 13

0 commit comments

Comments
 (0)