6 #include <gtest/gtest.h>
13 TEST(ControlFlowRestructuringTests, AcyclicStructured)
26 bb1->add_outedge(bb2);
27 bb1->add_outedge(bb3);
28 bb2->add_outedge(bb4);
29 bb3->add_outedge(bb4);
30 bb4->add_outedge(cfg.
exit());
42 TEST(ControlFlowRestructuringTests, AcyclicUnstructured)
55 bb1->add_outedge(bb2);
56 bb1->add_outedge(bb3);
57 bb2->add_outedge(bb3);
58 bb2->add_outedge(bb4);
59 bb3->add_outedge(bb4);
60 bb4->add_outedge(cfg.
exit());
71 TEST(ControlFlowRestructuringTests, DoWhileLoop)
83 bb1->add_outedge(bb2);
84 bb2->add_outedge(bb2);
85 bb2->add_outedge(bb3);
86 bb3->add_outedge(bb1);
87 bb3->add_outedge(cfg.
exit());
97 EXPECT_EQ(bb2->OutEdge(0)->sink(), bb2);
98 EXPECT_EQ(bb3->OutEdge(0)->sink(), bb1);
101 TEST(ControlFlowRestructuringTests, WhileLoop)
112 bb1->add_outedge(cfg.
exit());
113 bb1->add_outedge(bb2);
114 bb2->add_outedge(bb1);
126 TEST(ControlFlowRestructuringTests, IrreducibleCfg)
140 bb1->add_outedge(bb2);
141 bb1->add_outedge(bb3);
142 bb2->add_outedge(bb4);
143 bb2->add_outedge(bb3);
144 bb3->add_outedge(bb2);
145 bb3->add_outedge(bb5);
146 bb4->add_outedge(cfg.
exit());
147 bb5->add_outedge(cfg.
exit());
157 TEST(ControlFlowRestructuringTests, AcyclicUnstructuredInDoWhileLoop)
170 bb1->add_outedge(bb3);
171 bb1->add_outedge(bb2);
172 bb2->add_outedge(bb3);
173 bb2->add_outedge(bb4);
174 bb3->add_outedge(bb4);
175 bb4->add_outedge(bb1);
176 bb4->add_outedge(cfg.
exit());
186 TEST(ControlFlowRestructuringTests, LorBeforeDoWhileLoop)
199 bb1->add_outedge(bb2);
200 bb1->add_outedge(bb3);
201 bb2->add_outedge(bb4);
202 bb2->add_outedge(bb3);
203 bb3->add_outedge(bb4);
204 bb4->add_outedge(cfg.
exit());
205 bb4->add_outedge(bb4);
215 TEST(ControlFlowRestructuringTests, StaticEndlessLoop)
226 bb1->add_outedge(bb2);
227 bb1->add_outedge(bb1);
228 bb1->add_outedge(cfg.
exit());
229 bb2->add_outedge(bb2);
TEST(ControlFlowRestructuringTests, AcyclicStructured)
static BasicBlock * create(ControlFlowGraph &cfg)
void divert_inedges(llvm::ControlFlowGraphNode *new_successor)
ExitNode * exit() const noexcept
size_t nnodes() const noexcept
Global memory state passed between functions.
static void RestructureBranches(ControlFlowGraphNode &entry, ControlFlowGraphNode &exit)
static void RestructureControlFlow(ControlFlowGraphNode &, ControlFlowGraphNode &, std::vector< TailControlledLoop > &)
bool is_proper_structured(const ControlFlowGraph &cfg)
size_t nnodes(const jlm::rvsdg::Region *region) noexcept