Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 5 additions & 12 deletions src/coreclr/jit/assertionprop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down
Loading