diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 8a9ad55366ee7..fb744d61aad63 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -801,6 +801,9 @@ static void computeKnownBitsFromCond(const Value *V, Value *Cond, if (auto *Cmp = dyn_cast(Cond)) computeKnownBitsFromICmpCond(V, Cmp, Known, SQ, Invert); + + if (Depth < MaxAnalysisRecursionDepth && match(Cond, m_Not(m_Value(A)))) + computeKnownBitsFromCond(V, A, Known, Depth + 1, SQ, !Invert); } void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known, @@ -4934,6 +4937,11 @@ static void computeKnownFPClassFromCond(const Value *V, Value *Cond, KnownFromContext); return; } + if (Depth < MaxAnalysisRecursionDepth && match(Cond, m_Not(m_Value(A)))) { + computeKnownFPClassFromCond(V, A, Depth + 1, !CondIsTrue, CxtI, + KnownFromContext); + return; + } CmpPredicate Pred; Value *LHS; uint64_t ClassVal = 0; @@ -10272,6 +10280,9 @@ void llvm::findValuesAffectedByCondition( m_Value()))) { // Handle patterns that computeKnownFPClass() support. AddAffected(A); + } else if (!IsAssume && match(V, m_Not(m_Value(X)))) { + // Assume is checked here to avoid issues with ephemeral values + Worklist.push_back(X); } } } diff --git a/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll b/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll index e6df7fab356b4..934852d1ca8bc 100644 --- a/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll +++ b/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll @@ -528,8 +528,7 @@ define i1 @test_inv_and(float %x, i1 %cond2) { ; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND2]], [[NOT]] ; CHECK-NEXT: br i1 [[AND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; CHECK: if.then: -; CHECK-NEXT: [[RET1:%.*]] = fcmp oeq float [[X]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[RET1]] +; CHECK-NEXT: ret i1 false ; CHECK: if.else: ; CHECK-NEXT: ret i1 false ; diff --git a/llvm/test/Transforms/InstCombine/known-bits.ll b/llvm/test/Transforms/InstCombine/known-bits.ll index 7563a63f607f0..b729cbd971acc 100644 --- a/llvm/test/Transforms/InstCombine/known-bits.ll +++ b/llvm/test/Transforms/InstCombine/known-bits.ll @@ -2374,8 +2374,7 @@ define i8 @test_inv_cond_and(i8 %x, i1 %c) { ; CHECK-NEXT: [[COND:%.*]] = and i1 [[C:%.*]], [[NOT]] ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]] ; CHECK: if: -; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -4 -; CHECK-NEXT: ret i8 [[OR1]] +; CHECK-NEXT: ret i8 -4 ; CHECK: exit: ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -4 ; CHECK-NEXT: ret i8 [[OR2]]