#ifndef LOOPH #define LOOPH #include "BasicOperation.h" struct node { BasicBlock *bb; std::set pre; std::set suc; int dfn, low; bool inStack; node() = default; node(BasicBlock *bb_, int dfn_, int low_, bool inStack_) : bb(bb_), dfn(dfn_), low(low_), inStack(inStack_) {} }; class LoopInvariant : public Optimization { int ind; std::stack tarjanStack; std::stack *> loopStack; std::map *, BasicBlock *> entryPos; public: LoopInvariant(Module *m) : Optimization(m) {} void execute(); void searchLoop(); bool searchSCC(std::set &basicBlock, std::set *> &SCCs); void tarjan(node *pos, std::set *> &SCCs); }; #endif // !LOOPH