From 25a762e80e6d5d3e32aaa9169d217a550e8ec123 Mon Sep 17 00:00:00 2001 From: EgorBo Date: Tue, 18 Mar 2025 06:47:46 +0100 Subject: [PATCH] disable checked bounds for assertprop --- src/coreclr/jit/rangecheck.cpp | 27 ++++++++++++++++----------- src/coreclr/jit/rangecheck.h | 8 ++++++-- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/coreclr/jit/rangecheck.cpp b/src/coreclr/jit/rangecheck.cpp index da035fd952559e..7d7e20fde9daff 100644 --- a/src/coreclr/jit/rangecheck.cpp +++ b/src/coreclr/jit/rangecheck.cpp @@ -637,7 +637,7 @@ void RangeCheck::MergeEdgeAssertions(GenTreeLclVarCommon* lcl, ASSERT_VALARG_TP // bool RangeCheck::TryGetRangeFromAssertions(Compiler* comp, ValueNum num, ASSERT_VALARG_TP assertions, Range* pRange) { - MergeEdgeAssertions(comp, num, num, assertions, pRange); + MergeEdgeAssertions(comp, num, ValueNumStore::NoVN, assertions, pRange, false); return !pRange->LowerLimit().IsUnknown() || !pRange->UpperLimit().IsUnknown(); } @@ -645,14 +645,19 @@ bool RangeCheck::TryGetRangeFromAssertions(Compiler* comp, ValueNum num, ASSERT_ // MergeEdgeAssertions: Merge assertions on the edge flowing into the block about a variable // // Arguments: -// comp - the compiler instance -// normalLclVN - the value number to look for assertions for -// preferredBoundVN - when this VN is set, it will be given preference over constant limits -// assertions - the assertions to use -// pRange - the range to tighten with assertions +// comp - the compiler instance +// normalLclVN - the value number to look for assertions for +// preferredBoundVN - when this VN is set, it will be given preference over constant limits +// assertions - the assertions to use +// pRange - the range to tighten with assertions +// canUseCheckedBounds - true if we can use checked bounds assertions (cache) // -void RangeCheck::MergeEdgeAssertions( - Compiler* comp, ValueNum normalLclVN, ValueNum preferredBoundVN, ASSERT_VALARG_TP assertions, Range* pRange) +void RangeCheck::MergeEdgeAssertions(Compiler* comp, + ValueNum normalLclVN, + ValueNum preferredBoundVN, + ASSERT_VALARG_TP assertions, + Range* pRange, + bool canUseCheckedBounds) { Range assertedRange = Range(Limit(Limit::keUnknown)); if (BitVecOps::IsEmpty(comp->apTraits, assertions)) @@ -680,7 +685,7 @@ void RangeCheck::MergeEdgeAssertions( bool isUnsigned = false; // Current assertion is of the form (i < len - cns) != 0 - if (curAssertion->IsCheckedBoundArithBound()) + if (canUseCheckedBounds && curAssertion->IsCheckedBoundArithBound()) { ValueNumStore::CompareCheckedBoundArithInfo info; @@ -709,7 +714,7 @@ void RangeCheck::MergeEdgeAssertions( cmpOper = (genTreeOps)info.cmpOper; } // Current assertion is of the form (i < len) != 0 - else if (curAssertion->IsCheckedBoundBound()) + else if (canUseCheckedBounds && curAssertion->IsCheckedBoundBound()) { ValueNumStore::CompareCheckedBoundArithInfo info; @@ -767,7 +772,7 @@ void RangeCheck::MergeEdgeAssertions( int cnstLimit = (int)curAssertion->op2.u1.iconVal; assert(cnstLimit == comp->vnStore->CoercedConstantValue(curAssertion->op2.vn)); - if ((cnstLimit == 0) && (curAssertion->assertionKind == Compiler::OAK_NOT_EQUAL) && + if ((cnstLimit == 0) && (curAssertion->assertionKind == Compiler::OAK_NOT_EQUAL) && canUseCheckedBounds && comp->vnStore->IsVNCheckedBound(curAssertion->op1.vn)) { // we have arr.Len != 0, so the length must be atleast one diff --git a/src/coreclr/jit/rangecheck.h b/src/coreclr/jit/rangecheck.h index 884687ce35ff9c..d90257a990bc2e 100644 --- a/src/coreclr/jit/rangecheck.h +++ b/src/coreclr/jit/rangecheck.h @@ -728,8 +728,12 @@ class RangeCheck void MergeEdgeAssertions(GenTreeLclVarCommon* lcl, ASSERT_VALARG_TP assertions, Range* pRange); // Inspect the assertions about the current ValueNum to refine pRange - static void MergeEdgeAssertions( - Compiler* comp, ValueNum num, ValueNum preferredBoundVN, ASSERT_VALARG_TP assertions, Range* pRange); + static void MergeEdgeAssertions(Compiler* comp, + ValueNum num, + ValueNum preferredBoundVN, + ASSERT_VALARG_TP assertions, + Range* pRange, + bool canUseCheckedBounds = true); // The maximum possible value of the given "limit". If such a value could not be determined // return "false". For example: CORINFO_Array_MaxLength for array length.