OLD | NEW |
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 class SsaCodeGeneratorTask extends CompilerTask { | 7 class SsaCodeGeneratorTask extends CompilerTask { |
8 | 8 |
9 final JavaScriptBackend backend; | 9 final JavaScriptBackend backend; |
10 | 10 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 continueAction = new Map<Element, ElementAction>(); | 182 continueAction = new Map<Element, ElementAction>(); |
183 | 183 |
184 Compiler get compiler => backend.compiler; | 184 Compiler get compiler => backend.compiler; |
185 NativeEmitter get nativeEmitter => backend.emitter.nativeEmitter; | 185 NativeEmitter get nativeEmitter => backend.emitter.nativeEmitter; |
186 CodegenEnqueuer get world => backend.compiler.enqueuer.codegen; | 186 CodegenEnqueuer get world => backend.compiler.enqueuer.codegen; |
187 | 187 |
188 bool isGenerateAtUseSite(HInstruction instruction) { | 188 bool isGenerateAtUseSite(HInstruction instruction) { |
189 return generateAtUseSite.contains(instruction); | 189 return generateAtUseSite.contains(instruction); |
190 } | 190 } |
191 | 191 |
192 bool isNonNegativeInt32Constant(HInstruction instruction) { | |
193 if (instruction.isConstantInteger()) { | |
194 HConstant constantInstruction = instruction; | |
195 PrimitiveConstant primitiveConstant = constantInstruction.constant; | |
196 int value = primitiveConstant.value; | |
197 if (value >= 0 && value < (1 << 31)) { | |
198 return true; | |
199 } | |
200 } | |
201 return false; | |
202 } | |
203 | |
204 bool hasNonBitOpUser(HInstruction instruction, Set<HPhi> phiSet) { | 192 bool hasNonBitOpUser(HInstruction instruction, Set<HPhi> phiSet) { |
205 for (HInstruction user in instruction.usedBy) { | 193 for (HInstruction user in instruction.usedBy) { |
206 if (user is HPhi) { | 194 if (user is HPhi) { |
207 if (!phiSet.contains(user)) { | 195 if (!phiSet.contains(user)) { |
208 phiSet.add(user); | 196 phiSet.add(user); |
209 if (hasNonBitOpUser(user, phiSet)) return true; | 197 if (hasNonBitOpUser(user, phiSet)) return true; |
210 } | 198 } |
211 } else if (user is! HBitNot && user is! HBinaryBitOp) { | 199 } else if (user is! HBitNot && user is! HBinaryBitOp) { |
212 return true; | 200 return true; |
213 } | 201 } |
214 } | 202 } |
215 return false; | 203 return false; |
216 } | 204 } |
217 | 205 |
218 // We want the outcome of bit-operations to be positive. However, if | 206 bool requiresUintConversion(instruction) { |
219 // the result of a bit-operation is only used by other bit | 207 if (instruction.isUInt31(compiler)) return false; |
220 // operations we do not have to convert to an unsigned | 208 // If the result of a bit-operation is only used by other bit |
221 // integer. Also, if we are using & with a positive constant we know | 209 // operations, we do not have to convert to an unsigned integer. |
222 // that the result is positive already and need no conversion. | |
223 bool requiresUintConversion(HInstruction instruction) { | |
224 if (instruction is HShiftRight) { | |
225 return false; | |
226 } | |
227 if (instruction is HBitAnd) { | |
228 HBitAnd bitAnd = instruction; | |
229 if (isNonNegativeInt32Constant(bitAnd.left) || | |
230 isNonNegativeInt32Constant(bitAnd.right)) { | |
231 return false; | |
232 } | |
233 } | |
234 return hasNonBitOpUser(instruction, new Set<HPhi>()); | 210 return hasNonBitOpUser(instruction, new Set<HPhi>()); |
235 } | 211 } |
236 | 212 |
237 /** | 213 /** |
238 * If the [instruction] is not `null` it will be used to attach the position | 214 * If the [instruction] is not `null` it will be used to attach the position |
239 * to the [statement]. | 215 * to the [statement]. |
240 */ | 216 */ |
241 void pushStatement(js.Statement statement, [HInstruction instruction]) { | 217 void pushStatement(js.Statement statement, [HInstruction instruction]) { |
242 assert(expressionStack.isEmpty); | 218 assert(expressionStack.isEmpty); |
243 if (instruction != null) { | 219 if (instruction != null) { |
(...skipping 2338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2582 if (left.isConstantNull() || right.isConstantNull() || | 2558 if (left.isConstantNull() || right.isConstantNull() || |
2583 (left.isPrimitive(compiler) && | 2559 (left.isPrimitive(compiler) && |
2584 left.instructionType == right.instructionType)) { | 2560 left.instructionType == right.instructionType)) { |
2585 return '=='; | 2561 return '=='; |
2586 } | 2562 } |
2587 return null; | 2563 return null; |
2588 } else { | 2564 } else { |
2589 return '==='; | 2565 return '==='; |
2590 } | 2566 } |
2591 } | 2567 } |
OLD | NEW |