| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library dart2js.cps_ir.redundant_join_elimination; | 5 library dart2js.cps_ir.redundant_join_elimination; |
| 6 | 6 |
| 7 import 'cps_ir_nodes.dart'; | 7 import 'cps_ir_nodes.dart'; |
| 8 import 'optimizers.dart'; | 8 import 'optimizers.dart'; |
| 9 | 9 |
| 10 /// Eliminates redundant join points. | 10 /// Eliminates redundant join points. |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 /// | 227 /// |
| 228 /// After lifting LetConts in the main pass above, parameter objects can have | 228 /// After lifting LetConts in the main pass above, parameter objects can have |
| 229 /// multiple bindings. Each reference implicitly refers to the binding that | 229 /// multiple bindings. Each reference implicitly refers to the binding that |
| 230 /// is currently in scope. | 230 /// is currently in scope. |
| 231 /// | 231 /// |
| 232 /// This returns the IR to its normal form after redundant joins have been | 232 /// This returns the IR to its normal form after redundant joins have been |
| 233 /// eliminated. | 233 /// eliminated. |
| 234 class AlphaRenamer extends RecursiveVisitor { | 234 class AlphaRenamer extends RecursiveVisitor { |
| 235 Map<Parameter, Parameter> renaming = <Parameter, Parameter>{}; | 235 Map<Parameter, Parameter> renaming = <Parameter, Parameter>{}; |
| 236 | 236 |
| 237 visitContinuation(Continuation cont) { | 237 processContinuation(Continuation cont) { |
| 238 if (cont.isReturnContinuation) return; | 238 if (cont.isReturnContinuation) return; |
| 239 | 239 |
| 240 List<Parameter> shadowedKeys = <Parameter>[]; | 240 List<Parameter> shadowedKeys = <Parameter>[]; |
| 241 List<Parameter> shadowedValues = <Parameter>[]; | 241 List<Parameter> shadowedValues = <Parameter>[]; |
| 242 | 242 |
| 243 // Create new parameters and update the environment. | 243 // Create new parameters and update the environment. |
| 244 for (int i = 0; i < cont.parameters.length; ++i) { | 244 for (int i = 0; i < cont.parameters.length; ++i) { |
| 245 Parameter param = cont.parameters[i]; | 245 Parameter param = cont.parameters[i]; |
| 246 shadowedKeys.add(param); | 246 shadowedKeys.add(param); |
| 247 shadowedValues.add(renaming.remove(param)); | 247 shadowedValues.add(renaming.remove(param)); |
| 248 // If the parameter appears to belong to another continuation, | 248 // If the parameter appears to belong to another continuation, |
| 249 // create a new parameter object for this continuation. | 249 // create a new parameter object for this continuation. |
| 250 if (param.parent != cont) { | 250 if (param.parent != cont) { |
| 251 Parameter newParam = new Parameter(param.hint); | 251 Parameter newParam = new Parameter(param.hint); |
| 252 renaming[param] = newParam; | 252 renaming[param] = newParam; |
| 253 cont.parameters[i] = newParam; | 253 cont.parameters[i] = newParam; |
| 254 newParam.parent = cont; | 254 newParam.parent = cont; |
| 255 } | 255 } |
| 256 } | 256 } |
| 257 | 257 |
| 258 // Visit the body with the updated environment. | 258 pushAction(() { |
| 259 visit(cont.body); | 259 // Restore the original environment. |
| 260 | 260 for (int i = 0; i < cont.parameters.length; ++i) { |
| 261 // Restore the original environment. | 261 renaming.remove(cont.parameters[i]); |
| 262 for (int i = 0; i < cont.parameters.length; ++i) { | 262 if (shadowedValues[i] != null) { |
| 263 renaming.remove(cont.parameters[i]); | 263 renaming[shadowedKeys[i]] = shadowedValues[i]; |
| 264 if (shadowedValues[i] != null) { | 264 } |
| 265 renaming[shadowedKeys[i]] = shadowedValues[i]; | |
| 266 } | 265 } |
| 267 } | 266 }); |
| 268 } | 267 } |
| 269 | 268 |
| 270 processReference(Reference ref) { | 269 processReference(Reference ref) { |
| 271 Parameter target = renaming[ref.definition]; | 270 Parameter target = renaming[ref.definition]; |
| 272 if (target != null) { | 271 if (target != null) { |
| 273 ref.changeTo(target); | 272 ref.changeTo(target); |
| 274 } | 273 } |
| 275 } | 274 } |
| 276 } | 275 } |
| OLD | NEW |