diff --git a/src/backend/core/JIT/IR.cpp b/src/backend/core/JIT/IR.cpp index 1b49206d..81aab37d 100644 --- a/src/backend/core/JIT/IR.cpp +++ b/src/backend/core/JIT/IR.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include namespace n64 { template <> struct fmt::formatter : formatter { @@ -177,8 +179,15 @@ void IR::push(const Entry& e) { code.push_back(e); } -void IR::dead_code_elimination(std::vector& code_) { - for(const auto& i : code) { +std::vector IR::constant_propagation(std::vector& code_) { + std::vector optimized{}; + + return optimized; +} + +std::vector IR::dead_code_elimination(std::vector& code_) { + std::vector optimized{}; + for(const auto& i : code_) { bool isOp1Reg = i.op1.isReg(); bool isOp2Reg = i.op2.isReg(); bool isDstReg = i.dst.isReg(); @@ -200,21 +209,20 @@ void IR::dead_code_elimination(std::vector& code_) { } } - code_.push_back(i); + optimized.push_back(i); } + + return optimized; } void IR::optimize() { std::vector optimized{}; - dead_code_elimination(optimized); - - if(optimized.size() == code.size()) { - return; + while (optimized.size() < code.size()) { + optimized = dead_code_elimination(code); + //optimized = constant_propagation(optimized); + code = optimized; } - - code = optimized; - optimize(); } void IR::print() { diff --git a/src/backend/core/JIT/IR.hpp b/src/backend/core/JIT/IR.hpp index 77408a00..62a9ea74 100644 --- a/src/backend/core/JIT/IR.hpp +++ b/src/backend/core/JIT/IR.hpp @@ -90,7 +90,8 @@ struct IR { void print(); void optimize(); private: - void dead_code_elimination(std::vector&); + std::vector constant_propagation(std::vector&); + std::vector dead_code_elimination(std::vector&); std::vector code{}; }; } \ No newline at end of file