From 3dc7c274cfe4218fd9e8f1dc7b2e0af2d14958e3 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Wed, 25 Jun 2025 12:42:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=94=AF=E9=85=8D=E6=A0=91?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SysYIRAnalyser.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/SysYIRAnalyser.cpp b/src/SysYIRAnalyser.cpp index c0f304b..0761c0a 100644 --- a/src/SysYIRAnalyser.cpp +++ b/src/SysYIRAnalyser.cpp @@ -1,4 +1,5 @@ #include "SysYIRAnalyser.h" +#include namespace sysy { @@ -47,8 +48,14 @@ auto ControlFlowAnalysis::findCommonDominator(BasicBlock *a, BasicBlock *b) -> B BlockAnalysisInfo* infoB = blockAnalysisInfo[b]; // 如果深度不同,则向上移动到直接支配结点 // TODO:空间换时间倍增优化,优先级较低 - while (infoA->getDomDepth() > infoB->getDomDepth()) a = const_cast(infoA->getIdom()); - while (infoB->getDomDepth() > infoA->getDomDepth()) b = const_cast(infoB->getIdom()); + while (infoA->getDomDepth() > infoB->getDomDepth()) { + a = const_cast(infoA->getIdom()); + infoA = blockAnalysisInfo[a]; + } + while (infoB->getDomDepth() > infoA->getDomDepth()) { + b = const_cast(infoB->getIdom()); + infoB = blockAnalysisInfo[b]; + } if (a == b) break; a = const_cast(infoA->getIdom()); b = const_cast(infoB->getIdom()); @@ -137,11 +144,11 @@ void ControlFlowAnalysis::computeDomTree() { for (auto pred : basicBlock->getPredecessors()) { // 跳过未处理的前驱 if (blockAnalysisInfo[pred]->getIdom() == nullptr) continue; - new_idom = (new_idom == nullptr) ? pred : findCommonDominator(new_idom, pred); - // if (new_idom == nullptr) - // new_idom = pred; - // else - // new_idom = findCommonDominator(new_idom, pred); + // new_idom = (new_idom == nullptr) ? pred : findCommonDominator(new_idom, pred); + if (new_idom == nullptr) + new_idom = pred; + else + new_idom = findCommonDominator(new_idom, pred); } // 更新直接支配节点 if (new_idom && new_idom != blockAnalysisInfo[basicBlock.get()]->getIdom()) { @@ -150,6 +157,10 @@ void ControlFlowAnalysis::computeDomTree() { blockAnalysisInfo[const_cast(blockAnalysisInfo[basicBlock.get()]->getIdom())]->removeSdoms(basicBlock.get()); } // 设置新的支配关系 + + // std::cout << "Block: " << basicBlock->getName() + // << " New Idom: " << new_idom->getName() << std::endl; + blockAnalysisInfo[basicBlock.get()]->setIdom(new_idom); blockAnalysisInfo[new_idom]->addSdoms(basicBlock.get()); // 更新深度 = 直接支配节点深度 + 1