| 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/codegen.h" | 5 #include "src/codegen.h" |
| 6 #include "src/compiler/all-nodes.h" | 6 #include "src/compiler/all-nodes.h" |
| 7 #include "src/compiler/common-operator.h" | 7 #include "src/compiler/common-operator.h" |
| 8 #include "src/compiler/diamond.h" | 8 #include "src/compiler/diamond.h" |
| 9 #include "src/compiler/graph.h" | 9 #include "src/compiler/graph.h" |
| 10 #include "src/compiler/js-graph.h" | 10 #include "src/compiler/js-graph.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 | 44 |
| 45 class OsrDeconstructorTester : public HandleAndZoneScope { | 45 class OsrDeconstructorTester : public HandleAndZoneScope { |
| 46 public: | 46 public: |
| 47 explicit OsrDeconstructorTester(int num_values) | 47 explicit OsrDeconstructorTester(int num_values) |
| 48 : isolate(main_isolate()), | 48 : isolate(main_isolate()), |
| 49 common(main_zone()), | 49 common(main_zone()), |
| 50 graph(main_zone()), | 50 graph(main_zone()), |
| 51 jsgraph(main_isolate(), &graph, &common, NULL, NULL), | 51 jsgraph(main_isolate(), &graph, &common, NULL, NULL), |
| 52 start(graph.NewNode(common.Start(1))), | 52 start(graph.NewNode(common.Start(1))), |
| 53 p0(graph.NewNode(common.Parameter(0), start)), | 53 p0(graph.NewNode(common.Parameter(0), start)), |
| 54 end(graph.NewNode(common.End(), start)), | 54 end(graph.NewNode(common.End(1), start)), |
| 55 osr_normal_entry(graph.NewNode(common.OsrNormalEntry(), start, start)), | 55 osr_normal_entry(graph.NewNode(common.OsrNormalEntry(), start, start)), |
| 56 osr_loop_entry(graph.NewNode(common.OsrLoopEntry(), start, start)), | 56 osr_loop_entry(graph.NewNode(common.OsrLoopEntry(), start, start)), |
| 57 self(graph.NewNode(common.Int32Constant(0xaabbccdd))) { | 57 self(graph.NewNode(common.Int32Constant(0xaabbccdd))) { |
| 58 CHECK(num_values <= kMaxOsrValues); | 58 CHECK(num_values <= kMaxOsrValues); |
| 59 graph.SetStart(start); | 59 graph.SetStart(start); |
| 60 for (int i = 0; i < num_values; i++) { | 60 for (int i = 0; i < num_values; i++) { |
| 61 osr_values[i] = graph.NewNode(common.OsrValue(i), osr_loop_entry); | 61 osr_values[i] = graph.NewNode(common.OsrValue(i), osr_loop_entry); |
| 62 } | 62 } |
| 63 } | 63 } |
| 64 | 64 |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 Node* outer_phi = outer.Phi(T.p0, T.p0, nullptr); | 370 Node* outer_phi = outer.Phi(T.p0, T.p0, nullptr); |
| 371 outer.branch->ReplaceInput(0, outer_phi); | 371 outer.branch->ReplaceInput(0, outer_phi); |
| 372 | 372 |
| 373 Node* osr_phi = inner.Phi(T.jsgraph.OneConstant(), T.osr_values[0], | 373 Node* osr_phi = inner.Phi(T.jsgraph.OneConstant(), T.osr_values[0], |
| 374 T.jsgraph.ZeroConstant()); | 374 T.jsgraph.ZeroConstant()); |
| 375 inner.branch->ReplaceInput(0, osr_phi); | 375 inner.branch->ReplaceInput(0, osr_phi); |
| 376 outer_phi->ReplaceInput(1, osr_phi); | 376 outer_phi->ReplaceInput(1, osr_phi); |
| 377 | 377 |
| 378 Node* ret = | 378 Node* ret = |
| 379 T.graph.NewNode(T.common.Return(), outer_phi, T.start, outer.exit); | 379 T.graph.NewNode(T.common.Return(), outer_phi, T.start, outer.exit); |
| 380 Node* end = T.graph.NewNode(T.common.End(), ret); | 380 Node* end = T.graph.NewNode(T.common.End(1), ret); |
| 381 T.graph.SetEnd(end); | 381 T.graph.SetEnd(end); |
| 382 | 382 |
| 383 T.DeconstructOsr(); | 383 T.DeconstructOsr(); |
| 384 | 384 |
| 385 // Check structure of deconstructed graph. | 385 // Check structure of deconstructed graph. |
| 386 // Check inner OSR loop is directly connected to start. | 386 // Check inner OSR loop is directly connected to start. |
| 387 CheckInputs(inner.loop, T.start, inner.if_true); | 387 CheckInputs(inner.loop, T.start, inner.if_true); |
| 388 CheckInputs(osr_phi, T.osr_values[0], T.jsgraph.ZeroConstant(), inner.loop); | 388 CheckInputs(osr_phi, T.osr_values[0], T.jsgraph.ZeroConstant(), inner.loop); |
| 389 | 389 |
| 390 // Check control transfer to copy of outer loop. | 390 // Check control transfer to copy of outer loop. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 | 437 |
| 438 Node* x_branch = T.graph.NewNode(T.common.Branch(), osr_phi, inner.exit); | 438 Node* x_branch = T.graph.NewNode(T.common.Branch(), osr_phi, inner.exit); |
| 439 Node* x_true = T.graph.NewNode(T.common.IfTrue(), x_branch); | 439 Node* x_true = T.graph.NewNode(T.common.IfTrue(), x_branch); |
| 440 Node* x_false = T.graph.NewNode(T.common.IfFalse(), x_branch); | 440 Node* x_false = T.graph.NewNode(T.common.IfFalse(), x_branch); |
| 441 | 441 |
| 442 outer.loop->ReplaceInput(1, x_true); | 442 outer.loop->ReplaceInput(1, x_true); |
| 443 outer.loop->ReplaceInput(2, x_false); | 443 outer.loop->ReplaceInput(2, x_false); |
| 444 | 444 |
| 445 Node* ret = | 445 Node* ret = |
| 446 T.graph.NewNode(T.common.Return(), outer_phi, T.start, outer.exit); | 446 T.graph.NewNode(T.common.Return(), outer_phi, T.start, outer.exit); |
| 447 Node* end = T.graph.NewNode(T.common.End(), ret); | 447 Node* end = T.graph.NewNode(T.common.End(1), ret); |
| 448 T.graph.SetEnd(end); | 448 T.graph.SetEnd(end); |
| 449 | 449 |
| 450 T.DeconstructOsr(); | 450 T.DeconstructOsr(); |
| 451 | 451 |
| 452 // Check structure of deconstructed graph. | 452 // Check structure of deconstructed graph. |
| 453 // Check inner OSR loop is directly connected to start. | 453 // Check inner OSR loop is directly connected to start. |
| 454 CheckInputs(inner.loop, T.start, inner.if_true); | 454 CheckInputs(inner.loop, T.start, inner.if_true); |
| 455 CheckInputs(osr_phi, T.osr_values[0], T.jsgraph.ZeroConstant(), inner.loop); | 455 CheckInputs(osr_phi, T.osr_values[0], T.jsgraph.ZeroConstant(), inner.loop); |
| 456 | 456 |
| 457 // Check control transfer to copy of outer loop. | 457 // Check control transfer to copy of outer loop. |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 // Branch to either the outer or middle loop. | 542 // Branch to either the outer or middle loop. |
| 543 Node* branch = T.graph.NewNode(T.common.Branch(), loop2_cntr, loop2.exit); | 543 Node* branch = T.graph.NewNode(T.common.Branch(), loop2_cntr, loop2.exit); |
| 544 Node* if_true = T.graph.NewNode(T.common.IfTrue(), branch); | 544 Node* if_true = T.graph.NewNode(T.common.IfTrue(), branch); |
| 545 Node* if_false = T.graph.NewNode(T.common.IfFalse(), branch); | 545 Node* if_false = T.graph.NewNode(T.common.IfFalse(), branch); |
| 546 | 546 |
| 547 loop0.loop->ReplaceInput(1, if_true); | 547 loop0.loop->ReplaceInput(1, if_true); |
| 548 loop1->ReplaceInput(1, if_false); | 548 loop1->ReplaceInput(1, if_false); |
| 549 | 549 |
| 550 Node* ret = | 550 Node* ret = |
| 551 T.graph.NewNode(T.common.Return(), loop0_cntr, T.start, loop0.exit); | 551 T.graph.NewNode(T.common.Return(), loop0_cntr, T.start, loop0.exit); |
| 552 Node* end = T.graph.NewNode(T.common.End(), ret); | 552 Node* end = T.graph.NewNode(T.common.End(1), ret); |
| 553 T.graph.SetEnd(end); | 553 T.graph.SetEnd(end); |
| 554 | 554 |
| 555 T.DeconstructOsr(); | 555 T.DeconstructOsr(); |
| 556 | 556 |
| 557 // Check structure of deconstructed graph. | 557 // Check structure of deconstructed graph. |
| 558 // Check loop2 (OSR loop) is directly connected to start. | 558 // Check loop2 (OSR loop) is directly connected to start. |
| 559 CheckInputs(loop2.loop, T.start, loop2.if_true); | 559 CheckInputs(loop2.loop, T.start, loop2.if_true); |
| 560 CheckInputs(osr_phi, T.osr_values[0], loop2_inc, loop2.loop); | 560 CheckInputs(osr_phi, T.osr_values[0], loop2_inc, loop2.loop); |
| 561 CheckInputs(loop2.branch, osr_phi, loop2.loop); | 561 CheckInputs(loop2.branch, osr_phi, loop2.loop); |
| 562 CheckInputs(loop2.if_true, loop2.branch); | 562 CheckInputs(loop2.if_true, loop2.branch); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 586 | 586 |
| 587 Node* new_loop0_phi = new_ret->InputAt(0); | 587 Node* new_loop0_phi = new_ret->InputAt(0); |
| 588 CHECK_EQ(IrOpcode::kPhi, new_loop0_phi->opcode()); | 588 CHECK_EQ(IrOpcode::kPhi, new_loop0_phi->opcode()); |
| 589 CHECK_EQ(new_loop0_loop, NodeProperties::GetControlInput(new_loop0_phi)); | 589 CHECK_EQ(new_loop0_loop, NodeProperties::GetControlInput(new_loop0_phi)); |
| 590 CHECK_EQ(new_loop0_phi, FindSuccessor(new_loop0_loop, IrOpcode::kPhi)); | 590 CHECK_EQ(new_loop0_phi, FindSuccessor(new_loop0_loop, IrOpcode::kPhi)); |
| 591 | 591 |
| 592 // Check that the return returns the phi from the OSR loop and control | 592 // Check that the return returns the phi from the OSR loop and control |
| 593 // depends on the copy of the outer loop0. | 593 // depends on the copy of the outer loop0. |
| 594 CheckInputs(new_ret, new_loop0_phi, T.graph.start(), new_loop0_exit); | 594 CheckInputs(new_ret, new_loop0_phi, T.graph.start(), new_loop0_exit); |
| 595 } | 595 } |
| OLD | NEW |