diff --git a/src/coreclr/jit/assertionprop.cpp b/src/coreclr/jit/assertionprop.cpp index 793c7944791049..5e7d35b8255bf4 100644 --- a/src/coreclr/jit/assertionprop.cpp +++ b/src/coreclr/jit/assertionprop.cpp @@ -4589,7 +4589,7 @@ GenTree* Compiler::optAssertionProp_Comma(ASSERT_VALARG_TP assertions, GenTree* // GenTree* Compiler::optAssertionProp_Ind(ASSERT_VALARG_TP assertions, GenTree* tree, Statement* stmt) { - assert(tree->OperIsIndir()); + assert(tree->OperIsIndirOrArrMetaData()); bool updated = optNonNullAssertionProp_Ind(assertions, tree); if (tree->OperIs(GT_STOREIND)) @@ -4776,14 +4776,14 @@ GenTree* Compiler::optNonNullAssertionProp_Call(ASSERT_VALARG_TP assertions, Gen // bool Compiler::optNonNullAssertionProp_Ind(ASSERT_VALARG_TP assertions, GenTree* indir) { - assert(indir->OperIsIndir()); + assert(indir->OperIsIndirOrArrMetaData()); if ((indir->gtFlags & GTF_EXCEPT) == 0) { return false; } - if (optAssertionIsNonNull(indir->AsIndir()->Addr(), assertions)) + if (optAssertionIsNonNull(indir->GetIndirOrArrMetaDataAddr(), assertions)) { JITDUMP("Non-null assertion prop for indirection [%06d] in " FMT_BB ":\n", dspTreeID(indir), compCurBB->bbNum); @@ -5296,6 +5296,17 @@ GenTree* Compiler::optAssertionProp(ASSERT_VALARG_TP assertions, GenTree* tree, case GT_UDIV: return optAssertionProp_ModDiv(assertions, tree->AsOp(), stmt, block); + case GT_ARR_LENGTH: + // Unfortunately, doing this in LocalAP produces an asymmetry in exception sets between + // uses/defs that CSE does not manage to make good use of. As a result, some bounds checks are no longer + // removed. + // TODO-CSE: Allow CSE'ing uses with defs if the defs promise a superset of exceptions + if (!optLocalAssertionProp) + { + return optAssertionProp_Ind(assertions, tree, stmt); + } + return nullptr; + case GT_BLK: case GT_IND: case GT_STOREIND: diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index afc628d6c4a2ae..7d4913a1d36ed8 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -7554,6 +7554,9 @@ bool GenTree::OperSupportsOrderingSideEffect() const switch (OperGet()) { + case GT_ARR_LENGTH: + case GT_MDARR_LENGTH: + case GT_MDARR_LOWER_BOUND: case GT_ARR_ADDR: case GT_BOUNDS_CHECK: case GT_IND: diff --git a/src/coreclr/jit/optimizebools.cpp b/src/coreclr/jit/optimizebools.cpp index 24adf6778e5c30..f9ca5451dd56d6 100644 --- a/src/coreclr/jit/optimizebools.cpp +++ b/src/coreclr/jit/optimizebools.cpp @@ -1209,6 +1209,7 @@ void OptBoolsDsc::optOptimizeBoolsUpdateTrees() { m_compiler->gtSetStmtInfo(m_testInfo1.testStmt); m_compiler->fgSetStmtSeq(m_testInfo1.testStmt); + m_compiler->gtUpdateStmtSideEffects(m_testInfo1.testStmt); } /* Modify the target of the conditional jump and update bbRefs and bbPreds */