| Index: test/unittests/compiler/control-flow-optimizer-unittest.cc
|
| diff --git a/test/unittests/compiler/control-flow-optimizer-unittest.cc b/test/unittests/compiler/control-flow-optimizer-unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c083d4bab5c62afd6c2e23e7f2c659a3e69bf10e
|
| --- /dev/null
|
| +++ b/test/unittests/compiler/control-flow-optimizer-unittest.cc
|
| @@ -0,0 +1,70 @@
|
| +// Copyright 2015 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "src/compiler/control-flow-optimizer.h"
|
| +#include "src/compiler/js-graph.h"
|
| +#include "src/compiler/js-operator.h"
|
| +#include "src/compiler/machine-operator.h"
|
| +#include "test/unittests/compiler/graph-unittest.h"
|
| +#include "test/unittests/compiler/node-test-utils.h"
|
| +#include "testing/gmock-support.h"
|
| +
|
| +using testing::AllOf;
|
| +using testing::Capture;
|
| +using testing::CaptureEq;
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +namespace compiler {
|
| +
|
| +class ControlFlowOptimizerTest : public GraphTest {
|
| + public:
|
| + explicit ControlFlowOptimizerTest(int num_parameters = 3)
|
| + : GraphTest(num_parameters), machine_(zone()) {}
|
| + ~ControlFlowOptimizerTest() OVERRIDE {}
|
| +
|
| + protected:
|
| + void Optimize() {
|
| + JSOperatorBuilder javascript(zone());
|
| + JSGraph jsgraph(isolate(), graph(), common(), &javascript, machine());
|
| + ControlFlowOptimizer optimizer(&jsgraph, zone());
|
| + optimizer.Optimize();
|
| + }
|
| +
|
| + MachineOperatorBuilder* machine() { return &machine_; }
|
| +
|
| + private:
|
| + MachineOperatorBuilder machine_;
|
| +};
|
| +
|
| +
|
| +TEST_F(ControlFlowOptimizerTest, Switch) {
|
| + Node* index = Parameter(0);
|
| + Node* branch0 = graph()->NewNode(
|
| + common()->Branch(),
|
| + graph()->NewNode(machine()->Word32Equal(), index, Int32Constant(0)),
|
| + start());
|
| + Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0);
|
| + Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0);
|
| + Node* branch1 = graph()->NewNode(
|
| + common()->Branch(),
|
| + graph()->NewNode(machine()->Word32Equal(), index, Int32Constant(1)),
|
| + if_false0);
|
| + Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
|
| + Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
|
| + Node* merge =
|
| + graph()->NewNode(common()->Merge(3), if_true0, if_true1, if_false1);
|
| + graph()->SetEnd(graph()->NewNode(common()->End(), merge));
|
| + Optimize();
|
| + Capture<Node*> switch_capture;
|
| + EXPECT_THAT(end(),
|
| + IsEnd(IsMerge(IsIfValue(0, CaptureEq(&switch_capture)),
|
| + IsIfValue(1, CaptureEq(&switch_capture)),
|
| + IsIfDefault(AllOf(CaptureEq(&switch_capture),
|
| + IsSwitch(index, start()))))));
|
| +}
|
| +
|
| +} // namespace compiler
|
| +} // namespace internal
|
| +} // namespace v8
|
|
|