6 #include <gtest/gtest.h>
21 TEST(TraceTests, TestTraceOutputIntraProcedural_Gamma)
35 auto entryVar1 = gammaNode->AddEntryVar(&i1);
36 auto entryVar1Copy = gammaNode->AddEntryVar(&i1);
37 auto entryVar2 = gammaNode->AddEntryVar(&i2);
40 gammaNode->subregion(1),
41 { entryVar2.branchArgument[1] },
45 gammaNode->AddExitVar({ entryVar1.branchArgument[0], entryVar1Copy.branchArgument[1] });
47 gammaNode->AddExitVar({ entryVar1.branchArgument[0], entryVar2.branchArgument[1] });
48 auto exitVar2 = gammaNode->AddExitVar({ entryVar2.branchArgument[0], node->output(0) });
65 EXPECT_EQ(&tracedX0, &i1);
66 EXPECT_EQ(&tracedX1, x1.origin());
67 EXPECT_EQ(&tracedX2, x2.origin());
68 EXPECT_EQ(&traceGammaEntry, &i1);
69 EXPECT_EQ(&tracedNodeInput, &i2);
75 TEST(TraceTests, TestTraceOutputIntraProcedural_Theta)
88 auto loopVar0 = thetaNode->AddLoopVar(&i0);
89 auto loopVar1 = thetaNode->AddLoopVar(&i1);
92 loopVar1.post->divert_to(node->output(0));
107 EXPECT_EQ(&tracedX0, &i0);
108 EXPECT_EQ(&tracedX1, x1.origin());
109 EXPECT_EQ(&traceLoopVar0Pre, &i0);
110 EXPECT_EQ(&traceLoopVar1Pre, loopVar1.pre);
111 EXPECT_EQ(&tracedNodeInput, loopVar1.pre);
117 TEST(TraceTests, TestTraceNestedStructuralNodes)
132 auto loopVar0 = thetaNode->AddLoopVar(&i0);
133 auto loopVar1 = thetaNode->AddLoopVar(&i1);
134 auto loopVar2 = thetaNode->AddLoopVar(&i2);
138 jlm::rvsdg::CreateOpNode<TestNullaryOperation>(*thetaNode->subregion(), controlType);
140 auto entryVar0 = gammaNode->AddEntryVar(loopVar0.pre);
141 auto entryVar1 = gammaNode->AddEntryVar(loopVar1.pre);
143 gammaNode->AddExitVar({ entryVar0.branchArgument[0], entryVar0.branchArgument[1] });
145 gammaNode->AddExitVar({ entryVar1.branchArgument[0], entryVar1.branchArgument[1] });
149 loopVar0.post->divert_to(exitVar0.output);
150 loopVar1.post->divert_to(exitVar0.output);
171 EXPECT_EQ(&tracedX0, &i0);
172 EXPECT_EQ(&tracedX1, loopVar1.output);
173 EXPECT_EQ(&tracedX2, &i2);
174 EXPECT_EQ(&traceExitVar0, &i0);
175 EXPECT_EQ(&traceExitVar1, loopVar1.pre);
176 EXPECT_EQ(&traceBranchArgument0, &i0);
177 EXPECT_EQ(&traceBranchArgument1, loopVar1.pre);
178 EXPECT_EQ(&traceLoopVar0Pre, &i0);
179 EXPECT_EQ(&traceLoopVar1Pre, loopVar1.pre);
180 EXPECT_EQ(&traceLoopVar2Pre, &i2);
186 constexpr
bool enableCaching =
false;
190 const auto & tracedX0 = shallowTracer.
trace(*x0.origin());
191 const auto & tracedX1 = shallowTracer.
trace(*x1.origin());
192 const auto & tracedX2 = shallowTracer.
trace(*x2.origin());
193 const auto & traceExitVar0 = shallowTracer.
trace(*exitVar0.output);
194 const auto & traceExitVar1 = shallowTracer.
trace(*exitVar1.output);
195 const auto & traceBranchArgument0 = shallowTracer.
trace(*entryVar0.branchArgument[0]);
196 const auto & traceBranchArgument1 = shallowTracer.
trace(*entryVar1.branchArgument[1]);
197 const auto & traceLoopVar0Pre = shallowTracer.
trace(*loopVar0.pre);
198 const auto & traceLoopVar1Pre = shallowTracer.
trace(*loopVar1.pre);
199 const auto & traceLoopVar2Pre = shallowTracer.
trace(*loopVar2.pre);
201 EXPECT_EQ(&tracedX0, loopVar0.output);
202 EXPECT_EQ(&tracedX1, loopVar1.output);
203 EXPECT_EQ(&tracedX2, &i2);
204 EXPECT_EQ(&traceExitVar0, loopVar0.pre);
205 EXPECT_EQ(&traceExitVar1, loopVar1.pre);
206 EXPECT_EQ(&traceBranchArgument0, loopVar0.pre);
207 EXPECT_EQ(&traceBranchArgument1, loopVar1.pre);
208 EXPECT_EQ(&traceLoopVar0Pre, loopVar0.pre);
209 EXPECT_EQ(&traceLoopVar1Pre, loopVar1.pre);
210 EXPECT_EQ(&traceLoopVar2Pre, &i2);
219 TEST(TraceTests, TestIndirectLoopInvariantOutput)
248 auto invariantLoopVar = thetaNode->AddLoopVar(&c20);
249 auto indirectLoopVar = thetaNode->AddLoopVar(&c40);
255 indirectLoopVar.post->divert_to(invariantLoopVar.pre);
269 EXPECT_EQ(&tracedUser1, indirectLoopVar.pre);
270 EXPECT_EQ(&tracedUser2, &c20);
277 TEST(TraceTests, TestIndirectLoopInvariance)
305 auto invariantLoopVar = thetaNode->AddLoopVar(&c20);
306 auto indirectLoopVar = thetaNode->AddLoopVar(&c20);
312 indirectLoopVar.post->divert_to(invariantLoopVar.pre);
326 EXPECT_EQ(&tracedUser1, &c20);
327 EXPECT_EQ(&tracedUser2, &c20);
330 TEST(TraceTests, GammaCachingTest)
345 auto i1EntryVar = gammaNode->AddEntryVar(&i1);
346 auto i2EntryVar = gammaNode->AddEntryVar(&i2);
349 gammaNode->AddExitVar({ i1EntryVar.branchArgument[0], i1EntryVar.branchArgument[1] });
353 constexpr
bool enableCaching =
true;
358 auto traceResult = &tracer.
trace(*graphExport.origin());
359 assert(traceResult == &i1);
362 exitVar.branchResult[0]->divert_to(i2EntryVar.branchArgument[0]);
363 exitVar.branchResult[1]->divert_to(i2EntryVar.branchArgument[1]);
367 traceResult = &tracer.
trace(*graphExport.origin());
368 assert(traceResult == &i1);
372 traceResult = &tracer.
trace(*graphExport.origin());
373 assert(traceResult == &i2);
376 TEST(TraceTests, ThetaCachingTest)
390 auto loopVar1 = thetaNode->AddLoopVar(&i1);
391 auto loopVar2 = thetaNode->AddLoopVar(&i2);
395 constexpr
bool enableCaching =
true;
400 auto traceResult = &tracer.
trace(*graphExport.origin());
401 assert(traceResult == &i1);
404 loopVar1.post->divert_to(loopVar2.pre);
405 loopVar2.post->divert_to(loopVar1.pre);
409 traceResult = &tracer.
trace(*graphExport.origin());
410 assert(traceResult == &i1);
414 traceResult = &tracer.
trace(*graphExport.origin());
415 assert(traceResult == loopVar1.output);
static Output & create(Region ®ion, BitValueRepresentation value)
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
static GammaNode * create(jlm::rvsdg::Output *predicate, size_t nalternatives)
static GraphExport & Create(Output &origin, std::string name)
static GraphImport & Create(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
Region & GetRootRegion() const noexcept
void setTraceThroughStructuralNodes(bool value) noexcept
Output & trace(Output &output)
static SimpleNode * createNode(Region *region, const std::vector< Output * > &operands, std::vector< std::shared_ptr< const Type >> resultTypes)
static std::shared_ptr< const TestType > createValueType()
static ThetaNode * create(rvsdg::Region *parent)
TEST(TraceTests, testTracingIOBarrier)
static bool ThetaLoopVarIsInvariant(const ThetaNode::LoopVar &loopVar) noexcept
std::string view(const rvsdg::Region *region)
Output & traceOutputIntraProcedurally(Output &output)