修复支配树生成算法
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
#include "SysYIRAnalyser.h"
|
#include "SysYIRAnalyser.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
namespace sysy {
|
namespace sysy {
|
||||||
@@ -47,8 +48,14 @@ auto ControlFlowAnalysis::findCommonDominator(BasicBlock *a, BasicBlock *b) -> B
|
|||||||
BlockAnalysisInfo* infoB = blockAnalysisInfo[b];
|
BlockAnalysisInfo* infoB = blockAnalysisInfo[b];
|
||||||
// 如果深度不同,则向上移动到直接支配结点
|
// 如果深度不同,则向上移动到直接支配结点
|
||||||
// TODO:空间换时间倍增优化,优先级较低
|
// TODO:空间换时间倍增优化,优先级较低
|
||||||
while (infoA->getDomDepth() > infoB->getDomDepth()) a = const_cast<BasicBlock*>(infoA->getIdom());
|
while (infoA->getDomDepth() > infoB->getDomDepth()) {
|
||||||
while (infoB->getDomDepth() > infoA->getDomDepth()) b = const_cast<BasicBlock*>(infoB->getIdom());
|
a = const_cast<BasicBlock*>(infoA->getIdom());
|
||||||
|
infoA = blockAnalysisInfo[a];
|
||||||
|
}
|
||||||
|
while (infoB->getDomDepth() > infoA->getDomDepth()) {
|
||||||
|
b = const_cast<BasicBlock*>(infoB->getIdom());
|
||||||
|
infoB = blockAnalysisInfo[b];
|
||||||
|
}
|
||||||
if (a == b) break;
|
if (a == b) break;
|
||||||
a = const_cast<BasicBlock*>(infoA->getIdom());
|
a = const_cast<BasicBlock*>(infoA->getIdom());
|
||||||
b = const_cast<BasicBlock*>(infoB->getIdom());
|
b = const_cast<BasicBlock*>(infoB->getIdom());
|
||||||
@@ -137,11 +144,11 @@ void ControlFlowAnalysis::computeDomTree() {
|
|||||||
for (auto pred : basicBlock->getPredecessors()) {
|
for (auto pred : basicBlock->getPredecessors()) {
|
||||||
// 跳过未处理的前驱
|
// 跳过未处理的前驱
|
||||||
if (blockAnalysisInfo[pred]->getIdom() == nullptr) continue;
|
if (blockAnalysisInfo[pred]->getIdom() == nullptr) continue;
|
||||||
new_idom = (new_idom == nullptr) ? pred : findCommonDominator(new_idom, pred);
|
// new_idom = (new_idom == nullptr) ? pred : findCommonDominator(new_idom, pred);
|
||||||
// if (new_idom == nullptr)
|
if (new_idom == nullptr)
|
||||||
// new_idom = pred;
|
new_idom = pred;
|
||||||
// else
|
else
|
||||||
// new_idom = findCommonDominator(new_idom, pred);
|
new_idom = findCommonDominator(new_idom, pred);
|
||||||
}
|
}
|
||||||
// 更新直接支配节点
|
// 更新直接支配节点
|
||||||
if (new_idom && new_idom != blockAnalysisInfo[basicBlock.get()]->getIdom()) {
|
if (new_idom && new_idom != blockAnalysisInfo[basicBlock.get()]->getIdom()) {
|
||||||
@@ -150,6 +157,10 @@ void ControlFlowAnalysis::computeDomTree() {
|
|||||||
blockAnalysisInfo[const_cast<BasicBlock*>(blockAnalysisInfo[basicBlock.get()]->getIdom())]->removeSdoms(basicBlock.get());
|
blockAnalysisInfo[const_cast<BasicBlock*>(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[basicBlock.get()]->setIdom(new_idom);
|
||||||
blockAnalysisInfo[new_idom]->addSdoms(basicBlock.get());
|
blockAnalysisInfo[new_idom]->addSdoms(basicBlock.get());
|
||||||
// 更新深度 = 直接支配节点深度 + 1
|
// 更新深度 = 直接支配节点深度 + 1
|
||||||
|
|||||||
Reference in New Issue
Block a user