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 fa07e6037826d31a0915fa74e35026a9d06e51f5..8383adc70429d7898de7351120626b82b7ada7bb 100644 |
--- a/runtime/vm/flow_graph_range_analysis.h |
+++ b/runtime/vm/flow_graph_range_analysis.h |
@@ -490,6 +490,10 @@ class RangeUtils : public AllStatic { |
static bool IsWithin(Range* range, int64_t min, int64_t max) { |
return !Range::IsUnknown(range) && range->IsWithin(min, max); |
} |
+ |
+ static bool IsPositive(Range* range) { |
+ return !Range::IsUnknown(range) && range->IsPositive(); |
+ } |
}; |
@@ -510,6 +514,14 @@ class RangeAnalysis : public ValueObject { |
// as a reaching type. |
const Range* GetSmiRange(Value* value) const; |
+ static bool IsIntegerDefinition(Definition* defn) { |
+ return (defn->Type()->ToCid() == kSmiCid) || |
+ defn->IsMintDefinition() || |
+ defn->IsInt32Definition(); |
+ } |
+ |
+ void AssignRangesRecursively(Definition* defn); |
+ |
private: |
enum JoinOperator { |
NONE, |
@@ -539,7 +551,7 @@ class RangeAnalysis : public ValueObject { |
Range* constraint, |
Instruction* after); |
- void ConstrainValueAfterBranch(Value* use, Definition* defn); |
+ bool ConstrainValueAfterBranch(Value* use, Definition* defn); |
void ConstrainValueAfterCheckArrayBound(Value* use, Definition* defn); |
// Replace uses of the definition def that are dominated by instruction dom |
@@ -553,7 +565,7 @@ class RangeAnalysis : public ValueObject { |
void InferRanges(); |
// Collect integer definition in the reverse postorder. |
- void CollectDefinitions(BlockEntryInstr* block, BitVector* set); |
+ void CollectDefinitions(BitVector* set); |
// Recompute ranges of all definitions until they stop changing. |
// Apply the given JoinOperator when computing Phi ranges. |
@@ -570,6 +582,8 @@ class RangeAnalysis : public ValueObject { |
// Convert mint operations that stay within int32 range into Int32 operations. |
void NarrowMintToInt32(); |
+ void DiscoverSimpleInductionVariables(); |
+ |
// Remove artificial Constraint instructions and replace them with actual |
// unconstrained definitions. |
void RemoveConstraints(); |