| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 import 'sexpr_unstringifier.dart'; | 5 import 'sexpr_unstringifier.dart'; |
| 6 import "package:expect/expect.dart"; | 6 import "package:expect/expect.dart"; |
| 7 import 'package:compiler/src/cps_ir/cps_ir_nodes.dart'; | 7 import 'package:compiler/src/cps_ir/cps_ir_nodes.dart'; |
| 8 import 'package:compiler/src/cps_ir/cps_ir_nodes_sexpr.dart'; | 8 import 'package:compiler/src/cps_ir/cps_ir_nodes_sexpr.dart'; |
| 9 import 'package:compiler/src/cps_ir/optimizers.dart'; | 9 import 'package:compiler/src/cps_ir/optimizers.dart'; |
| 10 | 10 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 // int main() { | 37 // int main() { |
| 38 // int i = 42; | 38 // int i = 42; |
| 39 // int j = i + 1; | 39 // int j = i + 1; |
| 40 // return 0; | 40 // return 0; |
| 41 // } | 41 // } |
| 42 | 42 |
| 43 String ITERATIVE_DEAD_VAL1_IN = """ | 43 String ITERATIVE_DEAD_VAL1_IN = """ |
| 44 (FunctionDefinition main () return () | 44 (FunctionDefinition main () return () |
| 45 (LetPrim (v0 (Constant (Int 42))) | 45 (LetPrim (v0 (Constant (Int 42))) |
| 46 (LetPrim (v1 (Constant (Int 1))) | 46 (LetPrim (v1 (Constant (Int 1))) |
| 47 (LetCont (k0 (v2) | 47 (LetCont ((k0 (v2) |
| 48 (LetPrim (v3 (Constant (Int 0))) | 48 (LetPrim (v3 (Constant (Int 0))) |
| 49 (InvokeContinuation return (v3)))) | 49 (InvokeContinuation return (v3))))) |
| 50 (InvokeMethod v0 + (v1) k0))))) | 50 (InvokeMethod v0 + (v1) k0))))) |
| 51 """; | 51 """; |
| 52 String ITERATIVE_DEAD_VAL1_OUT = ITERATIVE_DEAD_VAL1_IN; | 52 String ITERATIVE_DEAD_VAL1_OUT = ITERATIVE_DEAD_VAL1_IN; |
| 53 | 53 |
| 54 // Iterative dead-val. IR written by hand. | 54 // Iterative dead-val. IR written by hand. |
| 55 | 55 |
| 56 String ITERATIVE_DEAD_VAL2_IN = """ | 56 String ITERATIVE_DEAD_VAL2_IN = """ |
| 57 (FunctionDefinition main () return () | 57 (FunctionDefinition main () return () |
| 58 (LetPrim (v0 (Constant (Int 42))) | 58 (LetPrim (v0 (Constant (Int 42))) |
| 59 (LetPrim (v1 | 59 (LetPrim (v1 |
| 60 (CreateFunction | 60 (CreateFunction |
| 61 (FunctionDefinition f (i) return () | 61 (FunctionDefinition f (i) return () |
| 62 (InvokeContinuation return (v0))))) | 62 (InvokeContinuation return (v0))))) |
| 63 (LetPrim (v2 (Constant (Int 0))) | 63 (LetPrim (v2 (Constant (Int 0))) |
| 64 (InvokeContinuation return (v2)))))) | 64 (InvokeContinuation return (v2)))))) |
| 65 """; | 65 """; |
| 66 String ITERATIVE_DEAD_VAL2_OUT = """ | 66 String ITERATIVE_DEAD_VAL2_OUT = """ |
| 67 (FunctionDefinition main () return () | 67 (FunctionDefinition main () return () |
| 68 (LetPrim (v0 (Constant (Int 0))) | 68 (LetPrim (v0 (Constant (Int 0))) |
| 69 (InvokeContinuation return (v0)))) | 69 (InvokeContinuation return (v0)))) |
| 70 """; | 70 """; |
| 71 | 71 |
| 72 // Basic dead-cont: letcont k x = L in K -> K (k not free in K). | 72 // Basic dead-cont: letcont k x = L in K -> K (k not free in K). |
| 73 // IR written by hand. | 73 // IR written by hand. |
| 74 | 74 |
| 75 String DEAD_CONT_IN = """ | 75 String DEAD_CONT_IN = """ |
| 76 (FunctionDefinition main () return () | 76 (FunctionDefinition main () return () |
| 77 (LetPrim (v4 (Constant (Int 0))) | 77 (LetPrim (v4 (Constant (Int 0))) |
| 78 (LetCont (k0 (v0) | 78 (LetCont ((k0 (v0) |
| 79 (InvokeConstructor List () return)) | 79 (InvokeConstructor List () return))) |
| 80 (LetCont (k1 (v1) | 80 (LetCont ((k1 (v1) |
| 81 (LetCont (k2 (v2) | 81 (LetCont ((k2 (v2) |
| 82 (LetPrim (v3 (Constant (Int 0))) | 82 (LetPrim (v3 (Constant (Int 0))) |
| 83 (InvokeContinuation return (v3)))) | 83 (InvokeContinuation return (v3))))) |
| 84 (InvokeStatic print (v4) k2))) | 84 (InvokeStatic print (v4) k2)))) |
| 85 (InvokeStatic print (v4) k1))))) | 85 (InvokeStatic print (v4) k1))))) |
| 86 """; | 86 """; |
| 87 String DEAD_CONT_OUT = """ | 87 String DEAD_CONT_OUT = """ |
| 88 (FunctionDefinition main () return () | 88 (FunctionDefinition main () return () |
| 89 (LetPrim (v0 (Constant (Int 0))) | 89 (LetPrim (v0 (Constant (Int 0))) |
| 90 (LetCont (k0 (v1) | 90 (LetCont ((k0 (v1) |
| 91 (LetCont (k1 (v2) | 91 (LetCont ((k1 (v2) |
| 92 (LetPrim (v3 (Constant (Int 0))) | 92 (LetPrim (v3 (Constant (Int 0))) |
| 93 (InvokeContinuation return (v3)))) | 93 (InvokeContinuation return (v3))))) |
| 94 (InvokeStatic print (v0) k1))) | 94 (InvokeStatic print (v0) k1)))) |
| 95 (InvokeStatic print (v0) k0)))) | 95 (InvokeStatic print (v0) k0)))) |
| 96 """; | 96 """; |
| 97 | 97 |
| 98 // Iterative dead-cont. IR written by hand. | 98 // Iterative dead-cont. IR written by hand. |
| 99 | 99 |
| 100 String ITERATIVE_DEAD_CONT_IN = """ | 100 String ITERATIVE_DEAD_CONT_IN = """ |
| 101 (FunctionDefinition main () return () | 101 (FunctionDefinition main () return () |
| 102 (LetPrim (v4 (Constant (Int 0))) | 102 (LetPrim (v4 (Constant (Int 0))) |
| 103 (LetCont (k0 (v0) | 103 (LetCont ((k0 (v0) |
| 104 (InvokeConstructor List () return)) | 104 (InvokeConstructor List () return))) |
| 105 (LetCont (k3 (v5) | 105 (LetCont ((k3 (v5) |
| 106 (InvokeContinuation k0 (v5))) | 106 (InvokeContinuation k0 (v5)))) |
| 107 (LetCont (k1 (v1) | 107 (LetCont ((k1 (v1) |
| 108 (LetCont (k2 (v2) | 108 (LetCont ((k2 (v2) |
| 109 (LetPrim (v3 (Constant (Int 0))) | 109 (LetPrim (v3 (Constant (Int 0))) |
| 110 (InvokeContinuation return (v3)))) | 110 (InvokeContinuation return (v3))))) |
| 111 (InvokeStatic print (v4) k2))) | 111 (InvokeStatic print (v4) k2)))) |
| 112 (InvokeStatic print (v4) k1)))))) | 112 (InvokeStatic print (v4) k1)))))) |
| 113 """; | 113 """; |
| 114 String ITERATIVE_DEAD_CONT_OUT = """ | 114 String ITERATIVE_DEAD_CONT_OUT = """ |
| 115 (FunctionDefinition main () return () | 115 (FunctionDefinition main () return () |
| 116 (LetPrim (v0 (Constant (Int 0))) | 116 (LetPrim (v0 (Constant (Int 0))) |
| 117 (LetCont (k0 (v1) | 117 (LetCont ((k0 (v1) |
| 118 (LetCont (k1 (v2) | 118 (LetCont ((k1 (v2) |
| 119 (LetPrim (v3 (Constant (Int 0))) | 119 (LetPrim (v3 (Constant (Int 0))) |
| 120 (InvokeContinuation return (v3)))) | 120 (InvokeContinuation return (v3))))) |
| 121 (InvokeStatic print (v0) k1))) | 121 (InvokeStatic print (v0) k1)))) |
| 122 (InvokeStatic print (v0) k0)))) | 122 (InvokeStatic print (v0) k0)))) |
| 123 """; | 123 """; |
| 124 | 124 |
| 125 // Beta-cont-lin: letcont k x = K in C[k y] -> C[K[y/x]] (k not free in C). | 125 // Beta-cont-lin: letcont k x = K in C[k y] -> C[K[y/x]] (k not free in C). |
| 126 // IR written by hand. | 126 // IR written by hand. |
| 127 | 127 |
| 128 String BETA_CONT_LIN_IN = """ | 128 String BETA_CONT_LIN_IN = """ |
| 129 (FunctionDefinition main () return () | 129 (FunctionDefinition main () return () |
| 130 (LetCont (k0 (v0) | 130 (LetCont ((k0 (v0) |
| 131 (LetCont (k1 (v1) | 131 (LetCont ((k1 (v1) |
| 132 (LetCont (k2 (v2) | 132 (LetCont ((k2 (v2) |
| 133 (LetPrim (v3 (Constant (Int 0))) | 133 (LetPrim (v3 (Constant (Int 0))) |
| 134 (InvokeContinuation return (v3)))) | 134 (InvokeContinuation return (v3))))) |
| 135 (InvokeStatic print (v0) k2))) | 135 (InvokeStatic print (v0) k2)))) |
| 136 (InvokeStatic print (v0) k1))) | 136 (InvokeStatic print (v0) k1)))) |
| 137 (LetPrim (v4 (Constant (Int 0))) | 137 (LetPrim (v4 (Constant (Int 0))) |
| 138 (InvokeContinuation k0 (v4))))) | 138 (InvokeContinuation k0 (v4))))) |
| 139 """; | 139 """; |
| 140 String BETA_CONT_LIN_OUT = """ | 140 String BETA_CONT_LIN_OUT = """ |
| 141 (FunctionDefinition main () return () | 141 (FunctionDefinition main () return () |
| 142 (LetPrim (v0 (Constant (Int 0))) | 142 (LetPrim (v0 (Constant (Int 0))) |
| 143 (LetCont (k0 (v1) | 143 (LetCont ((k0 (v1) |
| 144 (LetCont (k1 (v2) | 144 (LetCont ((k1 (v2) |
| 145 (LetPrim (v3 (Constant (Int 0))) | 145 (LetPrim (v3 (Constant (Int 0))) |
| 146 (InvokeContinuation return (v3)))) | 146 (InvokeContinuation return (v3))))) |
| 147 (InvokeStatic print (v0) k1))) | 147 (InvokeStatic print (v0) k1)))) |
| 148 (InvokeStatic print (v0) k0)))) | 148 (InvokeStatic print (v0) k0)))) |
| 149 """; | 149 """; |
| 150 | 150 |
| 151 // Beta-cont-lin with recursive continuation. IR written by hand. | 151 // Beta-cont-lin with recursive continuation. IR written by hand. |
| 152 | 152 |
| 153 String RECURSIVE_BETA_CONT_LIN_IN = """ | 153 String RECURSIVE_BETA_CONT_LIN_IN = """ |
| 154 (FunctionDefinition main () return () | 154 (FunctionDefinition main () return () |
| 155 (LetCont* (k0 (v0) | 155 (LetCont ((rec k0 (v0) |
| 156 (InvokeContinuation* k0 (v0))) | 156 (InvokeContinuation* k0 (v0)))) |
| 157 (LetPrim (v1 (Constant (Int 0))) | 157 (LetPrim (v1 (Constant (Int 0))) |
| 158 (InvokeContinuation k0 (v1))))) | 158 (InvokeContinuation k0 (v1))))) |
| 159 """; | 159 """; |
| 160 String RECURSIVE_BETA_CONT_LIN_OUT = RECURSIVE_BETA_CONT_LIN_IN; | 160 String RECURSIVE_BETA_CONT_LIN_OUT = RECURSIVE_BETA_CONT_LIN_IN; |
| 161 | 161 |
| 162 // Beta-cont-lin used inside body. IR written by hand. | 162 // Beta-cont-lin used inside body. IR written by hand. |
| 163 | 163 |
| 164 String USED_BETA_CONT_LIN_IN = """ | 164 String USED_BETA_CONT_LIN_IN = """ |
| 165 (FunctionDefinition main () return () | 165 (FunctionDefinition main () return () |
| 166 (LetPrim (v0 (Constant (Int 0))) | 166 (LetPrim (v0 (Constant (Int 0))) |
| 167 (LetCont (k0 (v1) | 167 (LetCont ((k0 (v1) |
| 168 (LetCont (k1 (v2) | 168 (LetCont ((k1 (v2) |
| 169 (LetCont (k2 (v3) | 169 (LetCont ((k2 (v3) |
| 170 (LetPrim (v4 (Constant (Int 0))) | 170 (LetPrim (v4 (Constant (Int 0))) |
| 171 (InvokeContinuation return (v4)))) | 171 (InvokeContinuation return (v4))))) |
| 172 (InvokeStatic print (v1) k2))) | 172 (InvokeStatic print (v1) k2)))) |
| 173 (InvokeStatic print (v1) k1))) | 173 (InvokeStatic print (v1) k1)))) |
| 174 (LetPrim (v5 | 174 (LetPrim (v5 |
| 175 (CreateFunction | 175 (CreateFunction |
| 176 (FunctionDefinition f () return () | 176 (FunctionDefinition f () return () |
| 177 (InvokeContinuation return (v1))))) | 177 (InvokeContinuation return (v1))))) |
| 178 (InvokeContinuation k0 (v0)))))) | 178 (InvokeContinuation k0 (v0)))))) |
| 179 """; | 179 """; |
| 180 String USED_BETA_CONT_LIN_OUT = """ | 180 String USED_BETA_CONT_LIN_OUT = """ |
| 181 (FunctionDefinition main () return () | 181 (FunctionDefinition main () return () |
| 182 (LetPrim (v0 (Constant (Int 0))) | 182 (LetPrim (v0 (Constant (Int 0))) |
| 183 (LetCont (k0 (v1) | 183 (LetCont ((k0 (v1) |
| 184 (LetCont (k1 (v2) | 184 (LetCont ((k1 (v2) |
| 185 (LetPrim (v3 (Constant (Int 0))) | 185 (LetPrim (v3 (Constant (Int 0))) |
| 186 (InvokeContinuation return (v3)))) | 186 (InvokeContinuation return (v3))))) |
| 187 (InvokeStatic print (v0) k1))) | 187 (InvokeStatic print (v0) k1)))) |
| 188 (InvokeStatic print (v0) k0)))) | 188 (InvokeStatic print (v0) k0)))) |
| 189 """; | 189 """; |
| 190 | 190 |
| 191 // Eta-cont: letcont k x = j x in K -> K[j/k]. | 191 // Eta-cont: letcont k x = j x in K -> K[j/k]. |
| 192 // IR written by hand. | 192 // IR written by hand. |
| 193 | 193 |
| 194 String ETA_CONT_IN = """ | 194 String ETA_CONT_IN = """ |
| 195 (FunctionDefinition main () return () | 195 (FunctionDefinition main () return () |
| 196 (LetPrim (v3 (Constant (Int 0))) | 196 (LetPrim (v3 (Constant (Int 0))) |
| 197 (LetCont* (k1 (v1) | 197 (LetCont ((rec k1 (v1) |
| 198 (InvokeContinuation return (v3))) | 198 (InvokeContinuation return (v3)))) |
| 199 (LetCont (k0 (v0) | 199 (LetCont ((k0 (v0) |
| 200 (InvokeContinuation k1 (v0))) | 200 (InvokeContinuation k1 (v0)))) |
| 201 (LetPrim (v4 | 201 (LetPrim (v4 |
| 202 (CreateFunction | 202 (CreateFunction |
| 203 (FunctionDefinition f () return () | 203 (FunctionDefinition f () return () |
| 204 (InvokeContinuation k1 (v3))))) | 204 (InvokeContinuation k1 (v3))))) |
| 205 (InvokeContinuation k0 (v3))))))) | 205 (InvokeContinuation k0 (v3))))))) |
| 206 """; | 206 """; |
| 207 String ETA_CONT_OUT = """ | 207 String ETA_CONT_OUT = """ |
| 208 (FunctionDefinition main () return () | 208 (FunctionDefinition main () return () |
| 209 (LetPrim (v0 (Constant (Int 0))) | 209 (LetPrim (v0 (Constant (Int 0))) |
| 210 (LetCont (k0 (v1) | 210 (LetCont ((k0 (v1) |
| 211 (InvokeContinuation return (v0))) | 211 (InvokeContinuation return (v0)))) |
| 212 (InvokeContinuation k0 (v0))))) | 212 (InvokeContinuation k0 (v0))))) |
| 213 """; | 213 """; |
| 214 | 214 |
| 215 // Beta-fun-lin and eta-fun might not apply to us, since | 215 // Beta-fun-lin and eta-fun might not apply to us, since |
| 216 // a. in (InvokeMethod v0 call k0), v0 might carry state, and | 216 // a. in (InvokeMethod v0 call k0), v0 might carry state, and |
| 217 // b. there is no way to generate static nested functions that we could | 217 // b. there is no way to generate static nested functions that we could |
| 218 // use InvokeStatic on. | 218 // use InvokeStatic on. |
| 219 | 219 |
| 220 /// Normalizes whitespace by replacing all whitespace sequences by a single | 220 /// Normalizes whitespace by replacing all whitespace sequences by a single |
| 221 /// space and trimming leading and trailing whitespace. | 221 /// space and trimming leading and trailing whitespace. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 243 testShrinkingReducer(DEAD_VAL_IN, DEAD_VAL_OUT); | 243 testShrinkingReducer(DEAD_VAL_IN, DEAD_VAL_OUT); |
| 244 testShrinkingReducer(ITERATIVE_DEAD_VAL1_IN, ITERATIVE_DEAD_VAL1_OUT); | 244 testShrinkingReducer(ITERATIVE_DEAD_VAL1_IN, ITERATIVE_DEAD_VAL1_OUT); |
| 245 testShrinkingReducer(ITERATIVE_DEAD_VAL2_IN, ITERATIVE_DEAD_VAL2_OUT); | 245 testShrinkingReducer(ITERATIVE_DEAD_VAL2_IN, ITERATIVE_DEAD_VAL2_OUT); |
| 246 testShrinkingReducer(DEAD_CONT_IN, DEAD_CONT_OUT); | 246 testShrinkingReducer(DEAD_CONT_IN, DEAD_CONT_OUT); |
| 247 testShrinkingReducer(ITERATIVE_DEAD_CONT_IN, ITERATIVE_DEAD_CONT_OUT); | 247 testShrinkingReducer(ITERATIVE_DEAD_CONT_IN, ITERATIVE_DEAD_CONT_OUT); |
| 248 testShrinkingReducer(BETA_CONT_LIN_IN, BETA_CONT_LIN_OUT); | 248 testShrinkingReducer(BETA_CONT_LIN_IN, BETA_CONT_LIN_OUT); |
| 249 testShrinkingReducer(RECURSIVE_BETA_CONT_LIN_IN, RECURSIVE_BETA_CONT_LIN_OUT); | 249 testShrinkingReducer(RECURSIVE_BETA_CONT_LIN_IN, RECURSIVE_BETA_CONT_LIN_OUT); |
| 250 testShrinkingReducer(USED_BETA_CONT_LIN_IN, USED_BETA_CONT_LIN_OUT); | 250 testShrinkingReducer(USED_BETA_CONT_LIN_IN, USED_BETA_CONT_LIN_OUT); |
| 251 testShrinkingReducer(ETA_CONT_IN, ETA_CONT_OUT); | 251 testShrinkingReducer(ETA_CONT_IN, ETA_CONT_OUT); |
| 252 } | 252 } |
| OLD | NEW |