diff options
author | Egor Bogatov <egorbo@gmail.com> | 2024-03-02 15:16:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-02 15:16:49 +0100 |
commit | 565e6d025398793daffa76e7d2f7d28e02423b51 (patch) | |
tree | 2043b9e45ace30f67f8241f18a1c92d191ba420f | |
parent | 70bb372b45a15eb1b6a81ad8444e0d60d8521b4b (diff) |
Use VN instead of GenTree in optGlobalAssertionIsEqualOrNotEqual (#99182)
-rw-r--r-- | src/coreclr/jit/assertionprop.cpp | 22 |
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; } } } |