| Index: runtime/vm/flow_graph_range_analysis.h
|
| diff --git a/runtime/vm/flow_graph_range_analysis.h b/runtime/vm/flow_graph_range_analysis.h
|
| index 8383adc70429d7898de7351120626b82b7ada7bb..a140e5024629d6e40769b0fee6ba9d4c3d0e0133 100644
|
| --- a/runtime/vm/flow_graph_range_analysis.h
|
| +++ b/runtime/vm/flow_graph_range_analysis.h
|
| @@ -502,7 +502,8 @@ class RangeAnalysis : public ValueObject {
|
| public:
|
| explicit RangeAnalysis(FlowGraph* flow_graph)
|
| : flow_graph_(flow_graph),
|
| - smi_range_(Range::Full(RangeBoundary::kRangeBoundarySmi)) { }
|
| + smi_range_(Range::Full(RangeBoundary::kRangeBoundarySmi)),
|
| + int64_range_(Range::Full(RangeBoundary::kRangeBoundaryInt64)) { }
|
|
|
| // Infer ranges for all values and remove overflow checks from binary smi
|
| // operations when proven redundant.
|
| @@ -510,14 +511,17 @@ class RangeAnalysis : public ValueObject {
|
|
|
| // Helper that should be used to access ranges of inputs during range
|
| // inference.
|
| - // Returns meaningful results for uses of non-smi definitions that have smi
|
| - // as a reaching type.
|
| + // Returns meaningful results for uses of non-smi/non-int definitions that
|
| + // have smi/int as a reaching type.
|
| + // For Int typed definitions we use full Int64 range as a safe approximation
|
| + // even though they might contain Bigint values because we only support
|
| + // 64-bit operations in the optimized code - which means that Bigint will
|
| + // cause deoptimization.
|
| const Range* GetSmiRange(Value* value) const;
|
| + const Range* GetIntRange(Value* value) const;
|
|
|
| static bool IsIntegerDefinition(Definition* defn) {
|
| - return (defn->Type()->ToCid() == kSmiCid) ||
|
| - defn->IsMintDefinition() ||
|
| - defn->IsInt32Definition();
|
| + return defn->Type()->IsInt();
|
| }
|
|
|
| void AssignRangesRecursively(Definition* defn);
|
| @@ -597,6 +601,8 @@ class RangeAnalysis : public ValueObject {
|
| // Range object representing full Smi range.
|
| Range smi_range_;
|
|
|
| + Range int64_range_;
|
| +
|
| // Value that are known to be smi or mint.
|
| GrowableArray<Definition*> values_;
|
|
|
|
|