Chromium Code Reviews| Index: lib/compiler/implementation/ssa/nodes.dart |
| diff --git a/lib/compiler/implementation/ssa/nodes.dart b/lib/compiler/implementation/ssa/nodes.dart |
| index 5fc48d3c314b70210c66cc48feb08934fd32a1bb..1e0474fc0db5ca195b20ed5728f6b44b9da2374b 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); |
| @@ -296,6 +297,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); |
| @@ -2252,6 +2254,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: The first access has side-effects, but we afterwards we should be |
| + // able to GVN. |
| + setAllSideEffects(); |
|
kasperl
2012/08/17 09:30:04
Can't you just enable GVN for the lazy-static and
floitsch
2012/09/04 17:32:21
I tried, but iirc there are some assumptions and a
|
| + } |
| + |
| + toString() => 'lazy static ${element.name}'; |
| + accept(HVisitor visitor) => visitor.visitLazyStatic(this); |
| + |
| + int typeCode() => 30; |
| + // TODO(floitsch): can we do better here? |
| + bool isCodeMotionInvariant() => false; |
| +} |
| + |
| class HStaticStore extends HInstruction { |
| Element element; |
| HStaticStore(this.element, HInstruction value) : super(<HInstruction>[value]); |