Chromium Code Reviews| 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 /** | 7 /** |
| 8 * Instead of emitting each SSA instruction with a temporary variable | 8 * Instead of emitting each SSA instruction with a temporary variable |
| 9 * mark instructions that can be emitted at their use-site. | 9 * mark instructions that can be emitted at their use-site. |
| 10 * For example, in: | 10 * For example, in: |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 51 && !input.isJsStatement()) { | 51 && !input.isJsStatement()) { |
| 52 if (input.isPure()) { | 52 if (input.isPure()) { |
| 53 // Only consider a pure input if it is in the same loop. | 53 // Only consider a pure input if it is in the same loop. |
| 54 // Otherwise, we might move GVN'ed instruction back into the | 54 // Otherwise, we might move GVN'ed instruction back into the |
| 55 // loop. | 55 // loop. |
| 56 if (user.hasSameLoopHeaderAs(input)) { | 56 if (user.hasSameLoopHeaderAs(input)) { |
| 57 // Move it closer to [user], so that instructions in | 57 // Move it closer to [user], so that instructions in |
| 58 // between do not prevent making it generate at use site. | 58 // between do not prevent making it generate at use site. |
| 59 input.moveBefore(user); | 59 input.moveBefore(user); |
| 60 pureInputs.add(input); | 60 pureInputs.add(input); |
| 61 // Previous computations done on [input] are now invalid | |
| 62 // because we moved [input] to another place. So all | |
| 63 // non-nure, non-code motion invariant, instructions need | |
|
ahe
2013/04/30 20:06:25
nure -> pure
| |
| 64 // to be removed from the [generateAtUseSite] set. | |
| 65 input.inputs.forEach((instruction) { | |
| 66 if (!instruction.isCodeMotionInvariant() | |
| 67 && !instruction.isPure()) { | |
| 68 generateAtUseSite.remove(instruction); | |
| 69 } | |
| 70 }); | |
| 61 // Visit the pure input now so that the expected inputs | 71 // Visit the pure input now so that the expected inputs |
| 62 // are after the expected inputs of [user]. | 72 // are after the expected inputs of [user]. |
| 63 input.accept(this); | 73 input.accept(this); |
| 64 } | 74 } |
| 65 } else { | 75 } else { |
| 66 expectedInputs.add(input); | 76 expectedInputs.add(input); |
| 67 } | 77 } |
| 68 } | 78 } |
| 69 } | 79 } |
| 70 } | 80 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 assert(!generateAtUseSite.contains(nextInput)); | 163 assert(!generateAtUseSite.contains(nextInput)); |
| 154 assert(nextInput.usedBy.length == 1); | 164 assert(nextInput.usedBy.length == 1); |
| 155 if (identical(nextInput, instruction)) { | 165 if (identical(nextInput, instruction)) { |
| 156 return true; | 166 return true; |
| 157 } | 167 } |
| 158 } | 168 } |
| 159 return false; | 169 return false; |
| 160 } | 170 } |
| 161 | 171 |
| 162 block.last.accept(this); | 172 block.last.accept(this); |
| 163 bool dontVisitPure = false; | |
| 164 for (HInstruction instruction = block.last.previous; | 173 for (HInstruction instruction = block.last.previous; |
| 165 instruction != null; | 174 instruction != null; |
| 166 instruction = instruction.previous) { | 175 instruction = instruction.previous) { |
| 167 if (generateAtUseSite.contains(instruction)) { | 176 if (generateAtUseSite.contains(instruction)) { |
| 168 continue; | 177 continue; |
| 169 } | 178 } |
| 170 if (instruction.isCodeMotionInvariant()) { | 179 if (instruction.isCodeMotionInvariant()) { |
| 171 markAsGenerateAtUseSite(instruction); | 180 markAsGenerateAtUseSite(instruction); |
| 172 continue; | 181 continue; |
| 173 } | 182 } |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 364 } | 373 } |
| 365 | 374 |
| 366 // If [thenInput] is defined in the first predecessor, then it is only used | 375 // If [thenInput] is defined in the first predecessor, then it is only used |
| 367 // by [phi] and can be generated at use site. | 376 // by [phi] and can be generated at use site. |
| 368 if (identical(thenInput.block, end.predecessors[0])) { | 377 if (identical(thenInput.block, end.predecessors[0])) { |
| 369 assert(thenInput.usedBy.length == 1); | 378 assert(thenInput.usedBy.length == 1); |
| 370 markAsGenerateAtUseSite(thenInput); | 379 markAsGenerateAtUseSite(thenInput); |
| 371 } | 380 } |
| 372 } | 381 } |
| 373 } | 382 } |
| OLD | NEW |