| 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 | 
|---|