16TEST(ControlFlowRestructuringTests, AcyclicStructured)
23 auto bb1 = BasicBlock::create(cfg);
24 auto bb2 = BasicBlock::create(cfg);
25 auto bb3 = BasicBlock::create(cfg);
26 auto bb4 = BasicBlock::create(cfg);
29 bb1->add_outedge(bb2);
30 bb1->add_outedge(bb3);
31 bb2->add_outedge(bb4);
32 bb3->add_outedge(bb4);
33 bb4->add_outedge(cfg.
exit());
37 size_t nnodes = cfg.
nnodes();
38 RestructureBranches(cfg);
42 EXPECT_EQ(nnodes, cfg.
nnodes());
45TEST(ControlFlowRestructuringTests, AcyclicUnstructured)
52 auto bb1 = BasicBlock::create(cfg);
53 auto bb2 = BasicBlock::create(cfg);
54 auto bb3 = BasicBlock::create(cfg);
55 auto bb4 = BasicBlock::create(cfg);
58 bb1->add_outedge(bb2);
59 bb1->add_outedge(bb3);
60 bb2->add_outedge(bb3);
61 bb2->add_outedge(bb4);
62 bb3->add_outedge(bb4);
63 bb4->add_outedge(cfg.
exit());
67 RestructureBranches(cfg);
71 EXPECT_TRUE(is_proper_structured(cfg));
74TEST(ControlFlowRestructuringTests, NestedDoWhileLoop)
81 auto bb1 = BasicBlock::create(cfg);
82 auto bb2 = BasicBlock::create(cfg);
83 auto bb3 = BasicBlock::create(cfg);
86 bb1->add_outedge(bb2);
88 bb2->add_outedge(bb3);
89 bb2->add_outedge(bb2);
91 bb3->add_outedge(cfg.
exit());
92 bb3->add_outedge(bb1);
96 const size_t numNodesBeforeRestructuring = cfg.
nnodes();
97 RestructureControlFlow(cfg);
101 EXPECT_EQ(cfg.
nnodes(), numNodesBeforeRestructuring);
102 EXPECT_EQ(bb2->OutEdge(0)->sink(), bb3);
103 EXPECT_EQ(bb2->OutEdge(1)->sink(), bb2);
104 EXPECT_EQ(bb3->OutEdge(0)->sink(), cfg.
exit());
105 EXPECT_EQ(bb3->OutEdge(1)->sink(), bb1);
108TEST(ControlFlowRestructuringTests, DoWhileLoopWithWrongRepetitionEdge)
117 auto bb1 = BasicBlock::create(cfg);
120 bb1->add_outedge(bb1);
121 bb1->add_outedge(cfg.
exit());
124 bb1->append_last(ThreeAddressCode::create(std::move(c1Operation), {}));
125 auto matchOperation = std::unique_ptr<MatchOperation>(
new MatchOperation(1, { { 1, 1 } }, 0, 2));
127 ThreeAddressCode::create(std::move(matchOperation), { bb1->tacs().last()->result(0) }));
128 bb1->append_last(BranchOperation::create(2, bb1->tacs().last()->result(0)));
131 const size_t numNodesBeforeRestructuring = cfg.
nnodes();
132 RestructureControlFlow(cfg);
135 EXPECT_EQ(numNodesBeforeRestructuring, cfg.
nnodes());
136 EXPECT_EQ(bb1->OutEdge(0)->sink(), cfg.
exit());
137 EXPECT_EQ(bb1->OutEdge(1)->sink(), bb1);
139 auto matchTac = *std::next(bb1->tacs().rbegin(), 1);
140 auto newMatchOperation = jlm::util::assertedCast<const MatchOperation>(&matchTac->operation());
141 EXPECT_EQ(newMatchOperation->nalternatives(), 2u);
142 EXPECT_EQ(newMatchOperation->default_alternative(), 1u);
143 EXPECT_EQ(newMatchOperation->begin()->first, 1u);
144 EXPECT_EQ(newMatchOperation->begin()->second, 0u);
172TEST(ControlFlowRestructuringTests, IrreducibleCfg)
179 auto bb1 = BasicBlock::create(cfg);
180 auto bb2 = BasicBlock::create(cfg);
181 auto bb3 = BasicBlock::create(cfg);
182 auto bb4 = BasicBlock::create(cfg);
183 auto bb5 = BasicBlock::create(cfg);
186 bb1->add_outedge(bb2);
187 bb1->add_outedge(bb3);
188 bb2->add_outedge(bb4);
189 bb2->add_outedge(bb3);
190 bb3->add_outedge(bb2);
191 bb3->add_outedge(bb5);
192 bb4->add_outedge(cfg.
exit());
193 bb5->add_outedge(cfg.
exit());
197 RestructureControlFlow(cfg);
200 EXPECT_TRUE(is_proper_structured(cfg));
203TEST(ControlFlowRestructuringTests, AcyclicUnstructuredInDoWhileLoop)
210 auto bb1 = BasicBlock::create(cfg);
211 auto bb2 = BasicBlock::create(cfg);
212 auto bb3 = BasicBlock::create(cfg);
213 auto bb4 = BasicBlock::create(cfg);
216 bb1->add_outedge(bb3);
217 bb1->add_outedge(bb2);
218 bb2->add_outedge(bb3);
219 bb2->add_outedge(bb4);
220 bb3->add_outedge(bb4);
221 bb4->add_outedge(cfg.
exit());
222 bb4->add_outedge(bb1);
226 RestructureControlFlow(cfg);
229 EXPECT_TRUE(is_proper_structured(cfg));
232TEST(ControlFlowRestructuringTests, LorBeforeDoWhileLoop)
239 auto bb1 = BasicBlock::create(cfg);
240 auto bb2 = BasicBlock::create(cfg);
241 auto bb3 = BasicBlock::create(cfg);
242 auto bb4 = BasicBlock::create(cfg);
245 bb1->add_outedge(bb2);
246 bb1->add_outedge(bb3);
247 bb2->add_outedge(bb4);
248 bb2->add_outedge(bb3);
249 bb3->add_outedge(bb4);
250 bb4->add_outedge(cfg.
exit());
251 bb4->add_outedge(bb4);
255 RestructureControlFlow(cfg);
258 EXPECT_TRUE(is_proper_structured(cfg));