From ce4d4b5f5b9035639bb75442864be858cbde6233 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Tue, 19 Aug 2025 01:08:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[midend-phielimination]=E5=A2=9E=E5=8A=A0ph?= =?UTF-8?q?i=E6=8C=87=E4=BB=A4=E6=B6=88=E9=99=A4=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../midend/Pass/Optimize/SysYIROptUtils.h | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/include/midend/Pass/Optimize/SysYIROptUtils.h b/src/include/midend/Pass/Optimize/SysYIROptUtils.h index 48d2f26..71c0532 100644 --- a/src/include/midend/Pass/Optimize/SysYIROptUtils.h +++ b/src/include/midend/Pass/Optimize/SysYIROptUtils.h @@ -109,6 +109,28 @@ public: } + // PHI指令消除相关方法 + static void eliminateRedundantPhisInFunction(Function* func){ + std::vector toDelete; + for (auto &bb : func->getBasicBlocks()) { + for (auto &inst : bb->getInstructions()) { + if (auto phi = dynamic_cast(inst.get())) { + auto incoming = phi->getIncomingValues(); + if (incoming.size() == 1) { + Value *singleVal = incoming[0].first; + inst->replaceAllUsesWith(singleVal); + toDelete.push_back(inst.get()); + } + } + else + break; // 只处理Phi指令 + } + } + for (auto *phi : toDelete) { + usedelete(phi); + } + } + //该实现参考了libdivide的算法 static std::pair computeMulhMagicNumbers(int divisor) { From db122cabbdbfb4ff5b49b79efb5e9d4322c26db0 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Tue, 19 Aug 2025 08:27:18 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[midend-phielimination]=E6=B6=88=E9=99=A4?= =?UTF-8?q?=E5=8F=AA=E6=9C=89=E4=B8=80=E4=B8=AAincomingvalue=E7=9A=84phi?= =?UTF-8?q?=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/midend/Pass/Optimize/SysYIROptUtils.h | 10 ++++++++-- src/midend/Pass/Optimize/DCE.cpp | 1 + src/midend/Pass/Optimize/GVN.cpp | 2 +- .../Pass/Optimize/InductionVariableElimination.cpp | 1 + src/midend/Pass/Optimize/SCCP.cpp | 5 ++--- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/include/midend/Pass/Optimize/SysYIROptUtils.h b/src/include/midend/Pass/Optimize/SysYIROptUtils.h index 71c0532..81062e1 100644 --- a/src/include/midend/Pass/Optimize/SysYIROptUtils.h +++ b/src/include/midend/Pass/Optimize/SysYIROptUtils.h @@ -110,14 +110,18 @@ public: // PHI指令消除相关方法 - static void eliminateRedundantPhisInFunction(Function* func){ + static bool eliminateRedundantPhisInFunction(Function* func){ + bool changed = false; std::vector toDelete; for (auto &bb : func->getBasicBlocks()) { for (auto &inst : bb->getInstructions()) { if (auto phi = dynamic_cast(inst.get())) { auto incoming = phi->getIncomingValues(); + if(DEBUG){ + std::cout << "Checking Phi: " << phi->getName() << " with " << incoming.size() << " incoming values." << std::endl; + } if (incoming.size() == 1) { - Value *singleVal = incoming[0].first; + Value *singleVal = incoming[0].second; inst->replaceAllUsesWith(singleVal); toDelete.push_back(inst.get()); } @@ -128,7 +132,9 @@ public: } for (auto *phi : toDelete) { usedelete(phi); + changed = true; // 标记为已更改 } + return changed; // 返回是否有删除发生 } //该实现参考了libdivide的算法 diff --git a/src/midend/Pass/Optimize/DCE.cpp b/src/midend/Pass/Optimize/DCE.cpp index 06a4822..f89781e 100644 --- a/src/midend/Pass/Optimize/DCE.cpp +++ b/src/midend/Pass/Optimize/DCE.cpp @@ -74,6 +74,7 @@ void DCEContext::run(Function *func, AnalysisManager *AM, bool &changed) { } } } + changed |= SysYIROptUtils::eliminateRedundantPhisInFunction(func); // 如果有活跃指令,则标记为已更改 } // 判断指令是否是"天然活跃"的实现 diff --git a/src/midend/Pass/Optimize/GVN.cpp b/src/midend/Pass/Optimize/GVN.cpp index 09b67a1..047ae52 100644 --- a/src/midend/Pass/Optimize/GVN.cpp +++ b/src/midend/Pass/Optimize/GVN.cpp @@ -39,7 +39,7 @@ bool GVN::runOnFunction(Function *func, AnalysisManager &AM) { } std::cout << "=== GVN completed for function: " << func->getName() << " ===" << std::endl; } - + changed |= SysYIROptUtils::eliminateRedundantPhisInFunction(func); return changed; } diff --git a/src/midend/Pass/Optimize/InductionVariableElimination.cpp b/src/midend/Pass/Optimize/InductionVariableElimination.cpp index 8055efa..56bb22a 100644 --- a/src/midend/Pass/Optimize/InductionVariableElimination.cpp +++ b/src/midend/Pass/Optimize/InductionVariableElimination.cpp @@ -133,6 +133,7 @@ bool InductionVariableEliminationContext::run(Function* F, AnalysisManager& AM) printDebugInfo(); } + modified |= SysYIROptUtils::eliminateRedundantPhisInFunction(F); return modified; } diff --git a/src/midend/Pass/Optimize/SCCP.cpp b/src/midend/Pass/Optimize/SCCP.cpp index 8fbda0b..d0fa138 100644 --- a/src/midend/Pass/Optimize/SCCP.cpp +++ b/src/midend/Pass/Optimize/SCCP.cpp @@ -1357,9 +1357,8 @@ void SCCPContext::run(Function *func, AnalysisManager &AM) { bool changed_control_flow = SimplifyControlFlow(func); // 如果任何一个阶段修改了 IR,标记分析结果为失效 - if (changed_constant_propagation || changed_control_flow) { - // AM.invalidate(); // 假设有这样的方法来使所有分析结果失效 - } + bool changed = changed_constant_propagation || changed_control_flow; + changed |= SysYIROptUtils::eliminateRedundantPhisInFunction(func); } // SCCP Pass methods