| Index: lib/compiler/implementation/ssa/nodes.dart
|
| diff --git a/lib/compiler/implementation/ssa/nodes.dart b/lib/compiler/implementation/ssa/nodes.dart
|
| index 1e0db24303e6a169451afcc091a5342f1cf540e6..8d9455d5873cf0ccb1c86a69165a194ce1873521 100644
|
| --- a/lib/compiler/implementation/ssa/nodes.dart
|
| +++ b/lib/compiler/implementation/ssa/nodes.dart
|
| @@ -37,6 +37,7 @@ interface HVisitor<R> {
|
| R visitInvokeStatic(HInvokeStatic node);
|
| R visitInvokeSuper(HInvokeSuper node);
|
| R visitIs(HIs node);
|
| + R visitLazyStatic(HLazyStatic node);
|
| R visitLess(HLess node);
|
| R visitLessEqual(HLessEqual node);
|
| R visitLiteralList(HLiteralList node);
|
| @@ -297,6 +298,7 @@ class HBaseVisitor extends HGraphVisitor implements HVisitor {
|
| visitInvokeStatic(HInvokeStatic node) => visitInvoke(node);
|
| visitInvokeSuper(HInvokeSuper node) => visitInvoke(node);
|
| visitJump(HJump node) => visitControlFlow(node);
|
| + visitLazyStatic(HLazyStatic node) => visitStatic(node);
|
| visitLess(HLess node) => visitRelational(node);
|
| visitLessEqual(HLessEqual node) => visitRelational(node);
|
| visitLiteralList(HLiteralList node) => visitInstruction(node);
|
| @@ -2307,6 +2309,24 @@ class HStatic extends HInstruction {
|
| bool isCodeMotionInvariant() => !element.isAssignable();
|
| }
|
|
|
| +/** An [HLazyStatic] is a static that is initialized lazily at first read. */
|
| +class HLazyStatic extends HStatic {
|
| + HLazyStatic(Element element) : super(element);
|
| +
|
| + void prepareGvn(HTypeMap types) {
|
| + // TODO(4931): The first access has side-effects, but we afterwards we
|
| + // should be able to GVN.
|
| + setAllSideEffects();
|
| + }
|
| +
|
| + toString() => 'lazy static ${element.name}';
|
| + accept(HVisitor visitor) => visitor.visitLazyStatic(this);
|
| +
|
| + int typeCode() => 30;
|
| + // TODO(4931): can we do better here?
|
| + bool isCodeMotionInvariant() => false;
|
| +}
|
| +
|
| class HStaticStore extends HInstruction {
|
| Element element;
|
| HStaticStore(this.element, HInstruction value) : super(<HInstruction>[value]);
|
|
|