| Index: pkg/compiler/lib/src/ssa/optimize.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
|
| index 151b7457179b4056e51d18122e636481455070f8..c98ceb170055e5e02bf38e40aafe8b3e5479083f 100644
|
| --- a/pkg/compiler/lib/src/ssa/optimize.dart
|
| +++ b/pkg/compiler/lib/src/ssa/optimize.dart
|
| @@ -111,8 +111,8 @@ bool isFixedLength(mask, Compiler compiler) {
|
| return true;
|
| }
|
| // TODO(sra): Recognize any combination of fixed length indexables.
|
| - if (mask.containsOnly(backend.jsFixedArrayClass) ||
|
| - mask.containsOnly(backend.jsUnmodifiableArrayClass) ||
|
| + if (mask.containsOnly(backend.helpers.jsFixedArrayClass) ||
|
| + mask.containsOnly(backend.helpers.jsUnmodifiableArrayClass) ||
|
| mask.containsOnlyString(classWorld) ||
|
| backend.isTypedArray(mask)) {
|
| return true;
|
| @@ -147,6 +147,8 @@ class SsaInstructionSimplifier extends HBaseVisitor
|
|
|
| CoreClasses get coreClasses => compiler.coreClasses;
|
|
|
| + BackendHelpers get helpers => backend.helpers;
|
| +
|
| void visitGraph(HGraph visitee) {
|
| graph = visitee;
|
| visitDominatorTree(visitee);
|
| @@ -252,7 +254,7 @@ class SsaInstructionSimplifier extends HBaseVisitor
|
|
|
| // All values that cannot be 'true' are boolified to false.
|
| TypeMask mask = input.instructionType;
|
| - if (!mask.contains(backend.jsBoolClass, compiler.world)) {
|
| + if (!mask.contains(helpers.jsBoolClass, compiler.world)) {
|
| return graph.addConstantBool(false, compiler);
|
| }
|
| return node;
|
| @@ -299,17 +301,17 @@ class SsaInstructionSimplifier extends HBaseVisitor
|
| ListConstantValue constant = constantInput.constant;
|
| return graph.addConstantInt(constant.length, compiler);
|
| }
|
| - Element element = backend.jsIndexableLength;
|
| + Element element = helpers.jsIndexableLength;
|
| bool isFixed = isFixedLength(actualReceiver.instructionType, compiler);
|
| TypeMask actualType = node.instructionType;
|
| ClassWorld classWorld = compiler.world;
|
| TypeMask resultType = backend.positiveIntType;
|
| // If we already have computed a more specific type, keep that type.
|
| if (HInstruction.isInstanceOf(
|
| - actualType, backend.jsUInt31Class, classWorld)) {
|
| + actualType, helpers.jsUInt31Class, classWorld)) {
|
| resultType = backend.uint31Type;
|
| } else if (HInstruction.isInstanceOf(
|
| - actualType, backend.jsUInt32Class, classWorld)) {
|
| + actualType, helpers.jsUInt32Class, classWorld)) {
|
| resultType = backend.uint32Type;
|
| }
|
| HFieldGet result = new HFieldGet(
|
| @@ -353,22 +355,22 @@ class SsaInstructionSimplifier extends HBaseVisitor
|
| if (selector.isCall || selector.isOperator) {
|
| Element target;
|
| if (input.isExtendableArray(compiler)) {
|
| - if (applies(backend.jsArrayRemoveLast)) {
|
| - target = backend.jsArrayRemoveLast;
|
| - } else if (applies(backend.jsArrayAdd)) {
|
| + if (applies(helpers.jsArrayRemoveLast)) {
|
| + target = helpers.jsArrayRemoveLast;
|
| + } else if (applies(helpers.jsArrayAdd)) {
|
| // The codegen special cases array calls, but does not
|
| // inline argument type checks.
|
| if (!compiler.enableTypeAssertions) {
|
| - target = backend.jsArrayAdd;
|
| + target = helpers.jsArrayAdd;
|
| }
|
| }
|
| } else if (input.isStringOrNull(compiler)) {
|
| - if (applies(backend.jsStringSplit)) {
|
| + if (applies(helpers.jsStringSplit)) {
|
| HInstruction argument = node.inputs[2];
|
| if (argument.isString(compiler)) {
|
| - target = backend.jsStringSplit;
|
| + target = helpers.jsStringSplit;
|
| }
|
| - } else if (applies(backend.jsStringOperatorAdd)) {
|
| + } else if (applies(helpers.jsStringOperatorAdd)) {
|
| // `operator+` is turned into a JavaScript '+' so we need to
|
| // make sure the receiver and the argument are not null.
|
| // TODO(sra): Do this via [node.specializer].
|
| @@ -378,7 +380,7 @@ class SsaInstructionSimplifier extends HBaseVisitor
|
| return new HStringConcat(input, argument, null,
|
| node.instructionType);
|
| }
|
| - } else if (applies(backend.jsStringToString)
|
| + } else if (applies(helpers.jsStringToString)
|
| && !input.canBeNull()) {
|
| return input;
|
| }
|
| @@ -399,7 +401,7 @@ class SsaInstructionSimplifier extends HBaseVisitor
|
| return result;
|
| }
|
| } else if (selector.isGetter) {
|
| - if (selector.applies(backend.jsIndexableLength, world)) {
|
| + if (selector.applies(helpers.jsIndexableLength, world)) {
|
| HInstruction optimized = tryOptimizeLengthInterceptedGetter(node);
|
| if (optimized != null) return optimized;
|
| }
|
| @@ -783,7 +785,7 @@ class SsaInstructionSimplifier extends HBaseVisitor
|
| HInstruction visitFieldGet(HFieldGet node) {
|
| if (node.isNullCheck) return node;
|
| var receiver = node.receiver;
|
| - if (node.element == backend.jsIndexableLength) {
|
| + if (node.element == helpers.jsIndexableLength) {
|
| JavaScriptItemCompilationContext context = work.compilationContext;
|
| if (context.allocatedFixedLists.contains(receiver)) {
|
| // TODO(ngeoffray): checking if the second input is an integer
|
| @@ -1005,6 +1007,8 @@ class SsaCheckInserter extends HBaseVisitor implements OptimizationPhase {
|
| this.work,
|
| this.boundsChecked);
|
|
|
| + BackendHelpers get helpers => backend.helpers;
|
| +
|
| void visitGraph(HGraph graph) {
|
| this.graph = graph;
|
|
|
| @@ -1030,7 +1034,7 @@ class SsaCheckInserter extends HBaseVisitor implements OptimizationPhase {
|
| HInstruction indexArgument) {
|
| Compiler compiler = backend.compiler;
|
| HFieldGet length = new HFieldGet(
|
| - backend.jsIndexableLength, array, backend.positiveIntType,
|
| + helpers.jsIndexableLength, array, backend.positiveIntType,
|
| isAssignable: !isFixedLength(array.instructionType, compiler));
|
| indexNode.block.addBefore(indexNode, length);
|
|
|
| @@ -1069,7 +1073,7 @@ class SsaCheckInserter extends HBaseVisitor implements OptimizationPhase {
|
| void visitInvokeDynamicMethod(HInvokeDynamicMethod node) {
|
| Element element = node.element;
|
| if (node.isInterceptedCall) return;
|
| - if (element != backend.jsArrayRemoveLast) return;
|
| + if (element != helpers.jsArrayRemoveLast) return;
|
| if (boundsChecked.contains(node)) return;
|
| // `0` is the index we want to check, but we want to report `-1`, as if we
|
| // executed `a[a.length-1]`
|
|
|