| Index: runtime/vm/intermediate_language.h
|
| diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
|
| index 8c4839bf0c7b8a18a4db90d2e0088802d109bbae..83f3b8c2f027ee96177842a26d2a5f139e573efb 100644
|
| --- a/runtime/vm/intermediate_language.h
|
| +++ b/runtime/vm/intermediate_language.h
|
| @@ -1583,9 +1583,7 @@ class RangeBoundary : public ValueObject {
|
| return RangeBoundary(kConstant, val, 0);
|
| }
|
|
|
| - static RangeBoundary FromDefinition(Definition* defn, intptr_t offs = 0) {
|
| - return RangeBoundary(kSymbol, reinterpret_cast<intptr_t>(defn), offs);
|
| - }
|
| + static RangeBoundary FromDefinition(Definition* defn, intptr_t offs = 0);
|
|
|
| static RangeBoundary MinSmi() {
|
| return FromConstant(Smi::kMinValue);
|
| @@ -1606,19 +1604,9 @@ class RangeBoundary : public ValueObject {
|
| return FromConstant(Smi::kMaxValue + 1);
|
| }
|
|
|
| - static RangeBoundary Min(RangeBoundary a, RangeBoundary b) {
|
| - const intptr_t min_a = a.LowerBound().value();
|
| - const intptr_t min_b = b.LowerBound().value();
|
| -
|
| - return RangeBoundary::FromConstant(Utils::Minimum(min_a, min_b));
|
| - }
|
| -
|
| - static RangeBoundary Max(RangeBoundary a, RangeBoundary b) {
|
| - const intptr_t max_a = a.UpperBound().value();
|
| - const intptr_t max_b = b.UpperBound().value();
|
| + static RangeBoundary Min(RangeBoundary a, RangeBoundary b);
|
|
|
| - return RangeBoundary::FromConstant(Utils::Maximum(max_a, max_b));
|
| - }
|
| + static RangeBoundary Max(RangeBoundary a, RangeBoundary b);
|
|
|
| bool Overflowed() const {
|
| return !Smi::IsValid(value());
|
| @@ -1650,10 +1638,15 @@ class RangeBoundary : public ValueObject {
|
| return reinterpret_cast<Definition*>(value_);
|
| }
|
|
|
| + intptr_t offset() const {
|
| + return offset_;
|
| + }
|
| +
|
| RangeBoundary LowerBound() const;
|
| RangeBoundary UpperBound() const;
|
|
|
| void PrintTo(BufferFormatter* f) const;
|
| + const char* ToCString() const;
|
|
|
| static RangeBoundary Add(const RangeBoundary& a,
|
| const RangeBoundary& b,
|
| @@ -2948,7 +2941,8 @@ class LoadFieldInstr : public TemplateDefinition<1> {
|
| : offset_in_bytes_(offset_in_bytes),
|
| type_(type),
|
| result_cid_(kDynamicCid),
|
| - immutable_(immutable) {
|
| + immutable_(immutable),
|
| + recognized_kind_(MethodRecognizer::kUnknown) {
|
| ASSERT(value != NULL);
|
| ASSERT(type.IsZoneHandle()); // May be null if field is not an instance.
|
| inputs_[0] = value;
|
| @@ -2974,12 +2968,24 @@ class LoadFieldInstr : public TemplateDefinition<1> {
|
|
|
| virtual bool AffectedBySideEffect() const { return !immutable_; }
|
|
|
| + virtual void InferRange();
|
| +
|
| + void set_recognized_kind(MethodRecognizer::Kind kind) {
|
| + recognized_kind_ = kind;
|
| + }
|
| +
|
| + MethodRecognizer::Kind recognized_kind() const {
|
| + return recognized_kind_;
|
| + }
|
| +
|
| private:
|
| const intptr_t offset_in_bytes_;
|
| const AbstractType& type_;
|
| intptr_t result_cid_;
|
| const bool immutable_;
|
|
|
| + MethodRecognizer::Kind recognized_kind_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr);
|
| };
|
|
|
| @@ -3986,6 +3992,8 @@ class CheckArrayBoundInstr : public TemplateInstruction<2> {
|
|
|
| intptr_t array_type() const { return array_type_; }
|
|
|
| + bool IsRedundant();
|
| +
|
| private:
|
| intptr_t array_type_;
|
|
|
|
|