| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/schedule.h" | 5 #include "src/compiler/schedule.h" |
| 6 #include "src/compiler/access-builder.h" | 6 #include "src/compiler/access-builder.h" |
| 7 #include "src/compiler/common-operator.h" | 7 #include "src/compiler/common-operator.h" |
| 8 #include "src/compiler/graph-visualizer.h" | 8 #include "src/compiler/graph-visualizer.h" |
| 9 #include "src/compiler/graph.h" | 9 #include "src/compiler/graph.h" |
| 10 #include "src/compiler/js-operator.h" | 10 #include "src/compiler/js-operator.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 graph()->SetStart(graph()->NewNode(common()->Start(0))); | 89 graph()->SetStart(graph()->NewNode(common()->Start(0))); |
| 90 graph()->SetEnd(graph()->NewNode(common()->End(1), graph()->start())); | 90 graph()->SetEnd(graph()->NewNode(common()->End(1), graph()->start())); |
| 91 USE(Scheduler::ComputeSchedule(zone(), graph(), Scheduler::kNoFlags)); | 91 USE(Scheduler::ComputeSchedule(zone(), graph(), Scheduler::kNoFlags)); |
| 92 } | 92 } |
| 93 | 93 |
| 94 | 94 |
| 95 TEST_F(SchedulerTest, BuildScheduleOneParameter) { | 95 TEST_F(SchedulerTest, BuildScheduleOneParameter) { |
| 96 graph()->SetStart(graph()->NewNode(common()->Start(0))); | 96 graph()->SetStart(graph()->NewNode(common()->Start(0))); |
| 97 | 97 |
| 98 Node* p1 = graph()->NewNode(common()->Parameter(0), graph()->start()); | 98 Node* p1 = graph()->NewNode(common()->Parameter(0), graph()->start()); |
| 99 Node* ret = graph()->NewNode(common()->Return(), p1, graph()->start(), | 99 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 100 Node* ret = graph()->NewNode(common()->Return(), zero, p1, graph()->start(), |
| 100 graph()->start()); | 101 graph()->start()); |
| 101 | 102 |
| 102 graph()->SetEnd(graph()->NewNode(common()->End(1), ret)); | 103 graph()->SetEnd(graph()->NewNode(common()->End(1), ret)); |
| 103 | 104 |
| 104 USE(Scheduler::ComputeSchedule(zone(), graph(), Scheduler::kNoFlags)); | 105 USE(Scheduler::ComputeSchedule(zone(), graph(), Scheduler::kNoFlags)); |
| 105 } | 106 } |
| 106 | 107 |
| 107 | 108 |
| 108 namespace { | 109 namespace { |
| 109 | 110 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 121 | 122 |
| 122 } // namespace | 123 } // namespace |
| 123 | 124 |
| 124 | 125 |
| 125 TARGET_TEST_F(SchedulerTest, FloatingDiamond1) { | 126 TARGET_TEST_F(SchedulerTest, FloatingDiamond1) { |
| 126 Node* start = graph()->NewNode(common()->Start(1)); | 127 Node* start = graph()->NewNode(common()->Start(1)); |
| 127 graph()->SetStart(start); | 128 graph()->SetStart(start); |
| 128 | 129 |
| 129 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 130 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 130 Node* d1 = CreateDiamond(graph(), common(), p0); | 131 Node* d1 = CreateDiamond(graph(), common(), p0); |
| 131 Node* ret = graph()->NewNode(common()->Return(), d1, start, start); | 132 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 133 Node* ret = graph()->NewNode(common()->Return(), zero, d1, start, start); |
| 132 Node* end = graph()->NewNode(common()->End(1), ret); | 134 Node* end = graph()->NewNode(common()->End(1), ret); |
| 133 | 135 |
| 134 graph()->SetEnd(end); | 136 graph()->SetEnd(end); |
| 135 | 137 |
| 136 ComputeAndVerifySchedule(13); | 138 ComputeAndVerifySchedule(14); |
| 137 } | 139 } |
| 138 | 140 |
| 139 TARGET_TEST_F(SchedulerTest, FloatingDeadDiamond1) { | 141 TARGET_TEST_F(SchedulerTest, FloatingDeadDiamond1) { |
| 140 Node* start = graph()->NewNode(common()->Start(1)); | 142 Node* start = graph()->NewNode(common()->Start(1)); |
| 141 graph()->SetStart(start); | 143 graph()->SetStart(start); |
| 142 | 144 |
| 143 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 145 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 144 Node* d1 = CreateDiamond(graph(), common(), p0); | 146 Node* d1 = CreateDiamond(graph(), common(), p0); |
| 145 USE(d1); | 147 USE(d1); |
| 146 Node* ret = graph()->NewNode(common()->Return(), p0, start, start); | 148 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 149 Node* ret = graph()->NewNode(common()->Return(), zero, p0, start, start); |
| 147 Node* end = graph()->NewNode(common()->End(1), ret); | 150 Node* end = graph()->NewNode(common()->End(1), ret); |
| 148 | 151 |
| 149 graph()->SetEnd(end); | 152 graph()->SetEnd(end); |
| 150 | 153 |
| 151 ComputeAndVerifySchedule(4); | 154 ComputeAndVerifySchedule(5); |
| 152 } | 155 } |
| 153 | 156 |
| 154 TARGET_TEST_F(SchedulerTest, FloatingDeadDiamond2) { | 157 TARGET_TEST_F(SchedulerTest, FloatingDeadDiamond2) { |
| 155 Graph* g = graph(); | 158 Graph* g = graph(); |
| 156 Node* start = g->NewNode(common()->Start(1)); | 159 Node* start = g->NewNode(common()->Start(1)); |
| 157 g->SetStart(start); | 160 g->SetStart(start); |
| 158 | 161 |
| 159 Node* n1 = g->NewNode(common()->Parameter(1), start); | 162 Node* n1 = g->NewNode(common()->Parameter(1), start); |
| 160 | 163 |
| 161 Node* n2 = g->NewNode(common()->Branch(), n1, start); | 164 Node* n2 = g->NewNode(common()->Branch(), n1, start); |
| 162 Node* n3 = g->NewNode(common()->IfTrue(), n2); | 165 Node* n3 = g->NewNode(common()->IfTrue(), n2); |
| 163 Node* n4 = g->NewNode(common()->IfFalse(), n2); | 166 Node* n4 = g->NewNode(common()->IfFalse(), n2); |
| 164 Node* n5 = g->NewNode(common()->Int32Constant(-100)); | 167 Node* n5 = g->NewNode(common()->Int32Constant(-100)); |
| 165 Node* n6 = g->NewNode(common()->Return(), n5, start, n4); | 168 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 169 Node* n6 = g->NewNode(common()->Return(), zero, n5, start, n4); |
| 166 Node* n7 = g->NewNode(common()->Int32Constant(0)); | 170 Node* n7 = g->NewNode(common()->Int32Constant(0)); |
| 167 Node* n8 = g->NewNode(common()->Return(), n7, start, n3); | 171 Node* n8 = g->NewNode(common()->Return(), zero, n7, start, n3); |
| 168 Node* n9 = g->NewNode(common()->End(2), n6, n8); | 172 Node* n9 = g->NewNode(common()->End(2), n6, n8); |
| 169 | 173 |
| 170 // Dead nodes | 174 // Dead nodes |
| 171 Node* n10 = g->NewNode(common()->Branch(), n1, n3); | 175 Node* n10 = g->NewNode(common()->Branch(), n1, n3); |
| 172 Node* n11 = g->NewNode(common()->IfTrue(), n10); | 176 Node* n11 = g->NewNode(common()->IfTrue(), n10); |
| 173 Node* n12 = g->NewNode(common()->IfFalse(), n10); | 177 Node* n12 = g->NewNode(common()->IfFalse(), n10); |
| 174 Node* n13 = g->NewNode(common()->Merge(2), n11, n12); | 178 Node* n13 = g->NewNode(common()->Merge(2), n11, n12); |
| 175 Node* n14 = | 179 Node* n14 = |
| 176 g->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), n1, n7, n13); | 180 g->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), n1, n7, n13); |
| 177 | 181 |
| 178 USE(n14); | 182 USE(n14); |
| 179 | 183 |
| 180 g->SetEnd(n9); | 184 g->SetEnd(n9); |
| 181 | 185 |
| 182 ComputeAndVerifySchedule(10); | 186 ComputeAndVerifySchedule(11); |
| 183 } | 187 } |
| 184 | 188 |
| 185 TARGET_TEST_F(SchedulerTest, FloatingDiamond2) { | 189 TARGET_TEST_F(SchedulerTest, FloatingDiamond2) { |
| 186 Node* start = graph()->NewNode(common()->Start(2)); | 190 Node* start = graph()->NewNode(common()->Start(2)); |
| 187 graph()->SetStart(start); | 191 graph()->SetStart(start); |
| 188 | 192 |
| 189 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 193 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 190 Node* p1 = graph()->NewNode(common()->Parameter(1), start); | 194 Node* p1 = graph()->NewNode(common()->Parameter(1), start); |
| 191 Node* d1 = CreateDiamond(graph(), common(), p0); | 195 Node* d1 = CreateDiamond(graph(), common(), p0); |
| 192 Node* d2 = CreateDiamond(graph(), common(), p1); | 196 Node* d2 = CreateDiamond(graph(), common(), p1); |
| 193 Node* add = graph()->NewNode(&kIntAdd, d1, d2); | 197 Node* add = graph()->NewNode(&kIntAdd, d1, d2); |
| 194 Node* ret = graph()->NewNode(common()->Return(), add, start, start); | 198 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 199 Node* ret = graph()->NewNode(common()->Return(), zero, add, start, start); |
| 195 Node* end = graph()->NewNode(common()->End(1), ret); | 200 Node* end = graph()->NewNode(common()->End(1), ret); |
| 196 | 201 |
| 197 graph()->SetEnd(end); | 202 graph()->SetEnd(end); |
| 198 | 203 |
| 199 ComputeAndVerifySchedule(24); | 204 ComputeAndVerifySchedule(25); |
| 200 } | 205 } |
| 201 | 206 |
| 202 | 207 |
| 203 TARGET_TEST_F(SchedulerTest, FloatingDiamond3) { | 208 TARGET_TEST_F(SchedulerTest, FloatingDiamond3) { |
| 204 Node* start = graph()->NewNode(common()->Start(2)); | 209 Node* start = graph()->NewNode(common()->Start(2)); |
| 205 graph()->SetStart(start); | 210 graph()->SetStart(start); |
| 206 | 211 |
| 207 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 212 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 208 Node* p1 = graph()->NewNode(common()->Parameter(1), start); | 213 Node* p1 = graph()->NewNode(common()->Parameter(1), start); |
| 209 Node* d1 = CreateDiamond(graph(), common(), p0); | 214 Node* d1 = CreateDiamond(graph(), common(), p0); |
| 210 Node* d2 = CreateDiamond(graph(), common(), p1); | 215 Node* d2 = CreateDiamond(graph(), common(), p1); |
| 211 Node* add = graph()->NewNode(&kIntAdd, d1, d2); | 216 Node* add = graph()->NewNode(&kIntAdd, d1, d2); |
| 212 Node* d3 = CreateDiamond(graph(), common(), add); | 217 Node* d3 = CreateDiamond(graph(), common(), add); |
| 213 Node* ret = graph()->NewNode(common()->Return(), d3, start, start); | 218 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 219 Node* ret = graph()->NewNode(common()->Return(), zero, d3, start, start); |
| 214 Node* end = graph()->NewNode(common()->End(1), ret); | 220 Node* end = graph()->NewNode(common()->End(1), ret); |
| 215 | 221 |
| 216 graph()->SetEnd(end); | 222 graph()->SetEnd(end); |
| 217 | 223 |
| 218 ComputeAndVerifySchedule(33); | 224 ComputeAndVerifySchedule(34); |
| 219 } | 225 } |
| 220 | 226 |
| 221 | 227 |
| 222 TARGET_TEST_F(SchedulerTest, NestedFloatingDiamonds) { | 228 TARGET_TEST_F(SchedulerTest, NestedFloatingDiamonds) { |
| 223 Node* start = graph()->NewNode(common()->Start(2)); | 229 Node* start = graph()->NewNode(common()->Start(2)); |
| 224 graph()->SetStart(start); | 230 graph()->SetStart(start); |
| 225 | 231 |
| 226 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 232 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 227 | 233 |
| 228 Node* fv = graph()->NewNode(common()->Int32Constant(7)); | 234 Node* fv = graph()->NewNode(common()->Int32Constant(7)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 241 Node* ffalse = graph()->NewNode(common()->Int32Constant(0)); | 247 Node* ffalse = graph()->NewNode(common()->Int32Constant(0)); |
| 242 Node* phi1 = graph()->NewNode( | 248 Node* phi1 = graph()->NewNode( |
| 243 common()->Phi(MachineRepresentation::kTagged, 2), ttrue, ffalse, m1); | 249 common()->Phi(MachineRepresentation::kTagged, 2), ttrue, ffalse, m1); |
| 244 | 250 |
| 245 | 251 |
| 246 Node* m = graph()->NewNode(common()->Merge(2), t, f); | 252 Node* m = graph()->NewNode(common()->Merge(2), t, f); |
| 247 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | 253 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
| 248 fv, phi1, m); | 254 fv, phi1, m); |
| 249 Node* ephi1 = graph()->NewNode(common()->EffectPhi(2), start, map, m); | 255 Node* ephi1 = graph()->NewNode(common()->EffectPhi(2), start, map, m); |
| 250 | 256 |
| 251 Node* ret = graph()->NewNode(common()->Return(), phi, ephi1, start); | 257 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 258 Node* ret = graph()->NewNode(common()->Return(), zero, phi, ephi1, start); |
| 252 Node* end = graph()->NewNode(common()->End(1), ret); | 259 Node* end = graph()->NewNode(common()->End(1), ret); |
| 253 | 260 |
| 254 graph()->SetEnd(end); | 261 graph()->SetEnd(end); |
| 255 | 262 |
| 256 ComputeAndVerifySchedule(23); | 263 ComputeAndVerifySchedule(24); |
| 257 } | 264 } |
| 258 | 265 |
| 259 | 266 |
| 260 TARGET_TEST_F(SchedulerTest, NestedFloatingDiamondWithChain) { | 267 TARGET_TEST_F(SchedulerTest, NestedFloatingDiamondWithChain) { |
| 261 Node* start = graph()->NewNode(common()->Start(2)); | 268 Node* start = graph()->NewNode(common()->Start(2)); |
| 262 graph()->SetStart(start); | 269 graph()->SetStart(start); |
| 263 | 270 |
| 264 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 271 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 265 Node* p1 = graph()->NewNode(common()->Parameter(1), start); | 272 Node* p1 = graph()->NewNode(common()->Parameter(1), start); |
| 266 Node* c = graph()->NewNode(common()->Int32Constant(7)); | 273 Node* c = graph()->NewNode(common()->Int32Constant(7)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 287 common()->Phi(MachineRepresentation::kTagged, 2), phiB1, c, mA2); | 294 common()->Phi(MachineRepresentation::kTagged, 2), phiB1, c, mA2); |
| 288 | 295 |
| 289 Node* brB2 = graph()->NewNode(common()->Branch(), phiA1, mB1); | 296 Node* brB2 = graph()->NewNode(common()->Branch(), phiA1, mB1); |
| 290 Node* tB2 = graph()->NewNode(common()->IfTrue(), brB2); | 297 Node* tB2 = graph()->NewNode(common()->IfTrue(), brB2); |
| 291 Node* fB2 = graph()->NewNode(common()->IfFalse(), brB2); | 298 Node* fB2 = graph()->NewNode(common()->IfFalse(), brB2); |
| 292 Node* mB2 = graph()->NewNode(common()->Merge(2), tB2, fB2); | 299 Node* mB2 = graph()->NewNode(common()->Merge(2), tB2, fB2); |
| 293 Node* phiB2 = graph()->NewNode( | 300 Node* phiB2 = graph()->NewNode( |
| 294 common()->Phi(MachineRepresentation::kTagged, 2), phiA1, c, mB2); | 301 common()->Phi(MachineRepresentation::kTagged, 2), phiA1, c, mB2); |
| 295 | 302 |
| 296 Node* add = graph()->NewNode(&kIntAdd, phiA2, phiB2); | 303 Node* add = graph()->NewNode(&kIntAdd, phiA2, phiB2); |
| 297 Node* ret = graph()->NewNode(common()->Return(), add, start, start); | 304 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 305 Node* ret = graph()->NewNode(common()->Return(), zero, add, start, start); |
| 298 Node* end = graph()->NewNode(common()->End(1), ret); | 306 Node* end = graph()->NewNode(common()->End(1), ret); |
| 299 | 307 |
| 300 graph()->SetEnd(end); | 308 graph()->SetEnd(end); |
| 301 | 309 |
| 302 ComputeAndVerifySchedule(36); | 310 ComputeAndVerifySchedule(37); |
| 303 } | 311 } |
| 304 | 312 |
| 305 | 313 |
| 306 TARGET_TEST_F(SchedulerTest, NestedFloatingDiamondWithLoop) { | 314 TARGET_TEST_F(SchedulerTest, NestedFloatingDiamondWithLoop) { |
| 307 Node* start = graph()->NewNode(common()->Start(2)); | 315 Node* start = graph()->NewNode(common()->Start(2)); |
| 308 graph()->SetStart(start); | 316 graph()->SetStart(start); |
| 309 | 317 |
| 310 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 318 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 311 | 319 |
| 312 Node* fv = graph()->NewNode(common()->Int32Constant(7)); | 320 Node* fv = graph()->NewNode(common()->Int32Constant(7)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 323 Node* t1 = graph()->NewNode(common()->IfTrue(), br1); | 331 Node* t1 = graph()->NewNode(common()->IfTrue(), br1); |
| 324 Node* f1 = graph()->NewNode(common()->IfFalse(), br1); | 332 Node* f1 = graph()->NewNode(common()->IfFalse(), br1); |
| 325 | 333 |
| 326 loop->ReplaceInput(1, t1); // close loop. | 334 loop->ReplaceInput(1, t1); // close loop. |
| 327 ind->ReplaceInput(1, ind); // close induction variable. | 335 ind->ReplaceInput(1, ind); // close induction variable. |
| 328 | 336 |
| 329 Node* m = graph()->NewNode(common()->Merge(2), t, f1); | 337 Node* m = graph()->NewNode(common()->Merge(2), t, f1); |
| 330 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | 338 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
| 331 fv, ind, m); | 339 fv, ind, m); |
| 332 | 340 |
| 333 Node* ret = graph()->NewNode(common()->Return(), phi, start, start); | 341 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 342 Node* ret = graph()->NewNode(common()->Return(), zero, phi, start, start); |
| 334 Node* end = graph()->NewNode(common()->End(1), ret); | 343 Node* end = graph()->NewNode(common()->End(1), ret); |
| 335 | 344 |
| 336 graph()->SetEnd(end); | 345 graph()->SetEnd(end); |
| 337 | 346 |
| 338 ComputeAndVerifySchedule(20); | 347 ComputeAndVerifySchedule(21); |
| 339 } | 348 } |
| 340 | 349 |
| 341 | 350 |
| 342 TARGET_TEST_F(SchedulerTest, LoopedFloatingDiamond1) { | 351 TARGET_TEST_F(SchedulerTest, LoopedFloatingDiamond1) { |
| 343 Node* start = graph()->NewNode(common()->Start(2)); | 352 Node* start = graph()->NewNode(common()->Start(2)); |
| 344 graph()->SetStart(start); | 353 graph()->SetStart(start); |
| 345 | 354 |
| 346 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 355 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 347 | 356 |
| 348 Node* c = graph()->NewNode(common()->Int32Constant(7)); | 357 Node* c = graph()->NewNode(common()->Int32Constant(7)); |
| 349 Node* loop = graph()->NewNode(common()->Loop(2), start, start); | 358 Node* loop = graph()->NewNode(common()->Loop(2), start, start); |
| 350 Node* ind = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | 359 Node* ind = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
| 351 p0, p0, loop); | 360 p0, p0, loop); |
| 352 Node* add = graph()->NewNode(&kIntAdd, ind, c); | 361 Node* add = graph()->NewNode(&kIntAdd, ind, c); |
| 353 | 362 |
| 354 Node* br = graph()->NewNode(common()->Branch(), add, loop); | 363 Node* br = graph()->NewNode(common()->Branch(), add, loop); |
| 355 Node* t = graph()->NewNode(common()->IfTrue(), br); | 364 Node* t = graph()->NewNode(common()->IfTrue(), br); |
| 356 Node* f = graph()->NewNode(common()->IfFalse(), br); | 365 Node* f = graph()->NewNode(common()->IfFalse(), br); |
| 357 | 366 |
| 358 Node* br1 = graph()->NewNode(common()->Branch(), p0, graph()->start()); | 367 Node* br1 = graph()->NewNode(common()->Branch(), p0, graph()->start()); |
| 359 Node* t1 = graph()->NewNode(common()->IfTrue(), br1); | 368 Node* t1 = graph()->NewNode(common()->IfTrue(), br1); |
| 360 Node* f1 = graph()->NewNode(common()->IfFalse(), br1); | 369 Node* f1 = graph()->NewNode(common()->IfFalse(), br1); |
| 361 Node* m1 = graph()->NewNode(common()->Merge(2), t1, f1); | 370 Node* m1 = graph()->NewNode(common()->Merge(2), t1, f1); |
| 362 Node* phi1 = graph()->NewNode( | 371 Node* phi1 = graph()->NewNode( |
| 363 common()->Phi(MachineRepresentation::kTagged, 2), add, p0, m1); | 372 common()->Phi(MachineRepresentation::kTagged, 2), add, p0, m1); |
| 364 | 373 |
| 365 loop->ReplaceInput(1, t); // close loop. | 374 loop->ReplaceInput(1, t); // close loop. |
| 366 ind->ReplaceInput(1, phi1); // close induction variable. | 375 ind->ReplaceInput(1, phi1); // close induction variable. |
| 367 | 376 |
| 368 Node* ret = graph()->NewNode(common()->Return(), ind, start, f); | 377 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 378 Node* ret = graph()->NewNode(common()->Return(), zero, ind, start, f); |
| 369 Node* end = graph()->NewNode(common()->End(2), ret, f); | 379 Node* end = graph()->NewNode(common()->End(2), ret, f); |
| 370 | 380 |
| 371 graph()->SetEnd(end); | 381 graph()->SetEnd(end); |
| 372 | 382 |
| 373 ComputeAndVerifySchedule(20); | 383 ComputeAndVerifySchedule(21); |
| 374 } | 384 } |
| 375 | 385 |
| 376 | 386 |
| 377 TARGET_TEST_F(SchedulerTest, LoopedFloatingDiamond2) { | 387 TARGET_TEST_F(SchedulerTest, LoopedFloatingDiamond2) { |
| 378 Node* start = graph()->NewNode(common()->Start(2)); | 388 Node* start = graph()->NewNode(common()->Start(2)); |
| 379 graph()->SetStart(start); | 389 graph()->SetStart(start); |
| 380 | 390 |
| 381 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 391 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 382 | 392 |
| 383 Node* c = graph()->NewNode(common()->Int32Constant(7)); | 393 Node* c = graph()->NewNode(common()->Int32Constant(7)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 394 | 404 |
| 395 Node* add = graph()->NewNode(&kIntAdd, ind, phi1); | 405 Node* add = graph()->NewNode(&kIntAdd, ind, phi1); |
| 396 | 406 |
| 397 Node* br = graph()->NewNode(common()->Branch(), add, loop); | 407 Node* br = graph()->NewNode(common()->Branch(), add, loop); |
| 398 Node* t = graph()->NewNode(common()->IfTrue(), br); | 408 Node* t = graph()->NewNode(common()->IfTrue(), br); |
| 399 Node* f = graph()->NewNode(common()->IfFalse(), br); | 409 Node* f = graph()->NewNode(common()->IfFalse(), br); |
| 400 | 410 |
| 401 loop->ReplaceInput(1, t); // close loop. | 411 loop->ReplaceInput(1, t); // close loop. |
| 402 ind->ReplaceInput(1, add); // close induction variable. | 412 ind->ReplaceInput(1, add); // close induction variable. |
| 403 | 413 |
| 404 Node* ret = graph()->NewNode(common()->Return(), ind, start, f); | 414 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 415 Node* ret = graph()->NewNode(common()->Return(), zero, ind, start, f); |
| 405 Node* end = graph()->NewNode(common()->End(2), ret, f); | 416 Node* end = graph()->NewNode(common()->End(2), ret, f); |
| 406 | 417 |
| 407 graph()->SetEnd(end); | 418 graph()->SetEnd(end); |
| 408 | 419 |
| 409 ComputeAndVerifySchedule(20); | 420 ComputeAndVerifySchedule(21); |
| 410 } | 421 } |
| 411 | 422 |
| 412 | 423 |
| 413 TARGET_TEST_F(SchedulerTest, LoopedFloatingDiamond3) { | 424 TARGET_TEST_F(SchedulerTest, LoopedFloatingDiamond3) { |
| 414 Node* start = graph()->NewNode(common()->Start(2)); | 425 Node* start = graph()->NewNode(common()->Start(2)); |
| 415 graph()->SetStart(start); | 426 graph()->SetStart(start); |
| 416 | 427 |
| 417 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 428 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 418 | 429 |
| 419 Node* c = graph()->NewNode(common()->Int32Constant(7)); | 430 Node* c = graph()->NewNode(common()->Int32Constant(7)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 443 | 454 |
| 444 Node* add = graph()->NewNode(&kIntAdd, ind, phi1); | 455 Node* add = graph()->NewNode(&kIntAdd, ind, phi1); |
| 445 | 456 |
| 446 Node* br = graph()->NewNode(common()->Branch(), add, loop); | 457 Node* br = graph()->NewNode(common()->Branch(), add, loop); |
| 447 Node* t = graph()->NewNode(common()->IfTrue(), br); | 458 Node* t = graph()->NewNode(common()->IfTrue(), br); |
| 448 Node* f = graph()->NewNode(common()->IfFalse(), br); | 459 Node* f = graph()->NewNode(common()->IfFalse(), br); |
| 449 | 460 |
| 450 loop->ReplaceInput(1, t); // close loop. | 461 loop->ReplaceInput(1, t); // close loop. |
| 451 ind->ReplaceInput(1, add); // close induction variable. | 462 ind->ReplaceInput(1, add); // close induction variable. |
| 452 | 463 |
| 453 Node* ret = graph()->NewNode(common()->Return(), ind, start, f); | 464 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 465 Node* ret = graph()->NewNode(common()->Return(), zero, ind, start, f); |
| 454 Node* end = graph()->NewNode(common()->End(2), ret, f); | 466 Node* end = graph()->NewNode(common()->End(2), ret, f); |
| 455 | 467 |
| 456 graph()->SetEnd(end); | 468 graph()->SetEnd(end); |
| 457 | 469 |
| 458 ComputeAndVerifySchedule(28); | 470 ComputeAndVerifySchedule(29); |
| 459 } | 471 } |
| 460 | 472 |
| 461 | 473 |
| 462 TARGET_TEST_F(SchedulerTest, PhisPushedDownToDifferentBranches) { | 474 TARGET_TEST_F(SchedulerTest, PhisPushedDownToDifferentBranches) { |
| 463 Node* start = graph()->NewNode(common()->Start(2)); | 475 Node* start = graph()->NewNode(common()->Start(2)); |
| 464 graph()->SetStart(start); | 476 graph()->SetStart(start); |
| 465 | 477 |
| 466 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 478 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 467 Node* p1 = graph()->NewNode(common()->Parameter(1), start); | 479 Node* p1 = graph()->NewNode(common()->Parameter(1), start); |
| 468 | 480 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 479 Node* phi2 = graph()->NewNode( | 491 Node* phi2 = graph()->NewNode( |
| 480 common()->Phi(MachineRepresentation::kTagged, 2), v3, v4, m); | 492 common()->Phi(MachineRepresentation::kTagged, 2), v3, v4, m); |
| 481 | 493 |
| 482 Node* br2 = graph()->NewNode(common()->Branch(), p1, graph()->start()); | 494 Node* br2 = graph()->NewNode(common()->Branch(), p1, graph()->start()); |
| 483 Node* t2 = graph()->NewNode(common()->IfTrue(), br2); | 495 Node* t2 = graph()->NewNode(common()->IfTrue(), br2); |
| 484 Node* f2 = graph()->NewNode(common()->IfFalse(), br2); | 496 Node* f2 = graph()->NewNode(common()->IfFalse(), br2); |
| 485 Node* m2 = graph()->NewNode(common()->Merge(2), t2, f2); | 497 Node* m2 = graph()->NewNode(common()->Merge(2), t2, f2); |
| 486 Node* phi3 = graph()->NewNode( | 498 Node* phi3 = graph()->NewNode( |
| 487 common()->Phi(MachineRepresentation::kTagged, 2), phi, phi2, m2); | 499 common()->Phi(MachineRepresentation::kTagged, 2), phi, phi2, m2); |
| 488 | 500 |
| 489 Node* ret = graph()->NewNode(common()->Return(), phi3, start, start); | 501 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 502 Node* ret = graph()->NewNode(common()->Return(), zero, phi3, start, start); |
| 490 Node* end = graph()->NewNode(common()->End(1), ret); | 503 Node* end = graph()->NewNode(common()->End(1), ret); |
| 491 | 504 |
| 492 graph()->SetEnd(end); | 505 graph()->SetEnd(end); |
| 493 | 506 |
| 494 ComputeAndVerifySchedule(24); | 507 ComputeAndVerifySchedule(25); |
| 495 } | 508 } |
| 496 | 509 |
| 497 | 510 |
| 498 TARGET_TEST_F(SchedulerTest, BranchHintTrue) { | 511 TARGET_TEST_F(SchedulerTest, BranchHintTrue) { |
| 499 Node* start = graph()->NewNode(common()->Start(1)); | 512 Node* start = graph()->NewNode(common()->Start(1)); |
| 500 graph()->SetStart(start); | 513 graph()->SetStart(start); |
| 501 | 514 |
| 502 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 515 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 503 Node* tv = graph()->NewNode(common()->Int32Constant(6)); | 516 Node* tv = graph()->NewNode(common()->Int32Constant(6)); |
| 504 Node* fv = graph()->NewNode(common()->Int32Constant(7)); | 517 Node* fv = graph()->NewNode(common()->Int32Constant(7)); |
| 505 Node* br = graph()->NewNode(common()->Branch(BranchHint::kTrue), p0, start); | 518 Node* br = graph()->NewNode(common()->Branch(BranchHint::kTrue), p0, start); |
| 506 Node* t = graph()->NewNode(common()->IfTrue(), br); | 519 Node* t = graph()->NewNode(common()->IfTrue(), br); |
| 507 Node* f = graph()->NewNode(common()->IfFalse(), br); | 520 Node* f = graph()->NewNode(common()->IfFalse(), br); |
| 508 Node* m = graph()->NewNode(common()->Merge(2), t, f); | 521 Node* m = graph()->NewNode(common()->Merge(2), t, f); |
| 509 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | 522 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
| 510 tv, fv, m); | 523 tv, fv, m); |
| 511 Node* ret = graph()->NewNode(common()->Return(), phi, start, start); | 524 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 525 Node* ret = graph()->NewNode(common()->Return(), zero, phi, start, start); |
| 512 Node* end = graph()->NewNode(common()->End(1), ret); | 526 Node* end = graph()->NewNode(common()->End(1), ret); |
| 513 | 527 |
| 514 graph()->SetEnd(end); | 528 graph()->SetEnd(end); |
| 515 | 529 |
| 516 Schedule* schedule = ComputeAndVerifySchedule(13); | 530 Schedule* schedule = ComputeAndVerifySchedule(14); |
| 517 // Make sure the false block is marked as deferred. | 531 // Make sure the false block is marked as deferred. |
| 518 EXPECT_FALSE(schedule->block(t)->deferred()); | 532 EXPECT_FALSE(schedule->block(t)->deferred()); |
| 519 EXPECT_TRUE(schedule->block(f)->deferred()); | 533 EXPECT_TRUE(schedule->block(f)->deferred()); |
| 520 } | 534 } |
| 521 | 535 |
| 522 | 536 |
| 523 TARGET_TEST_F(SchedulerTest, BranchHintFalse) { | 537 TARGET_TEST_F(SchedulerTest, BranchHintFalse) { |
| 524 Node* start = graph()->NewNode(common()->Start(1)); | 538 Node* start = graph()->NewNode(common()->Start(1)); |
| 525 graph()->SetStart(start); | 539 graph()->SetStart(start); |
| 526 | 540 |
| 527 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 541 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 528 Node* tv = graph()->NewNode(common()->Int32Constant(6)); | 542 Node* tv = graph()->NewNode(common()->Int32Constant(6)); |
| 529 Node* fv = graph()->NewNode(common()->Int32Constant(7)); | 543 Node* fv = graph()->NewNode(common()->Int32Constant(7)); |
| 530 Node* br = graph()->NewNode(common()->Branch(BranchHint::kFalse), p0, start); | 544 Node* br = graph()->NewNode(common()->Branch(BranchHint::kFalse), p0, start); |
| 531 Node* t = graph()->NewNode(common()->IfTrue(), br); | 545 Node* t = graph()->NewNode(common()->IfTrue(), br); |
| 532 Node* f = graph()->NewNode(common()->IfFalse(), br); | 546 Node* f = graph()->NewNode(common()->IfFalse(), br); |
| 533 Node* m = graph()->NewNode(common()->Merge(2), t, f); | 547 Node* m = graph()->NewNode(common()->Merge(2), t, f); |
| 534 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | 548 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
| 535 tv, fv, m); | 549 tv, fv, m); |
| 536 Node* ret = graph()->NewNode(common()->Return(), phi, start, start); | 550 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 551 Node* ret = graph()->NewNode(common()->Return(), zero, phi, start, start); |
| 537 Node* end = graph()->NewNode(common()->End(1), ret); | 552 Node* end = graph()->NewNode(common()->End(1), ret); |
| 538 | 553 |
| 539 graph()->SetEnd(end); | 554 graph()->SetEnd(end); |
| 540 | 555 |
| 541 Schedule* schedule = ComputeAndVerifySchedule(13); | 556 Schedule* schedule = ComputeAndVerifySchedule(14); |
| 542 // Make sure the true block is marked as deferred. | 557 // Make sure the true block is marked as deferred. |
| 543 EXPECT_TRUE(schedule->block(t)->deferred()); | 558 EXPECT_TRUE(schedule->block(t)->deferred()); |
| 544 EXPECT_FALSE(schedule->block(f)->deferred()); | 559 EXPECT_FALSE(schedule->block(f)->deferred()); |
| 545 } | 560 } |
| 546 | 561 |
| 547 | 562 |
| 548 TARGET_TEST_F(SchedulerTest, CallException) { | 563 TARGET_TEST_F(SchedulerTest, CallException) { |
| 549 Node* start = graph()->NewNode(common()->Start(1)); | 564 Node* start = graph()->NewNode(common()->Start(1)); |
| 550 graph()->SetStart(start); | 565 graph()->SetStart(start); |
| 551 | 566 |
| 552 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 567 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 553 Node* c1 = graph()->NewNode(&kMockCall, start); | 568 Node* c1 = graph()->NewNode(&kMockCall, start); |
| 554 Node* ok1 = graph()->NewNode(common()->IfSuccess(), c1); | 569 Node* ok1 = graph()->NewNode(common()->IfSuccess(), c1); |
| 555 Node* ex1 = graph()->NewNode(common()->IfException(), c1, c1); | 570 Node* ex1 = graph()->NewNode(common()->IfException(), c1, c1); |
| 556 Node* c2 = graph()->NewNode(&kMockCall, ok1); | 571 Node* c2 = graph()->NewNode(&kMockCall, ok1); |
| 557 Node* ok2 = graph()->NewNode(common()->IfSuccess(), c2); | 572 Node* ok2 = graph()->NewNode(common()->IfSuccess(), c2); |
| 558 Node* ex2 = graph()->NewNode(common()->IfException(), c2, c2); | 573 Node* ex2 = graph()->NewNode(common()->IfException(), c2, c2); |
| 559 Node* hdl = graph()->NewNode(common()->Merge(2), ex1, ex2); | 574 Node* hdl = graph()->NewNode(common()->Merge(2), ex1, ex2); |
| 560 Node* m = graph()->NewNode(common()->Merge(2), ok2, hdl); | 575 Node* m = graph()->NewNode(common()->Merge(2), ok2, hdl); |
| 561 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | 576 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
| 562 c2, p0, m); | 577 c2, p0, m); |
| 563 Node* ret = graph()->NewNode(common()->Return(), phi, start, m); | 578 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 579 Node* ret = graph()->NewNode(common()->Return(), zero, phi, start, m); |
| 564 Node* end = graph()->NewNode(common()->End(1), ret); | 580 Node* end = graph()->NewNode(common()->End(1), ret); |
| 565 | 581 |
| 566 graph()->SetEnd(end); | 582 graph()->SetEnd(end); |
| 567 | 583 |
| 568 Schedule* schedule = ComputeAndVerifySchedule(17); | 584 Schedule* schedule = ComputeAndVerifySchedule(18); |
| 569 // Make sure the exception blocks as well as the handler are deferred. | 585 // Make sure the exception blocks as well as the handler are deferred. |
| 570 EXPECT_TRUE(schedule->block(ex1)->deferred()); | 586 EXPECT_TRUE(schedule->block(ex1)->deferred()); |
| 571 EXPECT_TRUE(schedule->block(ex2)->deferred()); | 587 EXPECT_TRUE(schedule->block(ex2)->deferred()); |
| 572 EXPECT_TRUE(schedule->block(hdl)->deferred()); | 588 EXPECT_TRUE(schedule->block(hdl)->deferred()); |
| 573 EXPECT_FALSE(schedule->block(m)->deferred()); | 589 EXPECT_FALSE(schedule->block(m)->deferred()); |
| 574 } | 590 } |
| 575 | 591 |
| 576 | 592 |
| 577 TARGET_TEST_F(SchedulerTest, TailCall) { | 593 TARGET_TEST_F(SchedulerTest, TailCall) { |
| 578 Node* start = graph()->NewNode(common()->Start(1)); | 594 Node* start = graph()->NewNode(common()->Start(1)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 596 Node* sw = graph()->NewNode(common()->Switch(3), p0, start); | 612 Node* sw = graph()->NewNode(common()->Switch(3), p0, start); |
| 597 Node* c0 = graph()->NewNode(common()->IfValue(0), sw); | 613 Node* c0 = graph()->NewNode(common()->IfValue(0), sw); |
| 598 Node* v0 = graph()->NewNode(common()->Int32Constant(11)); | 614 Node* v0 = graph()->NewNode(common()->Int32Constant(11)); |
| 599 Node* c1 = graph()->NewNode(common()->IfValue(1), sw); | 615 Node* c1 = graph()->NewNode(common()->IfValue(1), sw); |
| 600 Node* v1 = graph()->NewNode(common()->Int32Constant(22)); | 616 Node* v1 = graph()->NewNode(common()->Int32Constant(22)); |
| 601 Node* d = graph()->NewNode(common()->IfDefault(), sw); | 617 Node* d = graph()->NewNode(common()->IfDefault(), sw); |
| 602 Node* vd = graph()->NewNode(common()->Int32Constant(33)); | 618 Node* vd = graph()->NewNode(common()->Int32Constant(33)); |
| 603 Node* m = graph()->NewNode(common()->Merge(3), c0, c1, d); | 619 Node* m = graph()->NewNode(common()->Merge(3), c0, c1, d); |
| 604 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 3), | 620 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 3), |
| 605 v0, v1, vd, m); | 621 v0, v1, vd, m); |
| 606 Node* ret = graph()->NewNode(common()->Return(), phi, start, m); | 622 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 623 Node* ret = graph()->NewNode(common()->Return(), zero, phi, start, m); |
| 607 Node* end = graph()->NewNode(common()->End(1), ret); | 624 Node* end = graph()->NewNode(common()->End(1), ret); |
| 608 | 625 |
| 609 graph()->SetEnd(end); | 626 graph()->SetEnd(end); |
| 610 | 627 |
| 611 ComputeAndVerifySchedule(16); | 628 ComputeAndVerifySchedule(17); |
| 612 } | 629 } |
| 613 | 630 |
| 614 | 631 |
| 615 TARGET_TEST_F(SchedulerTest, FloatingSwitch) { | 632 TARGET_TEST_F(SchedulerTest, FloatingSwitch) { |
| 616 Node* start = graph()->NewNode(common()->Start(1)); | 633 Node* start = graph()->NewNode(common()->Start(1)); |
| 617 graph()->SetStart(start); | 634 graph()->SetStart(start); |
| 618 | 635 |
| 619 Node* p0 = graph()->NewNode(common()->Parameter(0), start); | 636 Node* p0 = graph()->NewNode(common()->Parameter(0), start); |
| 620 Node* sw = graph()->NewNode(common()->Switch(3), p0, start); | 637 Node* sw = graph()->NewNode(common()->Switch(3), p0, start); |
| 621 Node* c0 = graph()->NewNode(common()->IfValue(0), sw); | 638 Node* c0 = graph()->NewNode(common()->IfValue(0), sw); |
| 622 Node* v0 = graph()->NewNode(common()->Int32Constant(11)); | 639 Node* v0 = graph()->NewNode(common()->Int32Constant(11)); |
| 623 Node* c1 = graph()->NewNode(common()->IfValue(1), sw); | 640 Node* c1 = graph()->NewNode(common()->IfValue(1), sw); |
| 624 Node* v1 = graph()->NewNode(common()->Int32Constant(22)); | 641 Node* v1 = graph()->NewNode(common()->Int32Constant(22)); |
| 625 Node* d = graph()->NewNode(common()->IfDefault(), sw); | 642 Node* d = graph()->NewNode(common()->IfDefault(), sw); |
| 626 Node* vd = graph()->NewNode(common()->Int32Constant(33)); | 643 Node* vd = graph()->NewNode(common()->Int32Constant(33)); |
| 627 Node* m = graph()->NewNode(common()->Merge(3), c0, c1, d); | 644 Node* m = graph()->NewNode(common()->Merge(3), c0, c1, d); |
| 628 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 3), | 645 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 3), |
| 629 v0, v1, vd, m); | 646 v0, v1, vd, m); |
| 630 Node* ret = graph()->NewNode(common()->Return(), phi, start, start); | 647 Node* zero = graph()->NewNode(common()->Int32Constant(0)); |
| 648 Node* ret = graph()->NewNode(common()->Return(), zero, phi, start, start); |
| 631 Node* end = graph()->NewNode(common()->End(1), ret); | 649 Node* end = graph()->NewNode(common()->End(1), ret); |
| 632 | 650 |
| 633 graph()->SetEnd(end); | 651 graph()->SetEnd(end); |
| 634 | 652 |
| 635 ComputeAndVerifySchedule(16); | 653 ComputeAndVerifySchedule(17); |
| 636 } | 654 } |
| 637 | 655 |
| 638 | 656 |
| 639 TARGET_TEST_F(SchedulerTest, Terminate) { | 657 TARGET_TEST_F(SchedulerTest, Terminate) { |
| 640 Node* start = graph()->NewNode(common()->Start(1)); | 658 Node* start = graph()->NewNode(common()->Start(1)); |
| 641 graph()->SetStart(start); | 659 graph()->SetStart(start); |
| 642 | 660 |
| 643 Node* loop = graph()->NewNode(common()->Loop(2), start, start); | 661 Node* loop = graph()->NewNode(common()->Loop(2), start, start); |
| 644 loop->ReplaceInput(1, loop); // self loop, NTL. | 662 loop->ReplaceInput(1, loop); // self loop, NTL. |
| 645 | 663 |
| 646 Node* effect = graph()->NewNode(common()->EffectPhi(2), start, start, loop); | 664 Node* effect = graph()->NewNode(common()->EffectPhi(2), start, start, loop); |
| 647 effect->ReplaceInput(1, effect); // self loop. | 665 effect->ReplaceInput(1, effect); // self loop. |
| 648 | 666 |
| 649 Node* terminate = graph()->NewNode(common()->Terminate(), effect, loop); | 667 Node* terminate = graph()->NewNode(common()->Terminate(), effect, loop); |
| 650 Node* end = graph()->NewNode(common()->End(1), terminate); | 668 Node* end = graph()->NewNode(common()->End(1), terminate); |
| 651 graph()->SetEnd(end); | 669 graph()->SetEnd(end); |
| 652 | 670 |
| 653 Schedule* schedule = ComputeAndVerifySchedule(6); | 671 Schedule* schedule = ComputeAndVerifySchedule(6); |
| 654 BasicBlock* block = schedule->block(loop); | 672 BasicBlock* block = schedule->block(loop); |
| 655 EXPECT_EQ(block, schedule->block(effect)); | 673 EXPECT_EQ(block, schedule->block(effect)); |
| 656 EXPECT_GE(block->rpo_number(), 0); | 674 EXPECT_GE(block->rpo_number(), 0); |
| 657 } | 675 } |
| 658 | 676 |
| 659 } // namespace compiler | 677 } // namespace compiler |
| 660 } // namespace internal | 678 } // namespace internal |
| 661 } // namespace v8 | 679 } // namespace v8 |
| OLD | NEW |