16TEST(AnnotationTests, TestBasicBlockAnnotation)
26 auto v0 =
module.create_variable(vt, "v0");
29 bb.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { v0 }));
32 bb.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { v1 }));
35 auto root = BasicBlockAggregationNode::create(std::move(bb));
37 return std::make_tuple(std::move(root), v0, v1, v2);
41 auto [aggregationTreeRoot, v0, v1, v2] = SetupAggregationTree(module);
46 auto demandMap = Annotate(*aggregationTreeRoot);
47 print(*aggregationTreeRoot, *demandMap, stdout);
57TEST(AnnotationTests, TestLinearSubgraphAnnotation)
71 bb1.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { &argument }));
74 bb2.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { v1 }));
77 auto entryNode = EntryAggregationNode::create({ &argument });
78 auto basicBlockNode1 = BasicBlockAggregationNode::create(std::move(bb1));
79 auto basicBlockNode2 = BasicBlockAggregationNode::create(std::move(bb2));
80 auto exitNode = ExitAggregationNode::create({ v2 });
83 LinearAggregationNode::create(std::move(entryNode), std::move(basicBlockNode1));
85 LinearAggregationNode::create(std::move(basicBlockNode2), std::move(exitNode));
87 auto root = LinearAggregationNode::create(std::move(linearNode1), std::move(linearNode2));
89 return std::make_tuple(std::move(root), v1, v2);
94 auto [aggregationTreeRoot, v1, v2] = SetupAggregationTree(module, argument);
99 auto demandMap = Annotate(*aggregationTreeRoot);
100 print(*aggregationTreeRoot, *demandMap, stdout);
109 auto linearNode1 = aggregationTreeRoot->child(0);
114 auto entryNode = linearNode1->child(0);
119 auto basicBlockNode1 = linearNode1->child(1);
125 auto linearNode2 = aggregationTreeRoot->child(1);
130 auto basicBlockNode2 = linearNode2->child(0);
135 auto exitNode = linearNode2->child(1);
141TEST(AnnotationTests, TestBranchAnnotation)
154 auto argument =
module.create_variable(vt, "arg");
155 auto v3 =
module.create_variable(vt, "v3");
159 ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { argument }));
162 bb2.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { v1 }));
165 bb1.
append_last(AssignmentOperation::create(v2, v3));
166 bb2.
append_last(AssignmentOperation::create(v1, v3));
167 bb2.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { v3 }));
170 auto basicBlockSplit = BasicBlockAggregationNode::create(std::move(splitTacList));
171 auto basicBlock1 = BasicBlockAggregationNode::create(std::move(bb1));
172 auto basicBlock2 = BasicBlockAggregationNode::create(std::move(bb2));
174 auto branch = BranchAggregationNode::create();
175 branch->add_child(std::move(basicBlock1));
176 branch->add_child(std::move(basicBlock2));
178 auto root = LinearAggregationNode::create(std::move(basicBlockSplit), std::move(branch));
180 return std::make_tuple(std::move(root), argument, v1, v2, v3, v4);
187 auto [aggregationTreeRoot, argument, v1, v2, v3, v4] = SetupAggregationTree(module);
192 auto demandMap = Annotate(*aggregationTreeRoot);
193 print(*aggregationTreeRoot, *demandMap, stdout);
202 auto splitNode = aggregationTreeRoot->child(0);
207 auto branchNode = aggregationTreeRoot->child(1);
212 auto basicBlockNode1 = branchNode->child(0);
217 auto basicBlockNode2 = branchNode->child(1);
225TEST(AnnotationTests, TestLoopAnnotation)
235 auto v1 =
module.create_variable(vt, "v1");
236 auto v4 =
module.create_variable(vt, "v4");
239 bb.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { v1 }));
242 bb.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { v2 }));
245 auto exitNode = ExitAggregationNode::create({ v3, v4 });
246 auto basicBlockNode = BasicBlockAggregationNode::create(std::move(bb));
248 auto loopNode = LoopAggregationNode::create(std::move(basicBlockNode));
249 auto root = LinearAggregationNode::create(std::move(loopNode), std::move(exitNode));
251 return std::make_tuple(std::move(root), v1, v2, v3, v4);
255 auto [aggregationTreeRoot, v1, v2, v3, v4] = SetupAggregationTree(module);
260 auto demandMap = Annotate(*aggregationTreeRoot);
261 print(*aggregationTreeRoot, *demandMap, stdout);
270 auto loopNode = aggregationTreeRoot->child(0);
275 auto basicBlockNode = loopNode->child(0);
281 auto exitNode = aggregationTreeRoot->child(1);
288TEST(AnnotationTests, TestBranchInLoopAnnotation)
298 auto v1 =
module.create_variable(vt, "v1");
299 auto v3 =
module.create_variable(vt, "v3");
302 tl_cb1.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { v1 }));
305 tl_cb1.
append_last(AssignmentOperation::create(v1, v3));
306 tl_cb1.
append_last(ThreeAddressCode::create(TestOperation::create({
vt }, {
vt }), { v1 }));
309 tl_cb2.
append_last(AssignmentOperation::create(v1, v3));
310 tl_cb2.
append_last(AssignmentOperation::create(v4, v3));
312 auto exitNode = ExitAggregationNode::create({ v2, v3 });
314 auto basicBlock1 = BasicBlockAggregationNode::create(std::move(tl_cb1));
315 auto basicBlock2 = BasicBlockAggregationNode::create(std::move(tl_cb2));
317 auto branchNode = BranchAggregationNode::create();
318 branchNode->add_child(std::move(basicBlock1));
319 branchNode->add_child(std::move(basicBlock2));
321 auto loopNode = LoopAggregationNode::create(std::move(branchNode));
323 auto root = LinearAggregationNode::create(std::move(loopNode), std::move(exitNode));
325 return std::make_tuple(std::move(root), v1, v2, v3, v4);
329 auto [aggregationTreeRoot, v1, v2, v3, v4] = SetupAggregationTree(module);
334 auto demandMap = Annotate(*aggregationTreeRoot);
335 print(*aggregationTreeRoot, *demandMap, stdout);
344 auto loopNode = aggregationTreeRoot->child(0);
349 auto branchNode = loopNode->child(0);
352 BranchAnnotationSet({ v1, v4 }, { v2, v3, v4 }, { v3 }, { v1, v2, v4 }, { v2, v3, v4 }));
354 auto basicBlockNode1 = branchNode->child(0);
359 auto basicBlockNode2 = branchNode->child(1);
366 auto exitNode = aggregationTreeRoot->child(1);
373TEST(AnnotationTests, TestAssignmentAnnotation)
382 auto v1 =
module.create_variable(vt, "v1");
383 auto v2 =
module.create_variable(vt, "v2");
386 bb.
append_last(AssignmentOperation::create(v1, v2));
388 auto root = BasicBlockAggregationNode::create(std::move(bb));
390 return std::make_tuple(std::move(root), v1, v2);
394 auto [aggregationTreeRoot, v1, v2] = SetupAggregationTree(module);
399 auto demandMap = Annotate(*aggregationTreeRoot);
400 print(*aggregationTreeRoot, *demandMap, stdout);
410TEST(AnnotationTests, TestBranchPassByAnnotation)
420 auto v3 =
module.create_variable(vt, "v3");
423 tlsplit.
append_last(ThreeAddressCode::create(TestOperation::create({}, {
vt }), {}));
426 tlsplit.
append_last(ThreeAddressCode::create(TestOperation::create({}, {
vt }), {}));
429 tlb1.
append_last(AssignmentOperation::create(v1, v2));
430 tlb1.
append_last(AssignmentOperation::create(v1, v3));
431 tlb2.
append_last(AssignmentOperation::create(v1, v3));
433 auto splitNode = BasicBlockAggregationNode::create(std::move(tlsplit));
435 auto basicBlockNode1 = BasicBlockAggregationNode::create(std::move(tlb1));
436 auto basicBlockNode2 = BasicBlockAggregationNode::create(std::move(tlb2));
438 auto branchNode = BranchAggregationNode::create();
439 branchNode->add_child(std::move(basicBlockNode1));
440 branchNode->add_child(std::move(basicBlockNode2));
442 auto joinNode = BasicBlockAggregationNode::create();
444 auto exitNode = ExitAggregationNode::create({ v1, v2, v3 });
446 auto root = LinearAggregationNode::create(std::move(splitNode), std::move(branchNode));
447 root->add_child(std::move(joinNode));
448 root->add_child(std::move(exitNode));
450 return std::make_tuple(std::move(root), v1, v2, v3);
454 auto [aggregationTreeRoot, v1, v2, v3] = SetupAggregationTree(module);
459 auto demandMap = Annotate(*aggregationTreeRoot);
460 print(*aggregationTreeRoot, *demandMap, stdout);
469 auto splitNode = aggregationTreeRoot->child(0);
474 auto branchNode = aggregationTreeRoot->child(1);
479 auto basicBlockNode1 = branchNode->child(0);
484 auto basicBlockNode2 = branchNode->child(1);
490 auto joinNode = aggregationTreeRoot->child(2);
495 auto exitNode = aggregationTreeRoot->child(3);