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

Side by Side Diff: lib/compiler/implementation/ssa/codegen.dart

Issue 10539156: Track fields which are known to be always set to integer constants (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 6 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 class SsaCodeGeneratorTask extends CompilerTask { 5 class SsaCodeGeneratorTask extends CompilerTask {
6 final JavaScriptBackend backend; 6 final JavaScriptBackend backend;
7 SsaCodeGeneratorTask(JavaScriptBackend backend) 7 SsaCodeGeneratorTask(JavaScriptBackend backend)
8 : this.backend = backend, 8 : this.backend = backend,
9 super(backend.compiler); 9 super(backend.compiler);
10 String get name() => 'SSA code generator'; 10 String get name() => 'SSA code generator';
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1165 endExpression(JSPrecedence.EQUALITY_PRECEDENCE); 1165 endExpression(JSPrecedence.EQUALITY_PRECEDENCE);
1166 } else if (node.element === equalsNullElement || 1166 } else if (node.element === equalsNullElement ||
1167 node.element === boolifiedEqualsNullElement) { 1167 node.element === boolifiedEqualsNullElement) {
1168 beginExpression(JSPrecedence.CALL_PRECEDENCE); 1168 beginExpression(JSPrecedence.CALL_PRECEDENCE);
1169 use(node.target, JSPrecedence.CALL_PRECEDENCE); 1169 use(node.target, JSPrecedence.CALL_PRECEDENCE);
1170 buffer.add('('); 1170 buffer.add('(');
1171 use(node.left, JSPrecedence.ASSIGNMENT_PRECEDENCE); 1171 use(node.left, JSPrecedence.ASSIGNMENT_PRECEDENCE);
1172 buffer.add(')'); 1172 buffer.add(')');
1173 endExpression(JSPrecedence.CALL_PRECEDENCE); 1173 endExpression(JSPrecedence.CALL_PRECEDENCE);
1174 } else { 1174 } else {
1175 visitInvokeStatic(node); 1175 if (node.left is HFieldGet && node.right is HConstant) {
ngeoffray 2012/06/14 13:01:21 This is too late in the game. The node.builtin sho
Søren Gjesse 2012/06/15 13:19:59 Removed all this as the SSA optimization phase now
1176 HFieldGet left = node.left;
1177 HConstant right = node.right;
1178 Type type = left.receiver.propagatedType.computeType(compiler);
1179 if (left.element != null &&
1180 compiler.codegenWorld.hasFieldOnlyIntegerSetters(
1181 type, left.element.name)) {
1182 switch (compiler.pass) {
1183 case 1:
1184 visitInvokeStatic(node);
1185 break;
1186 case 2:
1187 if (right.isConstantInteger()) {
1188 buffer.add('(');
1189 use(node.left, JSPrecedence.EQUALITY_PRECEDENCE);
1190 buffer.add(' === ');
1191 use(node.right, JSPrecedence.RELATIONAL_PRECEDENCE);
1192 buffer.add(')');
1193 } else {
1194 visitInvokeStatic(node);
1195 }
1196 break;
1197 }
1198 } else {
1199 visitInvokeStatic(node);
1200 }
1201 } else {
1202 visitInvokeStatic(node);
1203 }
1176 } 1204 }
1177 } 1205 }
1178 1206
1179 visitAdd(HAdd node) => visitInvokeBinary(node, '+'); 1207 visitAdd(HAdd node) => visitInvokeBinary(node, '+');
1180 visitDivide(HDivide node) => visitInvokeBinary(node, '/'); 1208 visitDivide(HDivide node) => visitInvokeBinary(node, '/');
1181 visitMultiply(HMultiply node) => visitInvokeBinary(node, '*'); 1209 visitMultiply(HMultiply node) => visitInvokeBinary(node, '*');
1182 visitSubtract(HSubtract node) => visitInvokeBinary(node, '-'); 1210 visitSubtract(HSubtract node) => visitInvokeBinary(node, '-');
1183 // Truncating divide does not have a JS equivalent. 1211 // Truncating divide does not have a JS equivalent.
1184 visitTruncatingDivide(HTruncatingDivide node) => visitInvokeStatic(node); 1212 visitTruncatingDivide(HTruncatingDivide node) => visitInvokeStatic(node);
1185 // Modulo cannot be mapped to the native operator (different semantics). 1213 // Modulo cannot be mapped to the native operator (different semantics).
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after
1721 visitFieldSet(HFieldSet node) { 1749 visitFieldSet(HFieldSet node) {
1722 String name; 1750 String name;
1723 if (!node.isFromActivation()) { 1751 if (!node.isFromActivation()) {
1724 name = compiler.namer.getName(node.element); 1752 name = compiler.namer.getName(node.element);
1725 beginExpression(JSPrecedence.ASSIGNMENT_PRECEDENCE); 1753 beginExpression(JSPrecedence.ASSIGNMENT_PRECEDENCE);
1726 use(node.receiver, JSPrecedence.MEMBER_PRECEDENCE); 1754 use(node.receiver, JSPrecedence.MEMBER_PRECEDENCE);
1727 buffer.add('.'); 1755 buffer.add('.');
1728 buffer.add(name); 1756 buffer.add(name);
1729 Type type = node.receiver.propagatedType.computeType(compiler); 1757 Type type = node.receiver.propagatedType.computeType(compiler);
1730 if (type != null) { 1758 if (type != null) {
1731 world.registerFieldSetter(node.element.name, type); 1759 Type valueType = node.value.propagatedType.computeType(compiler);
1760 if (valueType.toString() == "int") {
ngeoffray 2012/06/14 13:01:21 You should change that to node.value.isInteger()
Søren Gjesse 2012/06/15 13:19:59 Done.
1761 world.registerFieldSetter(node.element.name, type, true);
1762 } else {
1763 world.registerFieldSetter(node.element.name, type, false);
1764 }
1732 } 1765 }
1733 } else { 1766 } else {
1734 declareInstruction(node.receiver); 1767 declareInstruction(node.receiver);
1735 } 1768 }
1736 buffer.add(' = '); 1769 buffer.add(' = ');
1737 use(node.value, JSPrecedence.ASSIGNMENT_PRECEDENCE); 1770 use(node.value, JSPrecedence.ASSIGNMENT_PRECEDENCE);
1738 if (node.receiver !== null) { 1771 if (node.receiver !== null) {
1739 endExpression(JSPrecedence.ASSIGNMENT_PRECEDENCE); 1772 endExpression(JSPrecedence.ASSIGNMENT_PRECEDENCE);
1740 } 1773 }
1741 } 1774 }
(...skipping 1143 matching lines...) Expand 10 before | Expand all | Expand 10 after
2885 startBailoutSwitch(); 2918 startBailoutSwitch();
2886 } 2919 }
2887 } 2920 }
2888 2921
2889 void endLabeledBlock(HLabeledBlockInformation labeledBlockInfo) { 2922 void endLabeledBlock(HLabeledBlockInformation labeledBlockInfo) {
2890 if (labeledBlockInfo.body.start.hasGuards()) { 2923 if (labeledBlockInfo.body.start.hasGuards()) {
2891 endBailoutSwitch(); 2924 endBailoutSwitch();
2892 } 2925 }
2893 } 2926 }
2894 } 2927 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698