diff --git a/.gitignore b/.gitignore index 2e53c61b..ef54b105 100644 --- a/.gitignore +++ b/.gitignore @@ -67,7 +67,7 @@ Thumbs.db # ========================= # Local-only (not for grader) # ========================= -include +/include third_party/antlr4-runtime-4.13.2/runtime/ # ========================= diff --git a/src/include/ir/passes/PassManager.h b/src/include/ir/passes/PassManager.h new file mode 100644 index 00000000..286389e5 --- /dev/null +++ b/src/include/ir/passes/PassManager.h @@ -0,0 +1,83 @@ +#ifndef IR_PASSES_PASSMANAGER_H_ +#define IR_PASSES_PASSMANAGER_H_ + +#include "ir/IR.h" + +#include +#include + +namespace ir { + +void RunMem2Reg(Module& module); +void RunLICM(Module* module); +void RunConstFold(Module& module); +void RunConstProp(Module& module); +void RunDCE(Module& module); +void RunCFGSimplify(Module& module); +void RunCSE(Module& module); + +class PassManagerModule { + public: + explicit PassManagerModule(Module* module) : module_(module) {} + + void Run() { + if (!module_) { + return; + } + + RunMem2Reg(*module_); + + RunLICM(module_); + + bool changed = true; + int max_iterations = 10; + int iterations = 0; + + while (changed && iterations < max_iterations) { + changed = false; + iterations++; + + auto before = SerializeModule(*module_); + + RunConstFold(*module_); + RunConstProp(*module_); + RunCFGSimplify(*module_); + RunCSE(*module_); + RunDCE(*module_); + + auto after = SerializeModule(*module_); + changed = (before != after); + } + } + + private: + std::string SerializeModule(const Module& module) { + std::ostringstream oss; + IRPrinter printer; + printer.Print(module, oss); + return oss.str(); + } + + Module* module_; +}; + +class PassManager { + public: + PassManager() = default; + + void RunScalarOptimizationPasses(Module* module) { + if (!module) return; + + RunMem2Reg(*module); + + RunConstFold(*module); + RunDCE(*module); + RunCFGSimplify(*module); + } + + private: +}; + +} // namespace ir + +#endif // IR_PASSES_PASSMANAGER_H_