diff --git a/src/include/midend/IR.h b/src/include/midend/IR.h index b71f02b..f7940aa 100644 --- a/src/include/midend/IR.h +++ b/src/include/midend/IR.h @@ -1431,14 +1431,14 @@ protected: auto it = std::find_if(blocks.begin(), blocks.end(), [before](const std::unique_ptr &ptr) { return ptr.get() == before; }); if (it != blocks.end()) { - blocks.emplace(it, new BasicBlock(this, name)); - return it->get(); // 返回新添加的基本块指针 + auto newblk = blocks.emplace(it, std::make_unique(this, name)); + return newblk->get(); // 返回新添加的基本块指针 } assert(false && "BasicBlock to insert before not found!"); return nullptr; // 如果没有找到指定的基本块,则返回nullptr } ///< 添加一个新的基本块到某个基本块之前 BasicBlock* addBasicBlock(const std::string &name = "") { - blocks.emplace_back(new BasicBlock(this, name)); + blocks.emplace_back(std::make_unique(this, name)); return blocks.back().get(); } BasicBlock* addBasicBlock(BasicBlock *block) { diff --git a/src/include/midend/Pass/Optimize/LoopNormalization.h b/src/include/midend/Pass/Optimize/LoopNormalization.h index ef65ae3..34b67f0 100644 --- a/src/include/midend/Pass/Optimize/LoopNormalization.h +++ b/src/include/midend/Pass/Optimize/LoopNormalization.h @@ -104,7 +104,7 @@ private: * @param preheader 新创建的前置块 * @param header 循环头部 */ - void redirectExternalPredecessors(Loop* loop, BasicBlock* preheader, BasicBlock* header); + void redirectExternalPredecessors(Loop* loop, BasicBlock* preheader, BasicBlock* header, const std::vector& externalPreds); /** * 为前置块生成合适的名称 diff --git a/src/midend/IR.cpp b/src/midend/IR.cpp index 7879816..5b2c258 100644 --- a/src/midend/IR.cpp +++ b/src/midend/IR.cpp @@ -762,7 +762,7 @@ void BinaryInst::print(std::ostream &os) const { printOperand(os, getLhs()); os << ", "; printOperand(os, getRhs()); - os << "\n "; + os << "\n "; printVarName(os, this) << " = zext i1 %" << tmpName << " to i32"; } else if (kind == kFCmpEQ || kind == kFCmpNE || kind == kFCmpLT || kind == kFCmpGT || kind == kFCmpLE || kind == kFCmpGE) { @@ -777,7 +777,7 @@ void BinaryInst::print(std::ostream &os) const { printOperand(os, getLhs()); os << ", "; printOperand(os, getRhs()); - os << "\n "; + os << "\n "; printVarName(os, this) << " = zext i1 %" << tmpName << " to i32"; } else { // 算术和逻辑指令 diff --git a/src/midend/Pass/Optimize/LoopNormalization.cpp b/src/midend/Pass/Optimize/LoopNormalization.cpp index 4996304..deb95ec 100644 --- a/src/midend/Pass/Optimize/LoopNormalization.cpp +++ b/src/midend/Pass/Optimize/LoopNormalization.cpp @@ -147,7 +147,7 @@ BasicBlock* LoopNormalizationPass::createPreheaderForLoop(Loop* loop) { // 创建新的前置块 Function* parentFunction = header->getParent(); - BasicBlock* preheader = parentFunction->addBasicBlock(preheaderName); + BasicBlock* preheader = parentFunction->addBasicBlock(preheaderName, header); if (!preheader) { if (DEBUG) @@ -163,8 +163,12 @@ BasicBlock* LoopNormalizationPass::createPreheaderForLoop(Loop* loop) { preheader->addSuccessor(header); 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节点 updatePhiNodesForPreheader(header, preheader, externalPreds); @@ -228,8 +232,9 @@ void LoopNormalizationPass::updateDominatorRelations(BasicBlock* newBlock, Loop* } } -void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock* preheader, BasicBlock* header) { - std::vector externalPreds = getExternalPredecessors(loop); +void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock* preheader, BasicBlock* header, + const std::vector& externalPreds) { + // std::vector externalPreds = getExternalPredecessors(loop); if (DEBUG) { std::cout << " Redirecting " << externalPreds.size() << " external predecessors" << std::endl; @@ -247,6 +252,10 @@ void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock* if (auto* br = dynamic_cast(terminator)) { // 无条件跳转 if (br->getBlock() == header) { + if(DEBUG){ + std::cout << " Updating unconditional branch from " << br->getBlock()->getName() + << " to " << preheader->getName() << std::endl; + } // 需要更新操作数 br->setOperand(0, preheader); // 更新CFG关系 @@ -255,9 +264,6 @@ void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock* pred->removeSuccessor(header); pred->addSuccessor(preheader); - if (DEBUG) - std::cout << " Updated unconditional branch from " << pred->getName() - << " to " << preheader->getName() << std::endl; } } else if (auto* condBr = dynamic_cast(terminator)) { // 条件跳转 @@ -288,7 +294,7 @@ void LoopNormalizationPass::redirectExternalPredecessors(Loop* loop, BasicBlock* std::string LoopNormalizationPass::generatePreheaderName(Loop* loop) { std::ostringstream oss; - oss << loop->getName() << ".preheader"; + oss << loop->getName() << "_preheader"; return oss.str(); }