#include "test.h" #include "sir/transform/manager.h" #include "sir/transform/pass.h" using namespace seq::ir; std::string ANALYSIS_KEY = "**test_analysis**"; std::string PASS_KEY = "**test_pass**"; class DummyResult : public analyze::Result {}; class DummyAnalysis : public analyze::Analysis { private: int &counter; public: static int runCounter; explicit DummyAnalysis(int &counter) : counter(counter) {} std::string getKey() const override { return ANALYSIS_KEY; } std::unique_ptr run(const Module *) override { runCounter = counter++; return std::make_unique(); } }; int DummyAnalysis::runCounter = 0; class DummyPass : public transform::Pass { private: int &counter; std::string required; public: static int runCounter; explicit DummyPass(int &counter, std::string required) : counter(counter), required(std::move(required)) {} std::string getKey() const override { return PASS_KEY; } void run(Module *) override { runCounter = counter++; ASSERT_TRUE(getAnalysisResult(required)); } }; int DummyPass::runCounter = 0; TEST_F(SIRCoreTest, PassManagerNoInvalidations) { int counter = 0; auto manager = std::make_unique(transform::PassManager::Init::EMPTY); manager->registerAnalysis(std::make_unique(counter)); manager->registerPass(std::make_unique(counter, ANALYSIS_KEY), "", {ANALYSIS_KEY}); manager->run(module.get()); ASSERT_EQ(0, DummyAnalysis::runCounter); ASSERT_EQ(1, DummyPass::runCounter); } TEST_F(SIRCoreTest, PassManagerInvalidations) { int counter = 0; auto manager = std::make_unique(transform::PassManager::Init::EMPTY); manager->registerAnalysis(std::make_unique(counter)); manager->registerPass(std::make_unique(counter, ANALYSIS_KEY), "", {ANALYSIS_KEY}, {ANALYSIS_KEY}); manager->registerPass(std::make_unique(counter, ANALYSIS_KEY), "", {ANALYSIS_KEY}); manager->run(module.get()); ASSERT_EQ(2, DummyAnalysis::runCounter); ASSERT_EQ(3, DummyPass::runCounter); }