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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/ssa/nodes.dart

Issue 206553002: Prevent hoisting of certain check nodes, including [HTypeKnown]. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of ssa; 5 part of ssa;
6 6
7 abstract class HVisitor<R> { 7 abstract class HVisitor<R> {
8 R visitAdd(HAdd node); 8 R visitAdd(HAdd node);
9 R visitBitAnd(HBitAnd node); 9 R visitBitAnd(HBitAnd node);
10 R visitBitNot(HBitNot node); 10 R visitBitNot(HBitNot node);
(...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 : id = idCounter++, usedBy = <HInstruction>[] { 809 : id = idCounter++, usedBy = <HInstruction>[] {
810 assert(inputs.every((e) => e != null)); 810 assert(inputs.every((e) => e != null));
811 } 811 }
812 812
813 int get hashCode => id; 813 int get hashCode => id;
814 814
815 bool useGvn() => _useGvn; 815 bool useGvn() => _useGvn;
816 void setUseGvn() { _useGvn = true; } 816 void setUseGvn() { _useGvn = true; }
817 void clearUseGvn() { _useGvn = false; } 817 void clearUseGvn() { _useGvn = false; }
818 818
819 bool get isMovable => useGvn();
820
819 /** 821 /**
820 * A pure instruction is an instruction that does not have any side 822 * A pure instruction is an instruction that does not have any side
821 * effect, nor any dependency. They can be moved anywhere in the 823 * effect, nor any dependency. They can be moved anywhere in the
822 * graph. 824 * graph.
823 */ 825 */
824 bool isPure() { 826 bool isPure() {
825 return !sideEffects.hasSideEffects() 827 return !sideEffects.hasSideEffects()
826 && !sideEffects.dependsOnSomething() 828 && !sideEffects.dependsOnSomething()
827 && !canThrow(); 829 && !canThrow();
828 } 830 }
(...skipping 1635 matching lines...) Expand 10 before | Expand all | Expand 10 after
2464 bool dataEquals(HTypeConversion other) { 2466 bool dataEquals(HTypeConversion other) {
2465 return kind == other.kind 2467 return kind == other.kind
2466 && typeExpression == other.typeExpression 2468 && typeExpression == other.typeExpression
2467 && checkedType == other.checkedType; 2469 && checkedType == other.checkedType;
2468 } 2470 }
2469 } 2471 }
2470 2472
2471 /// The [HTypeKnown] instruction marks a value with a refined type. 2473 /// The [HTypeKnown] instruction marks a value with a refined type.
2472 class HTypeKnown extends HCheck { 2474 class HTypeKnown extends HCheck {
2473 TypeMask knownType; 2475 TypeMask knownType;
2474 HTypeKnown(TypeMask knownType, HInstruction input) 2476 bool _isMovable;
2477
2478 HTypeKnown.pinned(TypeMask knownType, HInstruction input)
2475 : this.knownType = knownType, 2479 : this.knownType = knownType,
2480 this._isMovable = false,
2476 super(<HInstruction>[input], knownType); 2481 super(<HInstruction>[input], knownType);
2482
2483 HTypeKnown.witnessed(TypeMask knownType, HInstruction input,
2484 HInstruction witness)
floitsch 2014/03/20 16:07:25 nit: I prefer aligning with the first argument.
herhut 2014/03/20 16:25:11 Done.
2485 : this.knownType = knownType,
2486 this._isMovable = true,
2487 super(<HInstruction>[input, witness], knownType);
2488
2477 toString() => 'TypeKnown $knownType'; 2489 toString() => 'TypeKnown $knownType';
2478 accept(HVisitor visitor) => visitor.visitTypeKnown(this); 2490 accept(HVisitor visitor) => visitor.visitTypeKnown(this);
2479 2491
2480 bool isJsStatement() => false; 2492 bool isJsStatement() => false;
2481 bool isControlFlow() => false; 2493 bool isControlFlow() => false;
2482 bool canThrow() => false; 2494 bool canThrow() => false;
2483 2495
2484 int typeCode() => HInstruction.TYPE_KNOWN_TYPECODE; 2496 int typeCode() => HInstruction.TYPE_KNOWN_TYPECODE;
2485 bool typeEquals(HInstruction other) => other is HTypeKnown; 2497 bool typeEquals(HInstruction other) => other is HTypeKnown;
2486 bool isCodeMotionInvariant() => true; 2498 bool isCodeMotionInvariant() => true;
2499 bool get isMovable => _isMovable && useGvn();
2487 2500
2488 bool dataEquals(HTypeKnown other) { 2501 bool dataEquals(HTypeKnown other) {
2489 return knownType == other.knownType 2502 return knownType == other.knownType
2490 && instructionType == other.instructionType; 2503 && instructionType == other.instructionType;
2491 } 2504 }
2492 } 2505 }
2493 2506
2494 class HRangeConversion extends HCheck { 2507 class HRangeConversion extends HCheck {
2495 HRangeConversion(HInstruction input, type) 2508 HRangeConversion(HInstruction input, type)
2496 : super(<HInstruction>[input], type) { 2509 : super(<HInstruction>[input], type) {
2497 sourceElement = input.sourceElement; 2510 sourceElement = input.sourceElement;
2498 } 2511 }
2512
2513 bool get isMovable => false;
2514
2499 accept(HVisitor visitor) => visitor.visitRangeConversion(this); 2515 accept(HVisitor visitor) => visitor.visitRangeConversion(this);
2500 } 2516 }
2501 2517
2502 class HStringConcat extends HInstruction { 2518 class HStringConcat extends HInstruction {
2503 final ast.Node node; 2519 final ast.Node node;
2504 HStringConcat(HInstruction left, HInstruction right, this.node, TypeMask type) 2520 HStringConcat(HInstruction left, HInstruction right, this.node, TypeMask type)
2505 : super(<HInstruction>[left, right], type) { 2521 : super(<HInstruction>[left, right], type) {
2506 // TODO(sra): Until Issue 9293 is fixed, this false dependency keeps the 2522 // TODO(sra): Until Issue 9293 is fixed, this false dependency keeps the
2507 // concats bunched with stringified inputs for much better looking code with 2523 // concats bunched with stringified inputs for much better looking code with
2508 // fewer temps. 2524 // fewer temps.
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
2949 class HDynamicType extends HRuntimeType { 2965 class HDynamicType extends HRuntimeType {
2950 HDynamicType(DynamicType dartType, TypeMask instructionType) 2966 HDynamicType(DynamicType dartType, TypeMask instructionType)
2951 : super(const <HInstruction>[], dartType, instructionType); 2967 : super(const <HInstruction>[], dartType, instructionType);
2952 2968
2953 accept(HVisitor visitor) => visitor.visitDynamicType(this); 2969 accept(HVisitor visitor) => visitor.visitDynamicType(this);
2954 2970
2955 int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE; 2971 int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE;
2956 2972
2957 bool typeEquals(HInstruction other) => other is HDynamicType; 2973 bool typeEquals(HInstruction other) => other is HDynamicType;
2958 } 2974 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698