@@ -143,6 +143,7 @@ int RangeCheck::GetArrLength(ValueNum vn)
143
143
bool RangeCheck::BetweenBounds (Range& range, GenTree* upper, int arrSize)
144
144
{
145
145
#ifdef DEBUG
146
+ assert (range.IsValid ());
146
147
if (m_pCompiler->verbose )
147
148
{
148
149
printf (" %s BetweenBounds <%d, " , range.ToString (m_pCompiler), 0 );
@@ -354,6 +355,8 @@ void RangeCheck::OptimizeRangeCheck(BasicBlock* block, Statement* stmt, GenTree*
354
355
Range arrLenRange = GetRangeWorker (block, bndsChk->GetArrayLength (), false DEBUGARG (0 ));
355
356
if (arrLenRange.LowerLimit ().IsConstant ())
356
357
{
358
+ assert (arrLenRange.IsValid ());
359
+
357
360
// Lower known limit of ArrLen:
358
361
const int lenLowerLimit = arrLenRange.LowerLimit ().GetConstant ();
359
362
@@ -394,6 +397,8 @@ void RangeCheck::OptimizeRangeCheck(BasicBlock* block, Statement* stmt, GenTree*
394
397
return ;
395
398
}
396
399
400
+ assert (range.IsValid ());
401
+
397
402
// If upper or lower limit is found to be unknown (top), or it was found to
398
403
// be unknown because of over budget or a deep search, then return early.
399
404
if (range.UpperLimit ().IsUnknown () || range.LowerLimit ().IsUnknown ())
@@ -638,6 +643,7 @@ void RangeCheck::MergeEdgeAssertions(GenTreeLclVarCommon* lcl, ASSERT_VALARG_TP
638
643
bool RangeCheck::TryGetRangeFromAssertions (Compiler* comp, ValueNum num, ASSERT_VALARG_TP assertions, Range* pRange)
639
644
{
640
645
MergeEdgeAssertions (comp, num, ValueNumStore::NoVN, assertions, pRange, false );
646
+ assert (pRange->IsValid ());
641
647
return !pRange->LowerLimit ().IsUnknown () || !pRange->UpperLimit ().IsUnknown ();
642
648
}
643
649
@@ -1003,13 +1009,29 @@ void RangeCheck::MergeEdgeAssertions(Compiler* comp,
1003
1009
unreached ();
1004
1010
};
1005
1011
1012
+ if (!assertedRange.IsValid ())
1013
+ {
1014
+ JITDUMP (" assertedRange is invalid: [%s] - bail out\n " , assertedRange.ToString (comp));
1015
+ return ;
1016
+ }
1017
+
1006
1018
JITDUMP (" Tightening pRange: [%s] with assertedRange: [%s] into " , pRange->ToString (comp),
1007
1019
assertedRange.ToString (comp));
1008
1020
1009
- pRange->lLimit = tightenLimit (assertedRange.lLimit , pRange->lLimit , preferredBoundVN, true );
1010
- pRange->uLimit = tightenLimit (assertedRange.uLimit , pRange->uLimit , preferredBoundVN, false );
1021
+ Range copy = *pRange;
1022
+ copy.lLimit = tightenLimit (assertedRange.lLimit , copy.lLimit , preferredBoundVN, true );
1023
+ copy.uLimit = tightenLimit (assertedRange.uLimit , copy.uLimit , preferredBoundVN, false );
1011
1024
1012
- JITDUMP (" [%s]\n " , pRange->ToString (comp));
1025
+ JITDUMP (" [%s]\n " , copy.ToString (comp));
1026
+ if (copy.IsValid ())
1027
+ {
1028
+ *pRange = copy;
1029
+ }
1030
+ else
1031
+ {
1032
+ JITDUMP (" invalid range after tightening\n " );
1033
+ return ;
1034
+ }
1013
1035
}
1014
1036
}
1015
1037
@@ -1200,6 +1222,9 @@ Range RangeCheck::ComputeRangeForBinOp(BasicBlock* block, GenTreeOp* binop, bool
1200
1222
op2Range = *op2RangeCached;
1201
1223
}
1202
1224
1225
+ assert (op1Range.IsValid ());
1226
+ assert (op2Range.IsValid ());
1227
+
1203
1228
Range r = Range (Limit::keUnknown);
1204
1229
if (binop->OperIs (GT_ADD))
1205
1230
{
@@ -1227,6 +1252,13 @@ Range RangeCheck::ComputeRangeForBinOp(BasicBlock* block, GenTreeOp* binop, bool
1227
1252
JITDUMP (" Right shift range: %s >> %s = %s\n " , op1Range.ToString (m_pCompiler), op2Range.ToString (m_pCompiler),
1228
1253
r.ToString (m_pCompiler));
1229
1254
}
1255
+
1256
+ // Some binops may produce invalid ranges, e.g. <0, 1> * <-1, -1> = <0, -1>
1257
+ if (!r.IsValid ())
1258
+ {
1259
+ JITDUMP (" BinOp range is invalid: %s\n " , r.ToString (m_pCompiler));
1260
+ return Range (Limit::keUnknown);
1261
+ }
1230
1262
return r;
1231
1263
}
1232
1264
@@ -1715,6 +1747,7 @@ bool RangeCheck::TryGetRange(BasicBlock* block, GenTree* expr, Range* pRange)
1715
1747
ClearSearchPath ();
1716
1748
1717
1749
Range range = GetRangeWorker (block, expr, false DEBUGARG (0 ));
1750
+ assert (range.IsValid ());
1718
1751
if (range.UpperLimit ().IsUnknown () && range.LowerLimit ().IsUnknown ())
1719
1752
{
1720
1753
JITDUMP (" Range is completely unknown.\n " );
0 commit comments