[midend-LoopAnalysis]修复循环规范遍bug,修正部分打印格式,

This commit is contained in:
rain2133
2025-08-12 12:34:07 +08:00
parent 8cb807c8b9
commit 70f6a25ebc
4 changed files with 20 additions and 14 deletions

View File

@@ -1431,14 +1431,14 @@ protected:
auto it = std::find_if(blocks.begin(), blocks.end(), auto it = std::find_if(blocks.begin(), blocks.end(),
[before](const std::unique_ptr<BasicBlock> &ptr) { return ptr.get() == before; }); [before](const std::unique_ptr<BasicBlock> &ptr) { return ptr.get() == before; });
if (it != blocks.end()) { if (it != blocks.end()) {
blocks.emplace(it, new BasicBlock(this, name)); auto newblk = blocks.emplace(it, std::make_unique<BasicBlock>(this, name));
return it->get(); // 返回新添加的基本块指针 return newblk->get(); // 返回新添加的基本块指针
} }
assert(false && "BasicBlock to insert before not found!"); assert(false && "BasicBlock to insert before not found!");
return nullptr; // 如果没有找到指定的基本块则返回nullptr return nullptr; // 如果没有找到指定的基本块则返回nullptr
} ///< 添加一个新的基本块到某个基本块之前 } ///< 添加一个新的基本块到某个基本块之前
BasicBlock* addBasicBlock(const std::string &name = "") { BasicBlock* addBasicBlock(const std::string &name = "") {
blocks.emplace_back(new BasicBlock(this, name)); blocks.emplace_back(std::make_unique<BasicBlock>(this, name));
return blocks.back().get(); return blocks.back().get();
} }
BasicBlock* addBasicBlock(BasicBlock *block) { BasicBlock* addBasicBlock(BasicBlock *block) {

View File

@@ -104,7 +104,7 @@ private:
* @param preheader 新创建的前置块 * @param preheader 新创建的前置块
* @param header 循环头部 * @param header 循环头部
*/ */
void redirectExternalPredecessors(Loop* loop, BasicBlock* preheader, BasicBlock* header); void redirectExternalPredecessors(Loop* loop, BasicBlock* preheader, BasicBlock* header, const std::vector<BasicBlock*>& externalPreds);
/** /**
* 为前置块生成合适的名称 * 为前置块生成合适的名称

View File

@@ -762,7 +762,7 @@ void BinaryInst::print(std::ostream &os) const {
printOperand(os, getLhs()); printOperand(os, getLhs());
os << ", "; os << ", ";
printOperand(os, getRhs()); printOperand(os, getRhs());
os << "\n "; os << "\n ";
printVarName(os, this) << " = zext i1 %" << tmpName << " to i32"; printVarName(os, this) << " = zext i1 %" << tmpName << " to i32";
} else if (kind == kFCmpEQ || kind == kFCmpNE || kind == kFCmpLT || } else if (kind == kFCmpEQ || kind == kFCmpNE || kind == kFCmpLT ||
kind == kFCmpGT || kind == kFCmpLE || kind == kFCmpGE) { kind == kFCmpGT || kind == kFCmpLE || kind == kFCmpGE) {
@@ -777,7 +777,7 @@ void BinaryInst::print(std::ostream &os) const {
printOperand(os, getLhs()); printOperand(os, getLhs());
os << ", "; os << ", ";
printOperand(os, getRhs()); printOperand(os, getRhs());
os << "\n "; os << "\n ";
printVarName(os, this) << " = zext i1 %" << tmpName << " to i32"; printVarName(os, this) << " = zext i1 %" << tmpName << " to i32";
} else { } else {
// 算术和逻辑指令 // 算术和逻辑指令

View File

@@ -147,7 +147,7 @@ BasicBlock* LoopNormalizationPass::createPreheaderForLoop(Loop* loop) {
// 创建新的前置块 // 创建新的前置块
Function* parentFunction = header->getParent(); Function* parentFunction = header->getParent();
BasicBlock* preheader = parentFunction->addBasicBlock(preheaderName); BasicBlock* preheader = parentFunction->addBasicBlock(preheaderName, header);
if (!preheader) { if (!preheader) {
if (DEBUG) if (DEBUG)
@@ -163,8 +163,12 @@ BasicBlock* LoopNormalizationPass::createPreheaderForLoop(Loop* loop) {
preheader->addSuccessor(header); preheader->addSuccessor(header);
header->addPredecessor(preheader); header->addPredecessor(preheader);
if(DEBUG) {
std::cout << " Created preheader " << preheader->getName()
<< " with unconditional branch to " << header->getName() << std::endl;
}
// 重定向外部前驱到新的前置块 // 重定向外部前驱到新的前置块
redirectExternalPredecessors(loop, preheader, header); redirectExternalPredecessors(loop, preheader, header, externalPreds);
// 更新PHI节点 // 更新PHI节点
updatePhiNodesForPreheader(header, preheader, externalPreds); updatePhiNodesForPreheader(header, preheader, externalPreds);
@@ -228,8 +232,9 @@ void LoopNormalizationPass::updateDominatorRelations(BasicBlock* newBlock, Loop*
} }
} }
void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock* preheader, BasicBlock* header) { void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock* preheader, BasicBlock* header,
std::vector<BasicBlock*> externalPreds = getExternalPredecessors(loop); const std::vector<BasicBlock*>& externalPreds) {
// std::vector<BasicBlock*> externalPreds = getExternalPredecessors(loop);
if (DEBUG) { if (DEBUG) {
std::cout << " Redirecting " << externalPreds.size() << " external predecessors" << std::endl; std::cout << " Redirecting " << externalPreds.size() << " external predecessors" << std::endl;
@@ -247,6 +252,10 @@ void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock*
if (auto* br = dynamic_cast<UncondBrInst*>(terminator)) { if (auto* br = dynamic_cast<UncondBrInst*>(terminator)) {
// 无条件跳转 // 无条件跳转
if (br->getBlock() == header) { if (br->getBlock() == header) {
if(DEBUG){
std::cout << " Updating unconditional branch from " << br->getBlock()->getName()
<< " to " << preheader->getName() << std::endl;
}
// 需要更新操作数 // 需要更新操作数
br->setOperand(0, preheader); br->setOperand(0, preheader);
// 更新CFG关系 // 更新CFG关系
@@ -255,9 +264,6 @@ void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock*
pred->removeSuccessor(header); pred->removeSuccessor(header);
pred->addSuccessor(preheader); pred->addSuccessor(preheader);
if (DEBUG)
std::cout << " Updated unconditional branch from " << pred->getName()
<< " to " << preheader->getName() << std::endl;
} }
} else if (auto* condBr = dynamic_cast<CondBrInst*>(terminator)) { } else if (auto* condBr = dynamic_cast<CondBrInst*>(terminator)) {
// 条件跳转 // 条件跳转
@@ -288,7 +294,7 @@ void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock*
std::string LoopNormalizationPass::generatePreheaderName(Loop* loop) { std::string LoopNormalizationPass::generatePreheaderName(Loop* loop) {
std::ostringstream oss; std::ostringstream oss;
oss << loop->getName() << ".preheader"; oss << loop->getName() << "_preheader";
return oss.str(); return oss.str();
} }