Jlm
CfgOrderingsTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2018 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #include <gtest/gtest.h>
7 
8 #include <jlm/llvm/ir/cfg.hpp>
10 
11 TEST(ControlFlowGraphOrderTests, test)
12 {
13  using namespace jlm::llvm;
14 
15  // Arrange
17 
18  ControlFlowGraph cfg(im);
19  auto bb0 = BasicBlock::create(cfg);
20  auto bb1 = BasicBlock::create(cfg);
21  auto bb2 = BasicBlock::create(cfg);
22  auto bb3 = BasicBlock::create(cfg);
23 
24  cfg.exit()->divert_inedges(bb0);
25  bb0->add_outedge(bb1);
26  bb0->add_outedge(bb2);
27  bb1->add_outedge(bb3);
28  bb2->add_outedge(bb3);
29  bb3->add_outedge(cfg.exit());
30 
31  // check orderings
32  std::vector<ControlFlowGraphNode *> po1({ cfg.exit(), bb3, bb2, bb1, bb0, cfg.entry() });
33  std::vector<ControlFlowGraphNode *> po2({ cfg.exit(), bb3, bb1, bb2, bb0, cfg.entry() });
34  EXPECT_TRUE(postorder(cfg) == po1 || postorder(cfg) == po2);
35 
36  std::vector<ControlFlowGraphNode *> rpo1({ cfg.entry(), bb0, bb1, bb2, bb3, cfg.exit() });
37  std::vector<ControlFlowGraphNode *> rpo2({ cfg.entry(), bb0, bb2, bb1, bb3, cfg.exit() });
38  EXPECT_TRUE(reverse_postorder(cfg) == rpo1 || reverse_postorder(cfg) == rpo2);
39 }
TEST(ControlFlowGraphOrderTests, test)
static BasicBlock * create(ControlFlowGraph &cfg)
Definition: basic-block.cpp:37
void divert_inedges(llvm::ControlFlowGraphNode *new_successor)
Definition: cfg-node.hpp:171
EntryNode * entry() const noexcept
Definition: cfg.hpp:206
ExitNode * exit() const noexcept
Definition: cfg.hpp:212
Global memory state passed between functions.
std::vector< ControlFlowGraphNode * > postorder(const ControlFlowGraph &cfg)
Definition: cfg.cpp:283
std::vector< ControlFlowGraphNode * > reverse_postorder(const ControlFlowGraph &cfg)
Definition: cfg.cpp:314