Skip to content

Commit 9e0077c

Browse files
authored
[ValueTracking] Handle not in dominating condition. (#126423)
General handling of not in dominating condition. proof: https://alive2.llvm.org/ce/z/FjJN8q
1 parent e42fdcb commit 9e0077c

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

llvm/lib/Analysis/ValueTracking.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,9 @@ static void computeKnownBitsFromCond(const Value *V, Value *Cond,
801801

802802
if (auto *Cmp = dyn_cast<ICmpInst>(Cond))
803803
computeKnownBitsFromICmpCond(V, Cmp, Known, SQ, Invert);
804+
805+
if (Depth < MaxAnalysisRecursionDepth && match(Cond, m_Not(m_Value(A))))
806+
computeKnownBitsFromCond(V, A, Known, Depth + 1, SQ, !Invert);
804807
}
805808

806809
void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
@@ -4934,6 +4937,11 @@ static void computeKnownFPClassFromCond(const Value *V, Value *Cond,
49344937
KnownFromContext);
49354938
return;
49364939
}
4940+
if (Depth < MaxAnalysisRecursionDepth && match(Cond, m_Not(m_Value(A)))) {
4941+
computeKnownFPClassFromCond(V, A, Depth + 1, !CondIsTrue, CxtI,
4942+
KnownFromContext);
4943+
return;
4944+
}
49374945
CmpPredicate Pred;
49384946
Value *LHS;
49394947
uint64_t ClassVal = 0;
@@ -10272,6 +10280,9 @@ void llvm::findValuesAffectedByCondition(
1027210280
m_Value()))) {
1027310281
// Handle patterns that computeKnownFPClass() support.
1027410282
AddAffected(A);
10283+
} else if (!IsAssume && match(V, m_Not(m_Value(X)))) {
10284+
// Assume is checked here to avoid issues with ephemeral values
10285+
Worklist.push_back(X);
1027510286
}
1027610287
}
1027710288
}

llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll

+1-2
Original file line numberDiff line numberDiff line change
@@ -528,8 +528,7 @@ define i1 @test_inv_and(float %x, i1 %cond2) {
528528
; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND2]], [[NOT]]
529529
; CHECK-NEXT: br i1 [[AND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
530530
; CHECK: if.then:
531-
; CHECK-NEXT: [[RET1:%.*]] = fcmp oeq float [[X]], 0x7FF0000000000000
532-
; CHECK-NEXT: ret i1 [[RET1]]
531+
; CHECK-NEXT: ret i1 false
533532
; CHECK: if.else:
534533
; CHECK-NEXT: ret i1 false
535534
;

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -2374,8 +2374,7 @@ define i8 @test_inv_cond_and(i8 %x, i1 %c) {
23742374
; CHECK-NEXT: [[COND:%.*]] = and i1 [[C:%.*]], [[NOT]]
23752375
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
23762376
; CHECK: if:
2377-
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4
2378-
; CHECK-NEXT: ret i8 [[OR1]]
2377+
; CHECK-NEXT: ret i8 -4
23792378
; CHECK: exit:
23802379
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4
23812380
; CHECK-NEXT: ret i8 [[OR2]]

0 commit comments

Comments
 (0)