| Index: pkg/compiler/lib/src/ssa/value_range_analyzer.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
|
| index 1882fc6bb1f65d2ee84d7735a1589c1c95b19af2..67e861eb2d8eb7015107c12c98e5a0ab5f50bb08 100644
|
| --- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
|
| +++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
|
| @@ -7,6 +7,7 @@ import '../constant_system_dart.dart';
|
| import '../constants/constant_system.dart';
|
| import '../constants/values.dart';
|
| import '../js_backend/js_backend.dart';
|
| +import '../world.dart' show ClosedWorld;
|
| import 'nodes.dart';
|
| import 'optimize.dart';
|
|
|
| @@ -611,6 +612,8 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| : info = new ValueRangeInfo(constantSystem),
|
| this.constantSystem = constantSystem;
|
|
|
| + ClosedWorld get closedWorld => compiler.closedWorld;
|
| +
|
| void visitGraph(HGraph graph) {
|
| this.graph = graph;
|
| visitDominatorTree(graph);
|
| @@ -632,7 +635,7 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| void visitBasicBlock(HBasicBlock block) {
|
| void visit(HInstruction instruction) {
|
| Range range = instruction.accept(this);
|
| - if (instruction.isInteger(compiler)) {
|
| + if (instruction.isInteger(closedWorld)) {
|
| assert(range != null);
|
| ranges[instruction] = range;
|
| }
|
| @@ -643,10 +646,10 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| }
|
|
|
| Range visitInstruction(HInstruction instruction) {
|
| - if (instruction.isPositiveInteger(compiler)) {
|
| + if (instruction.isPositiveInteger(closedWorld)) {
|
| return info.newNormalizedRange(
|
| info.intZero, info.newPositiveValue(instruction));
|
| - } else if (instruction.isInteger(compiler)) {
|
| + } else if (instruction.isInteger(closedWorld)) {
|
| InstructionValue value = info.newInstructionValue(instruction);
|
| return info.newNormalizedRange(value, value);
|
| } else {
|
| @@ -655,16 +658,17 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| }
|
|
|
| Range visitPhi(HPhi phi) {
|
| - if (!phi.isInteger(compiler)) return info.newUnboundRange();
|
| + if (!phi.isInteger(closedWorld)) return info.newUnboundRange();
|
| // Some phases may replace instructions that change the inputs of
|
| // this phi. Only the [SsaTypesPropagation] phase will update the
|
| // phi type. Play it safe by assuming the [SsaTypesPropagation]
|
| // phase is not necessarily run before the [ValueRangeAnalyzer].
|
| - if (phi.inputs.any((i) => !i.isInteger(compiler))) {
|
| + if (phi.inputs.any((i) => !i.isInteger(closedWorld))) {
|
| return info.newUnboundRange();
|
| }
|
| if (phi.block.isLoopHeader()) {
|
| - Range range = new LoopUpdateRecognizer(compiler, ranges, info).run(phi);
|
| + Range range =
|
| + new LoopUpdateRecognizer(closedWorld, ranges, info).run(phi);
|
| if (range == null) return info.newUnboundRange();
|
| return range;
|
| }
|
| @@ -677,7 +681,7 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| }
|
|
|
| Range visitConstant(HConstant hConstant) {
|
| - if (!hConstant.isInteger(compiler)) return info.newUnboundRange();
|
| + if (!hConstant.isInteger(closedWorld)) return info.newUnboundRange();
|
| ConstantValue constant = hConstant.constant;
|
| NumConstantValue constantNum;
|
| if (constant is DeferredConstantValue) {
|
| @@ -694,8 +698,8 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| }
|
|
|
| Range visitFieldGet(HFieldGet fieldGet) {
|
| - if (!fieldGet.isInteger(compiler)) return info.newUnboundRange();
|
| - if (!fieldGet.receiver.isIndexablePrimitive(compiler)) {
|
| + if (!fieldGet.isInteger(closedWorld)) return info.newUnboundRange();
|
| + if (!fieldGet.receiver.isIndexablePrimitive(closedWorld)) {
|
| return visitInstruction(fieldGet);
|
| }
|
| JavaScriptBackend backend = compiler.backend;
|
| @@ -715,7 +719,7 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| Range lengthRange = ranges[check.length];
|
| if (indexRange == null) {
|
| indexRange = info.newUnboundRange();
|
| - assert(!check.index.isInteger(compiler));
|
| + assert(!check.index.isInteger(closedWorld));
|
| }
|
| if (lengthRange == null) {
|
| // We might have lost the length range due to a type conversion that
|
| @@ -723,7 +727,7 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| // get to this point anyway, so no need to try and refine ranges.
|
| return indexRange;
|
| }
|
| - assert(check.length.isInteger(compiler));
|
| + assert(check.length.isInteger(closedWorld));
|
|
|
| // Check if the index is strictly below the upper bound of the length
|
| // range.
|
| @@ -776,8 +780,8 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| Range visitRelational(HRelational relational) {
|
| HInstruction right = relational.right;
|
| HInstruction left = relational.left;
|
| - if (!left.isInteger(compiler)) return info.newUnboundRange();
|
| - if (!right.isInteger(compiler)) return info.newUnboundRange();
|
| + if (!left.isInteger(closedWorld)) return info.newUnboundRange();
|
| + if (!right.isInteger(closedWorld)) return info.newUnboundRange();
|
| BinaryOperation operation = relational.operation(constantSystem);
|
| Range rightRange = ranges[relational.right];
|
| Range leftRange = ranges[relational.left];
|
| @@ -812,7 +816,7 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| if (divisor != null) {
|
| // For Integer values we can be precise in the upper bound,
|
| // so special case those.
|
| - if (left.isInteger(compiler) && right.isInteger(compiler)) {
|
| + if (left.isInteger(closedWorld) && right.isInteger(closedWorld)) {
|
| if (divisor.isPositive) {
|
| return info.newNormalizedRange(
|
| info.intZero, divisor.upper - info.intOne);
|
| @@ -820,7 +824,7 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| return info.newNormalizedRange(
|
| info.intZero, info.newNegateValue(divisor.lower) - info.intOne);
|
| }
|
| - } else if (left.isNumber(compiler) && right.isNumber(compiler)) {
|
| + } else if (left.isNumber(closedWorld) && right.isNumber(closedWorld)) {
|
| if (divisor.isPositive) {
|
| return info.newNormalizedRange(info.intZero, divisor.upper);
|
| } else if (divisor.isNegative) {
|
| @@ -839,7 +843,7 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| }
|
|
|
| Range handleBinaryOperation(HBinaryArithmetic instruction) {
|
| - if (!instruction.isInteger(compiler)) return info.newUnboundRange();
|
| + if (!instruction.isInteger(closedWorld)) return info.newUnboundRange();
|
| return instruction
|
| .operation(constantSystem)
|
| .apply(ranges[instruction.left], ranges[instruction.right]);
|
| @@ -854,10 +858,10 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| }
|
|
|
| Range visitBitAnd(HBitAnd node) {
|
| - if (!node.isInteger(compiler)) return info.newUnboundRange();
|
| + if (!node.isInteger(closedWorld)) return info.newUnboundRange();
|
| HInstruction right = node.right;
|
| HInstruction left = node.left;
|
| - if (left.isInteger(compiler) && right.isInteger(compiler)) {
|
| + if (left.isInteger(closedWorld) && right.isInteger(closedWorld)) {
|
| return ranges[left] & ranges[right];
|
| }
|
|
|
| @@ -871,9 +875,9 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| return info.newUnboundRange();
|
| }
|
|
|
| - if (left.isInteger(compiler)) {
|
| + if (left.isInteger(closedWorld)) {
|
| return tryComputeRange(left);
|
| - } else if (right.isInteger(compiler)) {
|
| + } else if (right.isInteger(closedWorld)) {
|
| return tryComputeRange(right);
|
| }
|
| return info.newUnboundRange();
|
| @@ -888,9 +892,8 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
|
|
| HInstruction createRangeConversion(
|
| HInstruction cursor, HInstruction instruction) {
|
| - JavaScriptBackend backend = compiler.backend;
|
| HRangeConversion newInstruction =
|
| - new HRangeConversion(instruction, backend.intType);
|
| + new HRangeConversion(instruction, closedWorld.commonMasks.intType);
|
| conversions.add(newInstruction);
|
| cursor.block.addBefore(cursor, newInstruction);
|
| // Update the users of the instruction dominated by [cursor] to
|
| @@ -953,8 +956,8 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| if (condition is HIdentity) return info.newUnboundRange();
|
| HInstruction right = condition.right;
|
| HInstruction left = condition.left;
|
| - if (!left.isInteger(compiler)) return info.newUnboundRange();
|
| - if (!right.isInteger(compiler)) return info.newUnboundRange();
|
| + if (!left.isInteger(closedWorld)) return info.newUnboundRange();
|
| + if (!right.isInteger(closedWorld)) return info.newUnboundRange();
|
|
|
| Range rightRange = ranges[right];
|
| Range leftRange = ranges[left];
|
| @@ -1016,10 +1019,10 @@ class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
|
| * Tries to find a range for the update instruction of a loop phi.
|
| */
|
| class LoopUpdateRecognizer extends HBaseVisitor {
|
| - final Compiler compiler;
|
| + final ClosedWorld closedWorld;
|
| final Map<HInstruction, Range> ranges;
|
| final ValueRangeInfo info;
|
| - LoopUpdateRecognizer(this.compiler, this.ranges, this.info);
|
| + LoopUpdateRecognizer(this.closedWorld, this.ranges, this.info);
|
|
|
| Range run(HPhi loopPhi) {
|
| // Create a marker range for the loop phi, so that if the update
|
| @@ -1044,7 +1047,7 @@ class LoopUpdateRecognizer extends HBaseVisitor {
|
| }
|
|
|
| Range visit(HInstruction instruction) {
|
| - if (!instruction.isInteger(compiler)) return null;
|
| + if (!instruction.isInteger(closedWorld)) return null;
|
| if (ranges[instruction] != null) return ranges[instruction];
|
| return instruction.accept(this);
|
| }
|
|
|