Skip to content

Commit db1fc57

Browse files
committed
[ValueTracking] Handle icmp pred (trunc X), C in computeKnownBitsFromCmp
1 parent 133c225 commit db1fc57

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

llvm/lib/Analysis/DomConditionCache.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ static void findAffectedValues(Value *Cond,
2727

2828
// Peek through unary operators to find the source of the condition.
2929
Value *Op;
30-
if (match(I, m_PtrToInt(m_Value(Op)))) {
30+
if (match(I,
31+
m_CombineOr(m_PtrToInt(m_Value(Op)), m_Trunc(m_Value(Op))))) {
3132
if (isa<Instruction>(Op) || isa<Argument>(Op))
3233
Affected.push_back(Op);
3334
}

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -717,10 +717,22 @@ static void computeKnownBitsFromCond(const Value *V, Value *Cond,
717717
computeKnownBitsFromCond(V, B, Known, Depth + 1, SQ, Invert);
718718
}
719719

720-
if (auto *Cmp = dyn_cast<ICmpInst>(Cond))
721-
computeKnownBitsFromCmp(
722-
V, Invert ? Cmp->getInversePredicate() : Cmp->getPredicate(),
723-
Cmp->getOperand(0), Cmp->getOperand(1), Known, SQ);
720+
if (auto *Cmp = dyn_cast<ICmpInst>(Cond)) {
721+
ICmpInst::Predicate Pred =
722+
Invert ? Cmp->getInversePredicate() : Cmp->getPredicate();
723+
Value *LHS = Cmp->getOperand(0);
724+
Value *RHS = Cmp->getOperand(1);
725+
726+
// Handle icmp pred (trunc V), C
727+
if (match(LHS, m_Trunc(m_Specific(V)))) {
728+
KnownBits DstKnown(LHS->getType()->getScalarSizeInBits());
729+
computeKnownBitsFromCmp(LHS, Pred, LHS, RHS, DstKnown, SQ);
730+
Known = Known.unionWith(DstKnown.anyext(Known.getBitWidth()));
731+
return;
732+
}
733+
734+
computeKnownBitsFromCmp(V, Pred, LHS, RHS, Known, SQ);
735+
}
724736
}
725737

726738
void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,

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

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,7 @@ define i32 @test_icmp_trunc1(i32 %x){
291291
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[Y]], 7
292292
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
293293
; CHECK: then:
294-
; CHECK-NEXT: [[Z:%.*]] = and i32 [[X]], 15
295-
; CHECK-NEXT: ret i32 [[Z]]
294+
; CHECK-NEXT: ret i32 7
296295
; CHECK: else:
297296
; CHECK-NEXT: ret i32 0
298297
;
@@ -313,9 +312,8 @@ define i64 @test_icmp_trunc2(i64 %x) {
313312
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CONV]], 12
314313
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
315314
; CHECK: if.then:
316-
; CHECK-NEXT: [[SEXT:%.*]] = shl i64 [[X]], 32
317-
; CHECK-NEXT: [[RET:%.*]] = ashr exact i64 [[SEXT]], 32
318-
; CHECK-NEXT: ret i64 [[RET]]
315+
; CHECK-NEXT: [[SEXT:%.*]] = and i64 [[X]], 2147483647
316+
; CHECK-NEXT: ret i64 [[SEXT]]
319317
; CHECK: if.else:
320318
; CHECK-NEXT: ret i64 0
321319
;
@@ -338,7 +336,7 @@ define i64 @test_icmp_trunc3(i64 %n) {
338336
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[CONV]], 96
339337
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
340338
; CHECK: if.then:
341-
; CHECK-NEXT: [[RET:%.*]] = and i64 [[N]], 4294967295
339+
; CHECK-NEXT: [[RET:%.*]] = and i64 [[N]], 127
342340
; CHECK-NEXT: ret i64 [[RET]]
343341
; CHECK: if.else:
344342
; CHECK-NEXT: ret i64 0
@@ -363,7 +361,7 @@ define i8 @test_icmp_trunc4(i64 %n) {
363361
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
364362
; CHECK: if.then:
365363
; CHECK-NEXT: [[CONV2:%.*]] = trunc i64 [[N]] to i8
366-
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[CONV2]], 48
364+
; CHECK-NEXT: [[ADD:%.*]] = or disjoint i8 [[CONV2]], 48
367365
; CHECK-NEXT: ret i8 [[ADD]]
368366
; CHECK: if.else:
369367
; CHECK-NEXT: ret i8 0
@@ -389,8 +387,8 @@ define i64 @test_icmp_trunc5(i64 %n) {
389387
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CONV1]], -13
390388
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
391389
; CHECK: if.then:
392-
; CHECK-NEXT: [[AND:%.*]] = and i64 [[SHR]], 4294967295
393-
; CHECK-NEXT: [[NOT:%.*]] = xor i64 [[AND]], 4294967295
390+
; CHECK-NEXT: [[TMP0:%.*]] = and i64 [[SHR]], 15
391+
; CHECK-NEXT: [[NOT:%.*]] = xor i64 [[TMP0]], 15
394392
; CHECK-NEXT: ret i64 [[NOT]]
395393
; CHECK: if.else:
396394
; CHECK-NEXT: ret i64 13

0 commit comments

Comments
 (0)