codon/test/cir/analyze/dominator.cpp

55 lines
1.4 KiB
C++
Raw Normal View History

2021-09-28 02:02:44 +08:00
#include "test.h"
#include "codon/cir/analyze/dataflow/cfg.h"
#include "codon/cir/analyze/dataflow/dominator.h"
2021-09-28 02:02:44 +08:00
using namespace codon::ir;
2021-09-28 02:02:44 +08:00
TEST_F(CIRCoreTest, DominatorAnalysisSimple) {
2021-09-28 02:02:44 +08:00
auto *f = module->Nr<BodiedFunc>("test_f");
auto *b = module->Nr<SeriesFlow>();
f->setBody(b);
auto *v = module->Nr<Var>(module->getIntType());
f->push_back(v);
auto *start = module->getBool(false);
auto *end = module->getBool(false);
b->push_back(start);
b->push_back(end);
auto c = analyze::dataflow::buildCFGraph(f);
analyze::dataflow::DominatorInspector dom(c.get());
dom.analyze();
ASSERT_TRUE(dom.isDominated(end, start));
ASSERT_FALSE(dom.isDominated(start, end));
}
TEST_F(CIRCoreTest, DominatorAnalysisTernary) {
2021-09-28 02:02:44 +08:00
auto *f = module->Nr<BodiedFunc>("test_f");
auto *b = module->Nr<SeriesFlow>();
f->setBody(b);
auto *v = module->Nr<Var>(module->getIntType());
f->push_back(v);
auto *start = module->getBool(false);
auto *middle = module->getBool(false);
auto *end =
module->Nr<TernaryInstr>(module->getBool(true), middle, module->getBool(true));
b->push_back(start);
b->push_back(end);
auto c = analyze::dataflow::buildCFGraph(f);
analyze::dataflow::DominatorInspector dom(c.get());
dom.analyze();
ASSERT_TRUE(dom.isDominated(end, start));
ASSERT_TRUE(dom.isDominated(middle, start));
ASSERT_FALSE(dom.isDominated(start, end));
ASSERT_FALSE(dom.isDominated(end, middle));
}