#include "FuncInfo.hpp" #include "LoopDetection.hpp" #include "PassManager.hpp" #include #include class LoopInvariantCodeMotion : public Pass { public: LoopInvariantCodeMotion(Module *m) : Pass(m) {} ~LoopInvariantCodeMotion() = default; void run() override; private: std::unordered_map, bool> is_loop_done_; std::unique_ptr loop_detection_; std::unique_ptr func_info_; void traverse_loop(std::shared_ptr loop); void run_on_loop(std::shared_ptr loop); void collect_loop_info(std::shared_ptr loop, std::set &loop_instructions, std::set &updated_global, bool &contains_impure_call); };