| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_FLOW_GRAPH_RANGE_ANALYSIS_H_ | 5 #ifndef VM_FLOW_GRAPH_RANGE_ANALYSIS_H_ |
| 6 #define VM_FLOW_GRAPH_RANGE_ANALYSIS_H_ | 6 #define VM_FLOW_GRAPH_RANGE_ANALYSIS_H_ |
| 7 | 7 |
| 8 #include "vm/flow_graph.h" | 8 #include "vm/flow_graph.h" |
| 9 #include "vm/intermediate_language.h" | 9 #include "vm/intermediate_language.h" |
| 10 | 10 |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 Range Intersect(const Range* other) const { | 418 Range Intersect(const Range* other) const { |
| 419 return Range(RangeBoundary::IntersectionMin(min(), other->min()), | 419 return Range(RangeBoundary::IntersectionMin(min(), other->min()), |
| 420 RangeBoundary::IntersectionMax(max(), other->max())); | 420 RangeBoundary::IntersectionMax(max(), other->max())); |
| 421 } | 421 } |
| 422 | 422 |
| 423 bool Fits(RangeBoundary::RangeSize size) const { | 423 bool Fits(RangeBoundary::RangeSize size) const { |
| 424 return !min().LowerBound().Overflowed(size) && | 424 return !min().LowerBound().Overflowed(size) && |
| 425 !max().UpperBound().Overflowed(size); | 425 !max().UpperBound().Overflowed(size); |
| 426 } | 426 } |
| 427 | 427 |
| 428 static bool Fits(Range* range, RangeBoundary::RangeSize size) { | |
| 429 return !IsUnknown(range) && range->Fits(size); | |
| 430 } | |
| 431 | |
| 432 // Clamp this to be within size. | 428 // Clamp this to be within size. |
| 433 void Clamp(RangeBoundary::RangeSize size); | 429 void Clamp(RangeBoundary::RangeSize size); |
| 434 | 430 |
| 435 static void Add(const Range* left_range, | 431 static void Add(const Range* left_range, |
| 436 const Range* right_range, | 432 const Range* right_range, |
| 437 RangeBoundary* min, | 433 RangeBoundary* min, |
| 438 RangeBoundary* max, | 434 RangeBoundary* max, |
| 439 Definition* left_defn); | 435 Definition* left_defn); |
| 440 | 436 |
| 441 static void Sub(const Range* left_range, | 437 static void Sub(const Range* left_range, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 const Range* right_range, | 474 const Range* right_range, |
| 479 Definition* left_defn, | 475 Definition* left_defn, |
| 480 Range* result); | 476 Range* result); |
| 481 | 477 |
| 482 private: | 478 private: |
| 483 RangeBoundary min_; | 479 RangeBoundary min_; |
| 484 RangeBoundary max_; | 480 RangeBoundary max_; |
| 485 }; | 481 }; |
| 486 | 482 |
| 487 | 483 |
| 484 class RangeUtils : public AllStatic { |
| 485 public: |
| 486 static bool Fits(Range* range, RangeBoundary::RangeSize size) { |
| 487 return !Range::IsUnknown(range) && range->Fits(size); |
| 488 } |
| 489 |
| 490 static bool IsWithin(Range* range, int64_t min, int64_t max) { |
| 491 return !Range::IsUnknown(range) && range->IsWithin(min, max); |
| 492 } |
| 493 }; |
| 494 |
| 495 |
| 488 // Range analysis for integer values. | 496 // Range analysis for integer values. |
| 489 class RangeAnalysis : public ValueObject { | 497 class RangeAnalysis : public ValueObject { |
| 490 public: | 498 public: |
| 491 explicit RangeAnalysis(FlowGraph* flow_graph) | 499 explicit RangeAnalysis(FlowGraph* flow_graph) |
| 492 : flow_graph_(flow_graph), | 500 : flow_graph_(flow_graph), |
| 493 smi_range_(Range::Full(RangeBoundary::kRangeBoundarySmi)) { } | 501 smi_range_(Range::Full(RangeBoundary::kRangeBoundarySmi)) { } |
| 494 | 502 |
| 495 // Infer ranges for all values and remove overflow checks from binary smi | 503 // Infer ranges for all values and remove overflow checks from binary smi |
| 496 // operations when proven redundant. | 504 // operations when proven redundant. |
| 497 void Analyze(); | 505 void Analyze(); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 BitVector* selected_uint32_defs_; | 630 BitVector* selected_uint32_defs_; |
| 623 | 631 |
| 624 FlowGraph* flow_graph_; | 632 FlowGraph* flow_graph_; |
| 625 Isolate* isolate_; | 633 Isolate* isolate_; |
| 626 }; | 634 }; |
| 627 | 635 |
| 628 | 636 |
| 629 } // namespace dart | 637 } // namespace dart |
| 630 | 638 |
| 631 #endif // VM_FLOW_GRAPH_RANGE_ANALYSIS_H_ | 639 #endif // VM_FLOW_GRAPH_RANGE_ANALYSIS_H_ |
| OLD | NEW |