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

Side by Side Diff: pkg/compiler/lib/src/ssa/optimize.dart

Issue 1079253002: Use native behavior for dead code elimination (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 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 OptimizationPhase { 7 abstract class OptimizationPhase {
8 String get name; 8 String get name;
9 void visitGraph(HGraph graph); 9 void visitGraph(HGraph graph);
10 } 10 }
(...skipping 986 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 ConstantValue constant = 997 ConstantValue constant =
998 new DummyConstantValue(const TypeMask.nonNullEmpty()); 998 new DummyConstantValue(const TypeMask.nonNullEmpty());
999 zapInstructionCache = analyzer.graph.addConstant(constant, compiler); 999 zapInstructionCache = analyzer.graph.addConstant(constant, compiler);
1000 } 1000 }
1001 return zapInstructionCache; 1001 return zapInstructionCache;
1002 } 1002 }
1003 1003
1004 /// Returns true of [foreign] will throw an noSuchMethod error if 1004 /// Returns true of [foreign] will throw an noSuchMethod error if
1005 /// receiver is `null` before having any other side-effects. 1005 /// receiver is `null` before having any other side-effects.
1006 bool templateThrowsNSMonNull(HForeignCode foreign, HInstruction receiver) { 1006 bool templateThrowsNSMonNull(HForeignCode foreign, HInstruction receiver) {
1007 if (foreign.inputs.length < 1) return false;
1008 if (foreign.inputs.first != receiver) return false;
1009 if (foreign.throwBehavior.isNullNSMGuard) return true;
1010
1011 // TODO(sra): Fix NativeThrowBehavior to distinguish MAY from
1012 // throws-nsm-on-null-followed-by-MAY and remove all the code below.
1013
1007 // We look for a template of the form 1014 // We look for a template of the form
1008 // 1015 //
1009 // #.something -or- #.something() 1016 // #.something -or- #.something()
1010 // 1017 //
1011 // where # is substituted by receiver. 1018 // where # is substituted by receiver.
1012 js.Template template = foreign.codeTemplate; 1019 js.Template template = foreign.codeTemplate;
1013 js.Node node = template.ast; 1020 js.Node node = template.ast;
1014 // #.something = ... 1021 // #.something = ...
1015 if (node is js.Assignment) { 1022 if (node is js.Assignment) {
1016 js.Assignment assignment = node; 1023 js.Assignment assignment = node;
1017 node = assignment.leftHandSide; 1024 node = assignment.leftHandSide;
1018 } 1025 }
1019 1026
1020 // #.something 1027 // #.something
1021 if (node is js.PropertyAccess) { 1028 if (node is js.PropertyAccess) {
1022 js.PropertyAccess access = node; 1029 js.PropertyAccess access = node;
1023 if (access.receiver is js.InterpolatedExpression) { 1030 if (access.receiver is js.InterpolatedExpression) {
1024 js.InterpolatedExpression hole = access.receiver; 1031 js.InterpolatedExpression hole = access.receiver;
1025 return hole.isPositional && foreign.inputs.first == receiver; 1032 return hole.isPositional && hole.nameOrPosition == 0;
1026 } 1033 }
1027 } 1034 }
1028 return false; 1035 return false;
1029 } 1036 }
1030 1037
1031 /// Returns whether the next throwing instruction that may have side 1038 /// Returns whether the next throwing instruction that may have side
1032 /// effects after [instruction], throws [NoSuchMethodError] on the 1039 /// effects after [instruction], throws [NoSuchMethodError] on the
1033 /// same receiver of [instruction]. 1040 /// same receiver of [instruction].
1034 bool hasFollowingThrowingNSM(HInstruction instruction) { 1041 bool hasFollowingThrowingNSM(HInstruction instruction) {
1035 HInstruction receiver = instruction.getDartReceiver(compiler); 1042 HInstruction receiver = instruction.getDartReceiver(compiler);
(...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after
2236 2243
2237 keyedValues.forEach((receiver, values) { 2244 keyedValues.forEach((receiver, values) {
2238 result.keyedValues[receiver] = 2245 result.keyedValues[receiver] =
2239 new Map<HInstruction, HInstruction>.from(values); 2246 new Map<HInstruction, HInstruction>.from(values);
2240 }); 2247 });
2241 2248
2242 result.nonEscapingReceivers.addAll(nonEscapingReceivers); 2249 result.nonEscapingReceivers.addAll(nonEscapingReceivers);
2243 return result; 2250 return result;
2244 } 2251 }
2245 } 2252 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698