Index: test/unittests/compiler/graph-unittest.h |
diff --git a/test/unittests/compiler/graph-unittest.h b/test/unittests/compiler/graph-unittest.h |
index 7c75161d9d2c092624fe3b247d5808476594f52c..c7285a042e1509fb6bdb634aa60f2e412d813ee9 100644 |
--- a/test/unittests/compiler/graph-unittest.h |
+++ b/test/unittests/compiler/graph-unittest.h |
@@ -7,6 +7,8 @@ |
#include "src/compiler/common-operator.h" |
#include "src/compiler/graph.h" |
+#include "src/compiler/machine-operator.h" |
+#include "src/compiler/node.h" |
#include "src/compiler/typer.h" |
#include "test/unittests/test-utils.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -31,7 +33,6 @@ class GraphTest : public TestWithContext, public TestWithZone { |
explicit GraphTest(int num_parameters = 1); |
~GraphTest() OVERRIDE; |
- protected: |
Node* Parameter(int32_t index = 0); |
Node* Float32Constant(volatile float value); |
Node* Float64Constant(volatile double value); |
@@ -50,6 +51,7 @@ class GraphTest : public TestWithContext, public TestWithZone { |
Matcher<Node*> IsFalseConstant(); |
Matcher<Node*> IsTrueConstant(); |
+ Node* start() { return graph()->start(); } |
CommonOperatorBuilder* common() { return &common_; } |
Graph* graph() { return &graph_; } |
@@ -64,7 +66,6 @@ class TypedGraphTest : public GraphTest { |
explicit TypedGraphTest(int num_parameters = 1); |
~TypedGraphTest() OVERRIDE; |
- protected: |
Node* Parameter(int32_t index = 0) { return GraphTest::Parameter(index); } |
Node* Parameter(Type* type, int32_t index = 0); |
@@ -74,6 +75,76 @@ class TypedGraphTest : public GraphTest { |
Typer typer_; |
}; |
+ |
Benedikt Meurer
2015/01/15 13:16:16
Move these helpers to loop-peeling-unittest.cc. Al
titzer
2015/01/15 13:36:51
The plan is to use them in other tests, so maybe a
Benedikt Meurer
2015/01/15 13:43:09
Well this kind of goes against the purpose of Grap
titzer
2015/01/16 16:15:37
PTAL, I've made these utilities into standalone st
Benedikt Meurer
2015/01/16 17:55:36
Thanks. Now you can undo the changes to graph-unit
titzer
2015/01/19 09:47:11
Done.
|
+// A helper for building while loops. |
+struct While { |
Benedikt Meurer
2015/01/15 13:16:16
According to the style guide "structs should be us
titzer
2015/01/15 13:36:51
I'd prefer to keep these as structs to avoid acces
Benedikt Meurer
2015/01/15 13:43:09
Personally I don't like these helper structs at al
|
+ GraphTest* t; |
+ Node* branch; |
+ Node* if_true; |
+ Node* exit; |
+ Node* loop; |
+ |
+ While(GraphTest* R, Node* cond, Node* control = nullptr) : t(R) { |
+ if (control == nullptr) control = R->start(); |
+ loop = t->graph()->NewNode(t->common()->Loop(2), control, control); |
+ branch = t->graph()->NewNode(t->common()->Branch(), cond, loop); |
+ if_true = t->graph()->NewNode(t->common()->IfTrue(), branch); |
+ exit = t->graph()->NewNode(t->common()->IfFalse(), branch); |
+ loop->ReplaceInput(1, if_true); |
+ } |
+ |
+ void Chain(Node* control) { loop->ReplaceInput(0, control); } |
+ void Nest(While* that) { |
+ that->loop->ReplaceInput(1, exit); |
+ this->loop->ReplaceInput(0, that->if_true); |
+ } |
+ Node* Phi(Node* a, Node* b) { |
+ return t->graph()->NewNode(t->common()->Phi(kMachAnyTagged, 2), a, b, loop); |
+ } |
+}; |
+ |
+ |
+// A helper for building branches. |
+struct Branch { |
Benedikt Meurer
2015/01/15 13:16:16
See above.
|
+ Node* branch; |
+ Node* if_true; |
+ Node* if_false; |
+ |
+ Branch(GraphTest* R, Node* cond, Node* control = nullptr) { |
+ if (control == nullptr) control = R->start(); |
+ branch = R->graph()->NewNode(R->common()->Branch(), cond, control); |
+ if_true = R->graph()->NewNode(R->common()->IfTrue(), branch); |
+ if_false = R->graph()->NewNode(R->common()->IfFalse(), branch); |
+ } |
+}; |
+ |
+ |
+// A helper for building counters attached to loops. |
+struct Counter { |
Benedikt Meurer
2015/01/15 13:16:16
See above.
|
+ Node* base; |
+ Node* inc; |
+ Node* phi; |
+ Node* add; |
+ |
+ Counter(While& w, MachineOperatorBuilder* machine, int32_t b, int32_t k) |
Benedikt Meurer
2015/01/15 13:16:16
According to the google style guide: All parameter
titzer
2015/01/15 13:36:51
Done.
|
+ : base(w.t->Int32Constant(b)), inc(w.t->Int32Constant(k)) { |
+ Build(w, machine); |
+ } |
+ |
+ Counter(While& w, MachineOperatorBuilder* machine, Node* b, Node* k) |
Benedikt Meurer
2015/01/15 13:16:16
According to the google style guide: All parameter
titzer
2015/01/15 13:36:51
Done.
|
+ : base(b), inc(k) { |
+ Build(w, machine); |
+ } |
+ |
+ void Build(While& w, MachineOperatorBuilder* machine) { |
Benedikt Meurer
2015/01/15 13:16:16
According to the google style guide: All parameter
titzer
2015/01/15 13:36:51
Done.
|
+ phi = w.t->graph()->NewNode(w.t->common()->Phi(kMachAnyTagged, 2), base, |
+ base, w.loop); |
+ add = w.t->graph()->NewNode(machine->Int32Add(), phi, inc); |
+ phi->ReplaceInput(1, add); |
+ } |
+}; |
+ |
+ |
} // namespace compiler |
} // namespace internal |
} // namespace v8 |