Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Unified Diff: runtime/vm/flow_graph_range_analysis.cc

Issue 2891113002: Use same range info when emitting code and computing if instruction can deopt. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/flow_graph_range_analysis.cc
diff --git a/runtime/vm/flow_graph_range_analysis.cc b/runtime/vm/flow_graph_range_analysis.cc
index ba9360352aa6ada659c7343fdff0a1dc3a6949ef..808ecc7cc92a53b2cdbf33dd56451bb49a306a24 100644
--- a/runtime/vm/flow_graph_range_analysis.cc
+++ b/runtime/vm/flow_graph_range_analysis.cc
@@ -2256,6 +2256,12 @@ void Range::Clamp(RangeBoundary::RangeSize size) {
}
+void Range::ClampToConstant(RangeBoundary::RangeSize size) {
+ min_ = min_.LowerBound().Clamp(size);
+ max_ = max_.UpperBound().Clamp(size);
+}
+
+
void Range::Shl(const Range* left,
const Range* right,
RangeBoundary* result_min,
@@ -2886,10 +2892,28 @@ void BinaryIntegerOpInstr::InferRangeHelper(const Range* left_range,
}
+static void CacheRange(Range** slot,
+ const Range* range,
rmacnak 2017/05/18 20:02:45 I see crashes in some tests because range may be n
Vyacheslav Egorov (Google) 2017/05/19 08:07:08 Ooops. Should have rerun tests after refactoring.
+ RangeBoundary::RangeSize size) {
+ if (*slot == NULL) {
+ *slot = new Range();
+ }
+ **slot = *range;
+
+ // Eliminate any symbolic dependencies from the range information.
+ (*slot)->ClampToConstant(size);
+}
+
+
void BinarySmiOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+ const Range* right_smi_range = analysis->GetSmiRange(right());
// TODO(vegorov) completely remove this once GetSmiRange is eliminated.
- InferRangeHelper(analysis->GetSmiRange(left()),
- analysis->GetSmiRange(right()), range);
+ if (op_kind() == Token::kSHR || op_kind() == Token::kSHL ||
+ op_kind() == Token::kMOD || op_kind() == Token::kTRUNCDIV) {
+ CacheRange(&right_range_, right_smi_range,
+ RangeBoundary::kRangeBoundarySmi);
+ }
+ InferRangeHelper(analysis->GetSmiRange(left()), right_smi_range, range);
}
@@ -2906,6 +2930,8 @@ void BinaryMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
void ShiftMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+ CacheRange(&shift_range_, right()->definition()->range(),
+ RangeBoundary::kRangeBoundaryInt64);
InferRangeHelper(left()->definition()->range(),
right()->definition()->range(), range);
}

Powered by Google App Engine
This is Rietveld 408576698