summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgor Bogatov <egorbo@gmail.com>2024-03-02 15:16:49 +0100
committerGitHub <noreply@github.com>2024-03-02 15:16:49 +0100
commit565e6d025398793daffa76e7d2f7d28e02423b51 (patch)
tree2043b9e45ace30f67f8241f18a1c92d191ba420f
parent70bb372b45a15eb1b6a81ad8444e0d60d8521b4b (diff)
Use VN instead of GenTree in optGlobalAssertionIsEqualOrNotEqual (#99182)
-rw-r--r--src/coreclr/jit/assertionprop.cpp22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/coreclr/jit/assertionprop.cpp b/src/coreclr/jit/assertionprop.cpp
index 5d69c8d1bdd9..6b03f2cbdfc6 100644
--- a/src/coreclr/jit/assertionprop.cpp
+++ b/src/coreclr/jit/assertionprop.cpp
@@ -4216,20 +4216,20 @@ AssertionIndex Compiler::optGlobalAssertionIsEqualOrNotEqual(ASSERT_VALARG_TP as
return assertionIndex;
}
- // Look for matching exact type assertions based on vtable accesses
+ // Look for matching exact type assertions based on vtable accesses. E.g.:
+ //
+ // op1: VNF_InvariantLoad(myObj) or in other words: a vtable access
+ // op2: 'MyType' class handle
+ // Assertion: 'myObj's type is exactly MyType
+ //
if ((curAssertion->assertionKind == OAK_EQUAL) && (curAssertion->op1.kind == O1K_EXACT_TYPE) &&
- op1->OperIs(GT_IND))
+ (curAssertion->op2.vn == vnStore->VNConservativeNormalValue(op2->gtVNPair)) && op1->TypeIs(TYP_I_IMPL))
{
- GenTree* indirAddr = op1->AsIndir()->Addr();
-
- if (indirAddr->OperIs(GT_LCL_VAR) && (indirAddr->TypeGet() == TYP_REF))
+ VNFuncApp funcApp;
+ if (vnStore->GetVNFunc(vnStore->VNConservativeNormalValue(op1->gtVNPair), &funcApp) &&
+ (funcApp.m_func == VNF_InvariantLoad) && (curAssertion->op1.vn == funcApp.m_args[0]))
{
- // op1 is accessing vtable of a ref type local var
- if ((curAssertion->op1.vn == vnStore->VNConservativeNormalValue(indirAddr->gtVNPair)) &&
- (curAssertion->op2.vn == vnStore->VNConservativeNormalValue(op2->gtVNPair)))
- {
- return assertionIndex;
- }
+ return assertionIndex;
}
}
}