| Index: sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
|
| index ba34bb2caab2694399cd3618b22f424c2c2616ac..fdedd2a38b2969e099b9d55dda8ff9443faf529e 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
|
| @@ -816,6 +816,8 @@ abstract class HInstruction implements Spannable {
|
| void setUseGvn() { _useGvn = true; }
|
| void clearUseGvn() { _useGvn = false; }
|
|
|
| + bool get isMovable => useGvn();
|
| +
|
| /**
|
| * A pure instruction is an instruction that does not have any side
|
| * effect, nor any dependency. They can be moved anywhere in the
|
| @@ -2464,16 +2466,27 @@ class HTypeConversion extends HCheck {
|
| bool dataEquals(HTypeConversion other) {
|
| return kind == other.kind
|
| && typeExpression == other.typeExpression
|
| - && checkedType == other.checkedType;
|
| + && checkedType == other.checkedType
|
| + && receiverTypeCheckSelector == other.receiverTypeCheckSelector;
|
| }
|
| }
|
|
|
| /// The [HTypeKnown] instruction marks a value with a refined type.
|
| class HTypeKnown extends HCheck {
|
| TypeMask knownType;
|
| - HTypeKnown(TypeMask knownType, HInstruction input)
|
| + bool _isMovable;
|
| +
|
| + HTypeKnown.pinned(TypeMask knownType, HInstruction input)
|
| : this.knownType = knownType,
|
| + this._isMovable = false,
|
| super(<HInstruction>[input], knownType);
|
| +
|
| + HTypeKnown.witnessed(TypeMask knownType, HInstruction input,
|
| + HInstruction witness)
|
| + : this.knownType = knownType,
|
| + this._isMovable = true,
|
| + super(<HInstruction>[input, witness], knownType);
|
| +
|
| toString() => 'TypeKnown $knownType';
|
| accept(HVisitor visitor) => visitor.visitTypeKnown(this);
|
|
|
| @@ -2484,6 +2497,7 @@ class HTypeKnown extends HCheck {
|
| int typeCode() => HInstruction.TYPE_KNOWN_TYPECODE;
|
| bool typeEquals(HInstruction other) => other is HTypeKnown;
|
| bool isCodeMotionInvariant() => true;
|
| + bool get isMovable => _isMovable && useGvn();
|
|
|
| bool dataEquals(HTypeKnown other) {
|
| return knownType == other.knownType
|
| @@ -2496,6 +2510,9 @@ class HRangeConversion extends HCheck {
|
| : super(<HInstruction>[input], type) {
|
| sourceElement = input.sourceElement;
|
| }
|
| +
|
| + bool get isMovable => false;
|
| +
|
| accept(HVisitor visitor) => visitor.visitRangeConversion(this);
|
| }
|
|
|
|
|