Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(339)

Unified Diff: pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart

Issue 2563443007: Reduce use of Compiler.closedWorld (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index 63e3a26aa3761b6d11e5d16c480fd1921960b65d..e4137488cbe3b8b1fb8d7def2fa81e2ccc13f29e 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -24,13 +24,13 @@ class InvokeDynamicSpecializer {
const InvokeDynamicSpecializer();
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
return TypeMaskFactory.inferredTypeForSelector(
instruction.selector, instruction.mask, compiler);
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
return null;
}
@@ -85,9 +85,9 @@ class IndexAssignSpecializer extends InvokeDynamicSpecializer {
const IndexAssignSpecializer();
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
- if (instruction.inputs[1].isMutableIndexable(compiler)) {
- if (!instruction.inputs[2].isInteger(compiler) &&
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ if (instruction.inputs[1].isMutableIndexable(closedWorld)) {
+ if (!instruction.inputs[2].isInteger(closedWorld) &&
compiler.options.enableTypeAssertions) {
// We want the right checked mode error.
return null;
@@ -103,9 +103,9 @@ class IndexSpecializer extends InvokeDynamicSpecializer {
const IndexSpecializer();
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
- if (!instruction.inputs[1].isIndexablePrimitive(compiler)) return null;
- if (!instruction.inputs[2].isInteger(compiler) &&
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ if (!instruction.inputs[1].isIndexablePrimitive(closedWorld)) return null;
+ if (!instruction.inputs[2].isInteger(closedWorld) &&
compiler.options.enableTypeAssertions) {
// We want the right checked mode error.
return null;
@@ -127,22 +127,21 @@ class BitNotSpecializer extends InvokeDynamicSpecializer {
}
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
// All bitwise operations on primitive types either produce an
// integer or throw an error.
- JavaScriptBackend backend = compiler.backend;
- if (instruction.inputs[1].isPrimitiveOrNull(compiler)) {
- return backend.uint32Type;
+ if (instruction.inputs[1].isPrimitiveOrNull(closedWorld)) {
+ return closedWorld.commonMasks.uint32Type;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction input = instruction.inputs[1];
- if (input.isNumber(compiler)) {
+ if (input.isNumber(closedWorld)) {
return new HBitNot(input, instruction.selector,
- computeTypeFromInputTypes(instruction, compiler));
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
return null;
}
@@ -156,16 +155,16 @@ class UnaryNegateSpecializer extends InvokeDynamicSpecializer {
}
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
TypeMask operandType = instruction.inputs[1].instructionType;
- if (instruction.inputs[1].isNumberOrNull(compiler)) return operandType;
- return super.computeTypeFromInputTypes(instruction, compiler);
+ if (instruction.inputs[1].isNumberOrNull(closedWorld)) return operandType;
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction input = instruction.inputs[1];
- if (input.isNumber(compiler)) {
+ if (input.isNumber(closedWorld)) {
return new HNegate(input, instruction.selector, input.instructionType);
}
return null;
@@ -176,31 +175,33 @@ abstract class BinaryArithmeticSpecializer extends InvokeDynamicSpecializer {
const BinaryArithmeticSpecializer();
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- JavaScriptBackend backend = compiler.backend;
- if (left.isIntegerOrNull(compiler) && right.isIntegerOrNull(compiler)) {
- return backend.intType;
+ if (left.isIntegerOrNull(closedWorld) &&
+ right.isIntegerOrNull(closedWorld)) {
+ return closedWorld.commonMasks.intType;
}
- if (left.isNumberOrNull(compiler)) {
- if (left.isDoubleOrNull(compiler) || right.isDoubleOrNull(compiler)) {
- return backend.doubleType;
+ if (left.isNumberOrNull(closedWorld)) {
+ if (left.isDoubleOrNull(closedWorld) ||
+ right.isDoubleOrNull(closedWorld)) {
+ return closedWorld.commonMasks.doubleType;
}
- return backend.numType;
+ return closedWorld.commonMasks.numType;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
- bool isBuiltin(HInvokeDynamic instruction, Compiler compiler) {
- return instruction.inputs[1].isNumber(compiler) &&
- instruction.inputs[2].isNumber(compiler);
+ bool isBuiltin(HInvokeDynamic instruction, ClosedWorld closedWorld) {
+ return instruction.inputs[1].isNumber(closedWorld) &&
+ instruction.inputs[2].isNumber(closedWorld);
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
- if (isBuiltin(instruction, compiler)) {
- HInstruction builtin = newBuiltinVariant(instruction, compiler);
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ if (isBuiltin(instruction, closedWorld)) {
+ HInstruction builtin =
+ newBuiltinVariant(instruction, compiler, closedWorld);
if (builtin != null) return builtin;
// Even if there is no builtin equivalent instruction, we know
// the instruction does not have any side effect, and that it
@@ -210,20 +211,22 @@ abstract class BinaryArithmeticSpecializer extends InvokeDynamicSpecializer {
return null;
}
- bool inputsArePositiveIntegers(HInstruction instruction, Compiler compiler) {
+ bool inputsArePositiveIntegers(
+ HInstruction instruction, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- return left.isPositiveIntegerOrNull(compiler) &&
- right.isPositiveIntegerOrNull(compiler);
+ return left.isPositiveIntegerOrNull(closedWorld) &&
+ right.isPositiveIntegerOrNull(closedWorld);
}
- bool inputsAreUInt31(HInstruction instruction, Compiler compiler) {
+ bool inputsAreUInt31(HInstruction instruction, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- return left.isUInt31(compiler) && right.isUInt31(compiler);
+ return left.isUInt31(closedWorld) && right.isUInt31(closedWorld);
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction, Compiler compiler);
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld);
Selector renameToOptimizedSelector(
String name, Selector selector, Compiler compiler) {
@@ -239,16 +242,14 @@ class AddSpecializer extends BinaryArithmeticSpecializer {
const AddSpecializer();
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
- if (inputsAreUInt31(instruction, compiler)) {
- JavaScriptBackend backend = compiler.backend;
- return backend.uint32Type;
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ if (inputsAreUInt31(instruction, closedWorld)) {
+ return closedWorld.commonMasks.uint32Type;
}
- if (inputsArePositiveIntegers(instruction, compiler)) {
- JavaScriptBackend backend = compiler.backend;
- return backend.positiveIntType;
+ if (inputsArePositiveIntegers(instruction, closedWorld)) {
+ return closedWorld.commonMasks.positiveIntType;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
BinaryOperation operation(ConstantSystem constantSystem) {
@@ -256,9 +257,12 @@ class AddSpecializer extends BinaryArithmeticSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- return new HAdd(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, computeTypeFromInputTypes(instruction, compiler));
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ return new HAdd(
+ instruction.inputs[1],
+ instruction.inputs[2],
+ instruction.selector,
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
}
@@ -270,20 +274,18 @@ class DivideSpecializer extends BinaryArithmeticSpecializer {
}
TypeMask computeTypeFromInputTypes(
- HInstruction instruction, Compiler compiler) {
+ HInstruction instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
- JavaScriptBackend backend = compiler.backend;
- if (left.isNumberOrNull(compiler)) {
- return backend.doubleType;
+ if (left.isNumberOrNull(closedWorld)) {
+ return closedWorld.commonMasks.doubleType;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- JavaScriptBackend backend = compiler.backend;
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
return new HDivide(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, backend.doubleType);
+ instruction.selector, closedWorld.commonMasks.doubleType);
}
}
@@ -291,12 +293,11 @@ class ModuloSpecializer extends BinaryArithmeticSpecializer {
const ModuloSpecializer();
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
- if (inputsArePositiveIntegers(instruction, compiler)) {
- JavaScriptBackend backend = compiler.backend;
- return backend.positiveIntType;
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ if (inputsArePositiveIntegers(instruction, closedWorld)) {
+ return closedWorld.commonMasks.positiveIntType;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
BinaryOperation operation(ConstantSystem constantSystem) {
@@ -304,7 +305,7 @@ class ModuloSpecializer extends BinaryArithmeticSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
// Modulo cannot be mapped to the native operator (different semantics).
// TODO(sra): For non-negative values we can use JavaScript's %.
return null;
@@ -319,18 +320,20 @@ class MultiplySpecializer extends BinaryArithmeticSpecializer {
}
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
- if (inputsArePositiveIntegers(instruction, compiler)) {
- JavaScriptBackend backend = compiler.backend;
- return backend.positiveIntType;
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ if (inputsArePositiveIntegers(instruction, closedWorld)) {
+ return closedWorld.commonMasks.positiveIntType;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- return new HMultiply(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, computeTypeFromInputTypes(instruction, compiler));
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ return new HMultiply(
+ instruction.inputs[1],
+ instruction.inputs[2],
+ instruction.selector,
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
}
@@ -342,9 +345,12 @@ class SubtractSpecializer extends BinaryArithmeticSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- return new HSubtract(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, computeTypeFromInputTypes(instruction, compiler));
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ return new HSubtract(
+ instruction.inputs[1],
+ instruction.inputs[2],
+ instruction.selector,
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
}
@@ -356,18 +362,17 @@ class TruncatingDivideSpecializer extends BinaryArithmeticSpecializer {
}
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
- JavaScriptBackend backend = compiler.backend;
- if (hasUint31Result(instruction, compiler)) {
- return backend.uint31Type;
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ if (hasUint31Result(instruction, closedWorld)) {
+ return closedWorld.commonMasks.uint31Type;
}
- if (inputsArePositiveIntegers(instruction, compiler)) {
- return backend.positiveIntType;
+ if (inputsArePositiveIntegers(instruction, closedWorld)) {
+ return closedWorld.commonMasks.positiveIntType;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
- bool isNotZero(HInstruction instruction, Compiler compiler) {
+ bool isNotZero(HInstruction instruction) {
if (!instruction.isConstantInteger()) return false;
HConstant rightConstant = instruction;
IntConstantValue intConstant = rightConstant.constant;
@@ -375,7 +380,7 @@ class TruncatingDivideSpecializer extends BinaryArithmeticSpecializer {
return count != 0;
}
- bool isTwoOrGreater(HInstruction instruction, Compiler compiler) {
+ bool isTwoOrGreater(HInstruction instruction) {
if (!instruction.isConstantInteger()) return false;
HConstant rightConstant = instruction;
IntConstantValue intConstant = rightConstant.constant;
@@ -383,14 +388,14 @@ class TruncatingDivideSpecializer extends BinaryArithmeticSpecializer {
return count >= 2;
}
- bool hasUint31Result(HInstruction instruction, Compiler compiler) {
+ bool hasUint31Result(HInstruction instruction, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- if (right.isPositiveInteger(compiler)) {
- if (left.isUInt31(compiler) && isNotZero(right, compiler)) {
+ if (right.isPositiveInteger(closedWorld)) {
+ if (left.isUInt31(closedWorld) && isNotZero(right)) {
return true;
}
- if (left.isUInt32(compiler) && isTwoOrGreater(right, compiler)) {
+ if (left.isUInt32(closedWorld) && isTwoOrGreater(right)) {
return true;
}
}
@@ -398,12 +403,12 @@ class TruncatingDivideSpecializer extends BinaryArithmeticSpecializer {
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction right = instruction.inputs[2];
- if (isBuiltin(instruction, compiler)) {
- if (right.isPositiveInteger(compiler) && isNotZero(right, compiler)) {
- if (hasUint31Result(instruction, compiler)) {
- return newBuiltinVariant(instruction, compiler);
+ if (isBuiltin(instruction, closedWorld)) {
+ if (right.isPositiveInteger(closedWorld) && isNotZero(right)) {
+ if (hasUint31Result(instruction, closedWorld)) {
+ return newBuiltinVariant(instruction, compiler, closedWorld);
}
// We can call _tdivFast because the rhs is a 32bit integer
// and not 0, nor -1.
@@ -416,9 +421,12 @@ class TruncatingDivideSpecializer extends BinaryArithmeticSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- return new HTruncatingDivide(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, computeTypeFromInputTypes(instruction, compiler));
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ return new HTruncatingDivide(
+ instruction.inputs[1],
+ instruction.inputs[2],
+ instruction.selector,
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
}
@@ -426,15 +434,14 @@ abstract class BinaryBitOpSpecializer extends BinaryArithmeticSpecializer {
const BinaryBitOpSpecializer();
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
// All bitwise operations on primitive types either produce an
// integer or throw an error.
HInstruction left = instruction.inputs[1];
- JavaScriptBackend backend = compiler.backend;
- if (left.isPrimitiveOrNull(compiler)) {
- return backend.uint32Type;
+ if (left.isPrimitiveOrNull(closedWorld)) {
+ return closedWorld.commonMasks.uint32Type;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
bool argumentLessThan32(HInstruction instruction) {
@@ -445,10 +452,10 @@ abstract class BinaryBitOpSpecializer extends BinaryArithmeticSpecializer {
return count >= 0 && count <= 31;
}
- bool isPositive(HInstruction instruction, Compiler compiler) {
+ bool isPositive(HInstruction instruction, ClosedWorld closedWorld) {
// TODO: We should use the value range analysis. Currently, ranges
// are discarded just after the analysis.
- return instruction.isPositiveInteger(compiler);
+ return instruction.isPositiveInteger(closedWorld);
}
}
@@ -460,18 +467,18 @@ class ShiftLeftSpecializer extends BinaryBitOpSpecializer {
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- if (left.isNumber(compiler)) {
+ if (left.isNumber(closedWorld)) {
if (argumentLessThan32(right)) {
- return newBuiltinVariant(instruction, compiler);
+ return newBuiltinVariant(instruction, compiler, closedWorld);
}
// Even if there is no builtin equivalent instruction, we know
// the instruction does not have any side effect, and that it
// can be GVN'ed.
clearAllSideEffects(instruction);
- if (isPositive(right, compiler)) {
+ if (isPositive(right, closedWorld)) {
instruction.selector = renameToOptimizedSelector(
'_shlPositive', instruction.selector, compiler);
}
@@ -480,9 +487,12 @@ class ShiftLeftSpecializer extends BinaryBitOpSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- return new HShiftLeft(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, computeTypeFromInputTypes(instruction, compiler));
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ return new HShiftLeft(
+ instruction.inputs[1],
+ instruction.inputs[2],
+ instruction.selector,
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
}
@@ -490,31 +500,31 @@ class ShiftRightSpecializer extends BinaryBitOpSpecializer {
const ShiftRightSpecializer();
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
- if (left.isUInt32(compiler)) return left.instructionType;
- return super.computeTypeFromInputTypes(instruction, compiler);
+ if (left.isUInt32(closedWorld)) return left.instructionType;
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- if (left.isNumber(compiler)) {
- if (argumentLessThan32(right) && isPositive(left, compiler)) {
- return newBuiltinVariant(instruction, compiler);
+ if (left.isNumber(closedWorld)) {
+ if (argumentLessThan32(right) && isPositive(left, closedWorld)) {
+ return newBuiltinVariant(instruction, compiler, closedWorld);
}
// Even if there is no builtin equivalent instruction, we know
// the instruction does not have any side effect, and that it
// can be GVN'ed.
clearAllSideEffects(instruction);
- if (isPositive(right, compiler) && isPositive(left, compiler)) {
+ if (isPositive(right, closedWorld) && isPositive(left, closedWorld)) {
instruction.selector = renameToOptimizedSelector(
'_shrBothPositive', instruction.selector, compiler);
- } else if (isPositive(left, compiler) && right.isNumber(compiler)) {
+ } else if (isPositive(left, closedWorld) && right.isNumber(closedWorld)) {
instruction.selector = renameToOptimizedSelector(
'_shrReceiverPositive', instruction.selector, compiler);
- } else if (isPositive(right, compiler)) {
+ } else if (isPositive(right, closedWorld)) {
instruction.selector = renameToOptimizedSelector(
'_shrOtherPositive', instruction.selector, compiler);
}
@@ -523,9 +533,12 @@ class ShiftRightSpecializer extends BinaryBitOpSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- return new HShiftRight(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, computeTypeFromInputTypes(instruction, compiler));
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ return new HShiftRight(
+ instruction.inputs[1],
+ instruction.inputs[2],
+ instruction.selector,
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
BinaryOperation operation(ConstantSystem constantSystem) {
@@ -541,20 +554,22 @@ class BitOrSpecializer extends BinaryBitOpSpecializer {
}
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- JavaScriptBackend backend = compiler.backend;
- if (left.isUInt31(compiler) && right.isUInt31(compiler)) {
- return backend.uint31Type;
+ if (left.isUInt31(closedWorld) && right.isUInt31(closedWorld)) {
+ return closedWorld.commonMasks.uint31Type;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- return new HBitOr(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, computeTypeFromInputTypes(instruction, compiler));
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ return new HBitOr(
+ instruction.inputs[1],
+ instruction.inputs[2],
+ instruction.selector,
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
}
@@ -566,21 +581,23 @@ class BitAndSpecializer extends BinaryBitOpSpecializer {
}
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- JavaScriptBackend backend = compiler.backend;
- if (left.isPrimitiveOrNull(compiler) &&
- (left.isUInt31(compiler) || right.isUInt31(compiler))) {
- return backend.uint31Type;
+ if (left.isPrimitiveOrNull(closedWorld) &&
+ (left.isUInt31(closedWorld) || right.isUInt31(closedWorld))) {
+ return closedWorld.commonMasks.uint31Type;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- return new HBitAnd(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, computeTypeFromInputTypes(instruction, compiler));
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ return new HBitAnd(
+ instruction.inputs[1],
+ instruction.inputs[2],
+ instruction.selector,
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
}
@@ -592,20 +609,22 @@ class BitXorSpecializer extends BinaryBitOpSpecializer {
}
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- JavaScriptBackend backend = compiler.backend;
- if (left.isUInt31(compiler) && right.isUInt31(compiler)) {
- return backend.uint31Type;
+ if (left.isUInt31(closedWorld) && right.isUInt31(closedWorld)) {
+ return closedWorld.commonMasks.uint31Type;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- return new HBitXor(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, computeTypeFromInputTypes(instruction, compiler));
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ return new HBitXor(
+ instruction.inputs[1],
+ instruction.inputs[2],
+ instruction.selector,
+ computeTypeFromInputTypes(instruction, compiler, closedWorld));
}
}
@@ -613,47 +632,46 @@ abstract class RelationalSpecializer extends InvokeDynamicSpecializer {
const RelationalSpecializer();
TypeMask computeTypeFromInputTypes(
- HInvokeDynamic instruction, Compiler compiler) {
- JavaScriptBackend backend = compiler.backend;
- if (instruction.inputs[1].isPrimitiveOrNull(compiler)) {
- return backend.boolType;
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
+ if (instruction.inputs[1].isPrimitiveOrNull(closedWorld)) {
+ return closedWorld.commonMasks.boolType;
}
- return super.computeTypeFromInputTypes(instruction, compiler);
+ return super.computeTypeFromInputTypes(instruction, compiler, closedWorld);
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- if (left.isNumber(compiler) && right.isNumber(compiler)) {
- return newBuiltinVariant(instruction, compiler);
+ if (left.isNumber(closedWorld) && right.isNumber(closedWorld)) {
+ return newBuiltinVariant(instruction, closedWorld);
}
return null;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction, Compiler compiler);
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, ClosedWorld closedWorld);
}
class EqualsSpecializer extends RelationalSpecializer {
const EqualsSpecializer();
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
TypeMask instructionType = left.instructionType;
- if (right.isConstantNull() || left.isPrimitiveOrNull(compiler)) {
- return newBuiltinVariant(instruction, compiler);
+ if (right.isConstantNull() || left.isPrimitiveOrNull(closedWorld)) {
+ return newBuiltinVariant(instruction, closedWorld);
}
- ClosedWorld world = compiler.closedWorld;
- JavaScriptBackend backend = compiler.backend;
Iterable<Element> matches =
- world.allFunctions.filter(instruction.selector, instructionType);
+ closedWorld.allFunctions.filter(instruction.selector, instructionType);
// This test relies the on `Object.==` and `Interceptor.==` always being
// implemented because if the selector matches by subtype, it still will be
// a regular object or an interceptor.
- if (matches.every(backend.isDefaultEqualityImplementation)) {
- return newBuiltinVariant(instruction, compiler);
+ if (matches
+ .every(closedWorld.backendClasses.isDefaultEqualityImplementation)) {
+ return newBuiltinVariant(instruction, closedWorld);
}
return null;
}
@@ -663,10 +681,9 @@ class EqualsSpecializer extends RelationalSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- JavaScriptBackend backend = compiler.backend;
+ HInvokeDynamic instruction, ClosedWorld closedWorld) {
return new HIdentity(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, backend.boolType);
+ instruction.selector, closedWorld.commonMasks.boolType);
}
}
@@ -678,10 +695,9 @@ class LessSpecializer extends RelationalSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- JavaScriptBackend backend = compiler.backend;
+ HInvokeDynamic instruction, ClosedWorld closedWorld) {
return new HLess(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, backend.boolType);
+ instruction.selector, closedWorld.commonMasks.boolType);
}
}
@@ -693,10 +709,9 @@ class GreaterSpecializer extends RelationalSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- JavaScriptBackend backend = compiler.backend;
+ HInvokeDynamic instruction, ClosedWorld closedWorld) {
return new HGreater(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, backend.boolType);
+ instruction.selector, closedWorld.commonMasks.boolType);
}
}
@@ -708,10 +723,9 @@ class GreaterEqualSpecializer extends RelationalSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- JavaScriptBackend backend = compiler.backend;
+ HInvokeDynamic instruction, ClosedWorld closedWorld) {
return new HGreaterEqual(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, backend.boolType);
+ instruction.selector, closedWorld.commonMasks.boolType);
}
}
@@ -723,10 +737,9 @@ class LessEqualSpecializer extends RelationalSpecializer {
}
HInstruction newBuiltinVariant(
- HInvokeDynamic instruction, Compiler compiler) {
- JavaScriptBackend backend = compiler.backend;
+ HInvokeDynamic instruction, ClosedWorld closedWorld) {
return new HLessEqual(instruction.inputs[1], instruction.inputs[2],
- instruction.selector, backend.boolType);
+ instruction.selector, closedWorld.commonMasks.boolType);
}
}
@@ -738,11 +751,11 @@ class CodeUnitAtSpecializer extends InvokeDynamicSpecializer {
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
// TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index
// bounds checking optimizations as for HIndex.
HInstruction receiver = instruction.getDartReceiver(compiler);
- if (receiver.isStringOrNull(compiler)) {
+ if (receiver.isStringOrNull(closedWorld)) {
// Even if there is no builtin equivalent instruction, we know
// String.codeUnitAt does not have any side effect (other than throwing),
// and that it can be GVN'ed.
@@ -760,9 +773,9 @@ class RoundSpecializer extends InvokeDynamicSpecializer {
}
HInstruction tryConvertToBuiltin(
- HInvokeDynamic instruction, Compiler compiler) {
+ HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld) {
HInstruction receiver = instruction.getDartReceiver(compiler);
- if (receiver.isNumberOrNull(compiler)) {
+ if (receiver.isNumberOrNull(closedWorld)) {
// Even if there is no builtin equivalent instruction, we know the
// instruction does not have any side effect, and that it can be GVN'ed.
clearAllSideEffects(instruction);
« no previous file with comments | « pkg/compiler/lib/src/ssa/interceptor_simplifier.dart ('k') | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698