diff --git a/src/coreclr/jit/assertionprop.cpp b/src/coreclr/jit/assertionprop.cpp index d51d8d852e2241..359a8c69cc526b 100644 --- a/src/coreclr/jit/assertionprop.cpp +++ b/src/coreclr/jit/assertionprop.cpp @@ -4691,19 +4691,12 @@ GenTree* Compiler::optAssertionPropGlobal_RelOp(ASSERT_VALARG_TP assertions, return nullptr; } - // See if we have "PHI ==/!= null" tree. If so, we iterate over all PHI's arguments, - // and if all of them are known to be non-null, we can bash the comparison to true/false. - if (op2->IsIntegralConst(0) && op1->TypeIs(TYP_REF)) + // Use non-null assertions for the address or its base, including across PHIs. + if (op2->IsIntegralConst(0) && varTypeIsI(op1)) { - JITDUMP("Checking PHI [%06u] arguments for non-nullness\n", dspTreeID(op1)) - auto visitor = [this](ValueNum reachingVN, ASSERT_TP reachingAssertions) { - return optAssertionVNIsNonNull(reachingVN, reachingAssertions) ? AssertVisit::Continue : AssertVisit::Abort; - }; - - ValueNum op1vn = vnStore->VNConservativeNormalValue(op1->gtVNPair); - if (optVisitReachingAssertions(op1vn, visitor) == AssertVisit::Continue) + if (optAssertionVNIsNonNull(op1VN, assertions)) { - JITDUMP("... all of PHI's arguments are never null!\n"); + JITDUMP("Proved [%06u] non-null\n", dspTreeID(op1)); assert(newTree->OperIs(GT_EQ, GT_NE)); newTree = tree->OperIs(GT_EQ) ? gtNewIconNode(0) : gtNewIconNode(1); return optAssertionProp_Update(newTree, tree, stmt); @@ -5277,7 +5270,7 @@ bool Compiler::optAssertionIsNonNull(GenTree* op, ASSERT_VALARG_TP assertions) // bool Compiler::optAssertionVNIsNonNull(ValueNum vn, ASSERT_VALARG_TP assertions, int budget) { - if (vn == ValueNumStore::NoVN) + if ((vn == ValueNumStore::NoVN) || !varTypeIsI(vnStore->TypeOfVN(vn))) { return false; }