| Index: test/unittests/compiler/effect-control-linearizer-unittest.cc
|
| diff --git a/test/unittests/compiler/effect-control-linearizer-unittest.cc b/test/unittests/compiler/effect-control-linearizer-unittest.cc
|
| index f33a1ba9ad9d956f7de77db600577cd550b98621..71a8696d092aebeb1a8d1e66538e6195493ff8bf 100644
|
| --- a/test/unittests/compiler/effect-control-linearizer-unittest.cc
|
| +++ b/test/unittests/compiler/effect-control-linearizer-unittest.cc
|
| @@ -12,12 +12,15 @@
|
| #include "test/unittests/compiler/graph-unittest.h"
|
| #include "test/unittests/compiler/node-test-utils.h"
|
| #include "test/unittests/test-utils.h"
|
| +#include "testing/gmock-support.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| namespace compiler {
|
|
|
| +using testing::Capture;
|
| +
|
| class EffectControlLinearizerTest : public TypedGraphTest {
|
| public:
|
| EffectControlLinearizerTest()
|
| @@ -323,6 +326,74 @@ TEST_F(EffectControlLinearizerTest, LoopLoad) {
|
| heap_number, effect_phi, loop));
|
| }
|
|
|
| +TEST_F(EffectControlLinearizerTest, CloneBranch) {
|
| + Schedule schedule(zone());
|
| +
|
| + Node* cond0 = Parameter(0);
|
| + Node* cond1 = Parameter(1);
|
| + Node* cond2 = Parameter(2);
|
| + Node* branch0 = graph()->NewNode(common()->Branch(), cond0, start());
|
| + Node* control1 = graph()->NewNode(common()->IfTrue(), branch0);
|
| + Node* control2 = graph()->NewNode(common()->IfFalse(), branch0);
|
| + Node* merge0 = graph()->NewNode(common()->Merge(2), control1, control2);
|
| + Node* phi0 = graph()->NewNode(common()->Phi(MachineRepresentation::kBit, 2),
|
| + cond1, cond2, merge0);
|
| + Node* branch = graph()->NewNode(common()->Branch(), phi0, merge0);
|
| + Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
|
| + Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
|
| + Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
|
| + graph()->SetEnd(graph()->NewNode(common()->End(1), merge));
|
| +
|
| + BasicBlock* start = schedule.start();
|
| + schedule.rpo_order()->push_back(start);
|
| + start->set_rpo_number(0);
|
| +
|
| + BasicBlock* f1block = AddBlockToSchedule(&schedule);
|
| + BasicBlock* t1block = AddBlockToSchedule(&schedule);
|
| + BasicBlock* bblock = AddBlockToSchedule(&schedule);
|
| +
|
| + BasicBlock* f2block = AddBlockToSchedule(&schedule);
|
| + BasicBlock* t2block = AddBlockToSchedule(&schedule);
|
| + BasicBlock* mblock = AddBlockToSchedule(&schedule);
|
| +
|
| + // Populate the basic blocks with nodes.
|
| + schedule.AddNode(start, graph()->start());
|
| +
|
| + schedule.AddBranch(start, branch0, t1block, f1block);
|
| +
|
| + schedule.AddNode(t1block, control1);
|
| + schedule.AddGoto(t1block, bblock);
|
| +
|
| + schedule.AddNode(f1block, control2);
|
| + schedule.AddGoto(f1block, bblock);
|
| +
|
| + schedule.AddNode(bblock, merge0);
|
| + schedule.AddNode(bblock, phi0);
|
| + schedule.AddBranch(bblock, branch, t2block, f2block);
|
| +
|
| + schedule.AddNode(t2block, if_true);
|
| + schedule.AddGoto(t2block, mblock);
|
| +
|
| + schedule.AddNode(f2block, if_false);
|
| + schedule.AddGoto(f2block, mblock);
|
| +
|
| + schedule.AddNode(mblock, merge);
|
| + schedule.AddNode(mblock, graph()->end());
|
| +
|
| + EffectControlLinearizer introducer(jsgraph(), &schedule, zone());
|
| + introducer.Run();
|
| +
|
| + Capture<Node *> branch1_capture, branch2_capture;
|
| + EXPECT_THAT(
|
| + end(),
|
| + IsEnd(IsMerge(IsMerge(IsIfTrue(CaptureEq(&branch1_capture)),
|
| + IsIfTrue(CaptureEq(&branch2_capture))),
|
| + IsMerge(IsIfFalse(AllOf(CaptureEq(&branch1_capture),
|
| + IsBranch(cond1, control1))),
|
| + IsIfFalse(AllOf(CaptureEq(&branch2_capture),
|
| + IsBranch(cond2, control2)))))));
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|