| Index: lib/compiler/implementation/ssa/value_range_analyzer.dart
|
| diff --git a/lib/compiler/implementation/ssa/value_range_analyzer.dart b/lib/compiler/implementation/ssa/value_range_analyzer.dart
|
| index 0fd49fe29bbbe67e857be54b4a8b683f8df9f99a..27c2c3430da878d30357427ce7bb71258aa238df 100644
|
| --- a/lib/compiler/implementation/ssa/value_range_analyzer.dart
|
| +++ b/lib/compiler/implementation/ssa/value_range_analyzer.dart
|
| @@ -20,8 +20,8 @@ abstract class Value {
|
| if (other == const MinIntValue()) return other;
|
| if (other == const MaxIntValue()) return this;
|
| Value value = this - other;
|
| - if (value.isPositive()) return other;
|
| - if (value.isNegative()) return this;
|
| + if (value.isPositive) return other;
|
| + if (value.isNegative) return this;
|
| return const UnknownValue();
|
| }
|
|
|
| @@ -30,14 +30,14 @@ abstract class Value {
|
| if (other == const MinIntValue()) return this;
|
| if (other == const MaxIntValue()) return other;
|
| Value value = this - other;
|
| - if (value.isPositive()) return this;
|
| - if (value.isNegative()) return other;
|
| + if (value.isPositive) return this;
|
| + if (value.isNegative) return other;
|
| return const UnknownValue();
|
| }
|
|
|
| - bool isNegative() => false;
|
| - bool isPositive() => false;
|
| - bool isZero() => false;
|
| + bool get isNegative => false;
|
| + bool get isPositive => false;
|
| + bool get isZero => false;
|
| }
|
|
|
| /**
|
| @@ -48,26 +48,26 @@ class IntValue extends Value {
|
| const IntValue(this.value);
|
|
|
| Value operator +(other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| if (other is !IntValue) return other + this;
|
| return new IntValue(value + other.value);
|
| }
|
|
|
| Value operator -(other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| if (other is !IntValue) return -other + this;
|
| return new IntValue(value - other.value);
|
| }
|
|
|
| Value operator -() {
|
| - if (isZero()) return this;
|
| + if (isZero) return this;
|
| return new IntValue(-value);
|
| }
|
|
|
| Value operator &(other) {
|
| if (other is !IntValue) {
|
| - if (isPositive()) return this;
|
| - if (other.isPositive()) return new IntValue(-value);
|
| + if (isPositive) return this;
|
| + if (other.isPositive) return new IntValue(-value);
|
| return const UnknownValue();
|
| }
|
| return new IntValue(value & other.value);
|
| @@ -89,9 +89,9 @@ class IntValue extends Value {
|
| }
|
|
|
| String toString() => 'IntValue $value';
|
| - bool isNegative() => value < 0;
|
| - bool isPositive() => value >= 0;
|
| - bool isZero() => value == 0;
|
| + bool get isNegative => value < 0;
|
| + bool get isPositive => value >= 0;
|
| + bool get isZero => value == 0;
|
| }
|
|
|
| /**
|
| @@ -104,15 +104,15 @@ class MaxIntValue extends Value {
|
| Value operator -(Value other) => this;
|
| Value operator -() => const MinIntValue();
|
| Value operator &(Value other) {
|
| - if (other.isPositive()) return other;
|
| - if (other.isNegative()) return const IntValue(0);
|
| + if (other.isPositive) return other;
|
| + if (other.isNegative) return const IntValue(0);
|
| return this;
|
| }
|
| Value min(Value other) => other;
|
| Value max(Value other) => this;
|
| String toString() => 'Max';
|
| - bool isNegative() => false;
|
| - bool isPositive() => true;
|
| + bool get isNegative => false;
|
| + bool get isPositive => true;
|
| }
|
|
|
| /**
|
| @@ -125,14 +125,14 @@ class MinIntValue extends Value {
|
| Value operator -(Value other) => this;
|
| Value operator -() => const MaxIntValue();
|
| Value operator &(Value other) {
|
| - if (other.isPositive()) return const IntValue(0);
|
| + if (other.isPositive) return const IntValue(0);
|
| return this;
|
| }
|
| Value min(Value other) => this;
|
| Value max(Value other) => other;
|
| String toString() => 'Min';
|
| - bool isNegative() => true;
|
| - bool isPositive() => false;
|
| + bool get isNegative => true;
|
| + bool get isPositive => false;
|
| }
|
|
|
| /**
|
| @@ -147,8 +147,8 @@ class UnknownValue extends Value {
|
| Value operator &(Value other) => const UnknownValue();
|
| Value min(Value other) => const UnknownValue();
|
| Value max(Value other) => const UnknownValue();
|
| - bool isNegative() => false;
|
| - bool isPositive() => false;
|
| + bool get isNegative => false;
|
| + bool get isPositive => false;
|
| String toString() => 'Unknown';
|
| }
|
|
|
| @@ -165,9 +165,9 @@ class InstructionValue extends Value {
|
| }
|
|
|
| Value operator +(Value other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| if (other is IntValue) {
|
| - if (other.isNegative()) {
|
| + if (other.isNegative) {
|
| return new SubtractValue(this, -other);
|
| }
|
| return new AddValue(this, other);
|
| @@ -179,10 +179,10 @@ class InstructionValue extends Value {
|
| }
|
|
|
| Value operator -(Value other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| if (this == other) return const IntValue(0);
|
| if (other is IntValue) {
|
| - if (other.isNegative()) {
|
| + if (other.isNegative) {
|
| return new AddValue(this, -other);
|
| }
|
| return new SubtractValue(this, other);
|
| @@ -202,8 +202,8 @@ class InstructionValue extends Value {
|
| return this;
|
| }
|
|
|
| - bool isNegative() => false;
|
| - bool isPositive() => false;
|
| + bool get isNegative => false;
|
| + bool get isPositive => false;
|
|
|
| String toString() => 'Instruction: $instruction';
|
| }
|
| @@ -215,7 +215,7 @@ class InstructionValue extends Value {
|
| */
|
| class LengthValue extends InstructionValue {
|
| LengthValue(HInstruction instruction) : super(instruction);
|
| - bool isPositive() => true;
|
| + bool get isPositive => true;
|
| String toString() => 'Length: $instruction';
|
| }
|
|
|
| @@ -246,7 +246,7 @@ class AddValue extends BinaryOperationValue {
|
| Value operator -() => -left - right;
|
|
|
| Value operator +(Value other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| Value value = left + other;
|
| if (value != const UnknownValue() && value is! BinaryOperationValue) {
|
| return value + right;
|
| @@ -261,7 +261,7 @@ class AddValue extends BinaryOperationValue {
|
| }
|
|
|
| Value operator -(Value other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| Value value = left - other;
|
| if (value != const UnknownValue() && value is! BinaryOperationValue) {
|
| return value + right;
|
| @@ -275,8 +275,8 @@ class AddValue extends BinaryOperationValue {
|
| return const UnknownValue();
|
| }
|
|
|
| - bool isNegative() => left.isNegative() && right.isNegative();
|
| - bool isPositive() => left.isPositive() && right.isPositive();
|
| + bool get isNegative => left.isNegative && right.isNegative;
|
| + bool get isPositive => left.isPositive && right.isPositive;
|
| String toString() => '$left + $right';
|
| }
|
|
|
| @@ -292,7 +292,7 @@ class SubtractValue extends BinaryOperationValue {
|
| Value operator -() => right - left;
|
|
|
| Value operator +(Value other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| Value value = left + other;
|
| if (value != const UnknownValue() && value is! BinaryOperationValue) {
|
| return value - right;
|
| @@ -307,7 +307,7 @@ class SubtractValue extends BinaryOperationValue {
|
| }
|
|
|
| Value operator -(Value other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| Value value = left - other;
|
| if (value != const UnknownValue() && value is! BinaryOperationValue) {
|
| return value - right;
|
| @@ -321,8 +321,8 @@ class SubtractValue extends BinaryOperationValue {
|
| return const UnknownValue();
|
| }
|
|
|
| - bool isNegative() => left.isNegative() && right.isPositive();
|
| - bool isPositive() => left.isPositive() && right.isNegative();
|
| + bool get isNegative => left.isNegative && right.isPositive;
|
| + bool get isPositive => left.isPositive && right.isNegative;
|
| String toString() => '$left - $right';
|
| }
|
|
|
| @@ -336,11 +336,11 @@ class NegateValue extends OperationValue {
|
| }
|
|
|
| Value operator +(other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| if (other == value) return const IntValue(0);
|
| if (other is NegateValue) return this - other.value;
|
| if (other is IntValue) {
|
| - if (other.isNegative()) {
|
| + if (other.isNegative) {
|
| return new SubtractValue(this, -other);
|
| }
|
| return new SubtractValue(other, value);
|
| @@ -354,9 +354,9 @@ class NegateValue extends OperationValue {
|
| Value operator &(Value other) => const UnknownValue();
|
|
|
| Value operator -(other) {
|
| - if (other.isZero()) return this;
|
| + if (other.isZero) return this;
|
| if (other is IntValue) {
|
| - if (other.isNegative()) {
|
| + if (other.isNegative) {
|
| return new SubtractValue(-other, value);
|
| }
|
| return new SubtractValue(this, other);
|
| @@ -370,8 +370,8 @@ class NegateValue extends OperationValue {
|
|
|
| Value operator -() => value;
|
|
|
| - bool isNegative() => value.isPositive();
|
| - bool isPositive() => value.isNegative();
|
| + bool get isNegative => value.isPositive;
|
| + bool get isPositive => value.isNegative;
|
| String toString() => '-$value';
|
| }
|
|
|
| @@ -430,13 +430,13 @@ class Range {
|
| }
|
|
|
| Range operator &(Range other) {
|
| - if (isSingleValue()
|
| - && other.isSingleValue()
|
| + if (isSingleValue
|
| + && other.isSingleValue
|
| && lower is IntValue
|
| && other.lower is IntValue) {
|
| return new Range(lower & other.lower, upper & other.upper);
|
| }
|
| - if (isPositive() && other.isPositive()) {
|
| + if (isPositive && other.isPositive) {
|
| Value up = upper.min(other.upper);
|
| if (up == const UnknownValue()) {
|
| // If we could not find a trivial bound, just try to use the
|
| @@ -447,9 +447,9 @@ class Range {
|
| if (up is! IntValue && upper != other.upper) up = const MaxIntValue();
|
| }
|
| return new Range(const IntValue(0), up);
|
| - } else if (isPositive()) {
|
| + } else if (isPositive) {
|
| return new Range(const IntValue(0), upper);
|
| - } else if (other.isPositive()) {
|
| + } else if (other.isPositive) {
|
| return new Range(const IntValue(0), other.upper);
|
| } else {
|
| return const Range.unbound();
|
| @@ -477,9 +477,9 @@ class Range {
|
| return lower.max(other.upper) == lower;
|
| }
|
|
|
| - bool isNegative() => upper.isNegative();
|
| - bool isPositive() => lower.isPositive();
|
| - bool isSingleValue() => lower == upper;
|
| + bool get isNegative => upper.isNegative;
|
| + bool get isPositive => lower.isPositive;
|
| + bool get isSingleValue => lower == upper;
|
|
|
| String toString() => '[$lower, $upper]';
|
| }
|
| @@ -609,21 +609,21 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| belowLength = belowLength
|
| || (indexRange.upper != lengthRange.lower
|
| && indexRange.upper.min(lengthRange.lower) == indexRange.upper);
|
| - if (indexRange.isPositive() && belowLength) {
|
| + if (indexRange.isPositive && belowLength) {
|
| check.block.rewrite(check, check.index);
|
| check.block.remove(check);
|
| - } else if (indexRange.isNegative() || lengthRange < indexRange) {
|
| + } else if (indexRange.isNegative || lengthRange < indexRange) {
|
| check.staticChecks = HBoundsCheck.ALWAYS_FALSE;
|
| // The check is always false, and whatever instruction it
|
| // dominates is dead code.
|
| return indexRange;
|
| - } else if (indexRange.isPositive()) {
|
| + } else if (indexRange.isPositive) {
|
| check.staticChecks = HBoundsCheck.ALWAYS_ABOVE_ZERO;
|
| } else if (belowLength) {
|
| check.staticChecks = HBoundsCheck.ALWAYS_BELOW_LENGTH;
|
| }
|
|
|
| - if (indexRange.isPositive()) {
|
| + if (indexRange.isPositive) {
|
| // If the test passes, we know the lower bound of the length is
|
| // greater or equal than the lower bound of the index.
|
| Value low = lengthRange.lower.max(indexRange.lower);
|
| @@ -674,7 +674,7 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| void handleEqualityCheck(HRelational node) {
|
| Range right = ranges[node.right];
|
| Range left = ranges[node.left];
|
| - if (left.isSingleValue() && right.isSingleValue() && left == right) {
|
| + if (left.isSingleValue && right.isSingleValue && left == right) {
|
| node.block.rewrite(
|
| node, graph.addConstantBool(true, constantSystem));
|
| node.block.remove(node);
|
| @@ -705,9 +705,9 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
|
|
| Range tryComputeRange(HInstruction instruction) {
|
| Range range = ranges[instruction];
|
| - if (range.isPositive()) {
|
| + if (range.isPositive) {
|
| return new Range(const IntValue(0), range.upper);
|
| - } else if (range.isNegative()) {
|
| + } else if (range.isNegative) {
|
| return new Range(range.lower, const IntValue(0));
|
| }
|
| return const Range.unbound();
|
| @@ -855,9 +855,9 @@ class LoopUpdateRecognizer extends HBaseVisitor {
|
| Range range = getRangeForRecognizableOperation(operation);
|
| if (range == null) return const Range.unbound();
|
| Range initial = ranges[loopPhi.inputs[0]];
|
| - if (range.isPositive()) {
|
| + if (range.isPositive) {
|
| return new Range(initial.lower, const MaxIntValue());
|
| - } else if (range.isNegative()) {
|
| + } else if (range.isNegative) {
|
| return new Range(const MinIntValue(), initial.upper);
|
| }
|
| return const Range.unbound();
|
| @@ -867,9 +867,9 @@ class LoopUpdateRecognizer extends HBaseVisitor {
|
| Range range = getRangeForRecognizableOperation(operation);
|
| if (range == null) return const Range.unbound();
|
| Range initial = ranges[loopPhi.inputs[0]];
|
| - if (range.isPositive()) {
|
| + if (range.isPositive) {
|
| return new Range(const MinIntValue(), initial.upper);
|
| - } else if (range.isNegative()) {
|
| + } else if (range.isNegative) {
|
| return new Range(initial.lower, const MaxIntValue());
|
| }
|
| return const Range.unbound();
|
|
|