diff --git a/src/midend/Pass/Optimize/DCE.cpp b/src/midend/Pass/Optimize/DCE.cpp index db5d966..2da1873 100644 --- a/src/midend/Pass/Optimize/DCE.cpp +++ b/src/midend/Pass/Optimize/DCE.cpp @@ -51,10 +51,8 @@ void DCEContext::run(Function *func, AnalysisManager *AM, bool &changed) { // 如果指令不在活跃集合中,则删除它。 // 分支和返回指令由 isAlive 处理,并会被保留。 if (alive_insts.count(currentInst) == 0) { - // 删除指令,保留用户风格的 SysYIROptUtils::usedelete 和 erase + instIter = SysYIROptUtils::usedelete(instIter); // 删除后返回下一个迭代器 changed = true; // 标记 IR 已被修改 - SysYIROptUtils::usedelete(currentInst); - instIter = basicBlock->getInstructions().erase(instIter); // 删除后返回下一个迭代器 } else { ++instIter; // 指令活跃,移动到下一个 } diff --git a/src/midend/Pass/Optimize/Mem2Reg.cpp b/src/midend/Pass/Optimize/Mem2Reg.cpp index c6e856f..2447b97 100644 --- a/src/midend/Pass/Optimize/Mem2Reg.cpp +++ b/src/midend/Pass/Optimize/Mem2Reg.cpp @@ -240,10 +240,9 @@ void Mem2RegContext::renameVariables(AllocaInst *currentAlloca, BasicBlock *curr // loadInst->getPointer() 返回 AllocaInst* // 将 LoadInst 的所有用途替换为当前 alloca 值栈顶部的 SSA 值 assert(!allocaToValueStackMap[alloca].empty() && "Value stack empty for alloca during load replacement!"); + std::cout << "Mem2Reg: Replacing load " << loadInst->getPointer()->getName() << " with SSA value." << std::endl; loadInst->replaceAllUsesWith(allocaToValueStackMap[alloca].top()); - // instIter = currentBB->force_delete_inst(loadInst); // 删除 LoadInst - SysYIROptUtils::usedelete(loadInst); // 仅删除 use 关系 - instIter = currentBB->getInstructions().erase(instIter); // 删除 LoadInst + instIter = SysYIROptUtils::usedelete(instIter); instDeleted = true; // std::cerr << "Mem2Reg: Replaced load " << loadInst->name() << " with SSA value." << std::endl; break; @@ -257,10 +256,10 @@ void Mem2RegContext::renameVariables(AllocaInst *currentAlloca, BasicBlock *curr if (storeInst->getPointer() == alloca) { // 假设 storeInst->getPointer() 返回 AllocaInst* // 将 StoreInst 存储的值作为新的 SSA 值,压入值栈 + std::cout << "Mem2Reg: Replacing store to " << storeInst->getPointer()->getName() << " with SSA value." << std::endl; allocaToValueStackMap[alloca].push(storeInst->getValue()); localStackPushed.push(storeInst->getValue()); // 记录以便弹出 - SysYIROptUtils::usedelete(storeInst); - instIter = currentBB->getInstructions().erase(instIter); // 删除 StoreInst + instIter = SysYIROptUtils::usedelete(instIter); instDeleted = true; // std::cerr << "Mem2Reg: Replaced store to " << storeInst->ptr()->name() << " with SSA value." << std::endl; break; @@ -327,7 +326,6 @@ void Mem2RegContext::cleanup() { if (alloca && alloca->getParent()) { // 删除 alloca 指令本身 SysYIROptUtils::usedelete(alloca); - alloca->getParent()->removeInst(alloca); // 从基本块中删除 alloca // std::cerr << "Mem2Reg: Deleted alloca " << alloca->name() << std::endl; } diff --git a/src/midend/Pass/Optimize/Reg2Mem.cpp b/src/midend/Pass/Optimize/Reg2Mem.cpp index 42316a5..199153b 100644 --- a/src/midend/Pass/Optimize/Reg2Mem.cpp +++ b/src/midend/Pass/Optimize/Reg2Mem.cpp @@ -181,8 +181,7 @@ void Reg2MemContext::rewritePhis(Function *func) { // 实际删除 Phi 指令 for (auto phi : phisToErase) { if (phi && phi->getParent()) { - SysYIROptUtils::usedelete(phi); // 清理 use-def 链 - phi->getParent()->removeInst(phi); // 从基本块中删除 + SysYIROptUtils::usedelete(phi); } } } diff --git a/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp b/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp index 99c06aa..a589453 100644 --- a/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp +++ b/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp @@ -91,13 +91,11 @@ bool SysYCFGOptUtils::SysYBlockMerge(Function *func) { auto thelastinstinst = block->end(); (--thelastinstinst); if (thelastinstinst->get()->isUnconditional()) { - SysYIROptUtils::usedelete(thelastinstinst->get()); - thelastinstinst = block->getInstructions().erase(thelastinstinst); + thelastinstinst = SysYIROptUtils::usedelete(thelastinstinst); } else if (thelastinstinst->get()->isConditional()) { // 如果是条件分支,判断条件是否相同,主要优化相同布尔表达式 if (thelastinstinst->get()->getOperand(1)->getName() == thelastinstinst->get()->getOperand(1)->getName()) { - SysYIROptUtils::usedelete(thelastinstinst->get()); - thelastinstinst = block->getInstructions().erase(thelastinstinst); + thelastinstinst = SysYIROptUtils::usedelete(thelastinstinst); } } } @@ -164,8 +162,7 @@ bool SysYCFGOptUtils::SysYDelNoPreBLock(Function *func) { if (!blockIter->get()->getreachable()) { for (auto instIter = blockIter->get()->getInstructions().begin(); instIter != blockIter->get()->getInstructions().end();) { - SysYIROptUtils::usedelete(instIter->get()); - instIter = blockIter->get()->getInstructions().erase(instIter); + instIter = SysYIROptUtils::usedelete(instIter); } } } @@ -306,8 +303,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder* pBuilder) { if (dynamic_cast(thelastinst->get()->getOperand(1)) == dynamic_cast(thelastinst->get()->getOperand(2))) { auto thebrBlock = dynamic_cast(thelastinst->get()->getOperand(1)); - SysYIROptUtils::usedelete(thelastinst->get()); - thelastinst = basicBlock->getInstructions().erase(thelastinst); + thelastinst = SysYIROptUtils::usedelete(thelastinst); pBuilder->setPosition(basicBlock.get(), basicBlock->end()); pBuilder->createUncondBrInst(thebrBlock); changed = true; // 标记IR被修改 @@ -345,8 +341,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder* pBuilder) { if (dynamic_cast(thelastinst->get()->getOperand(1)) == dynamic_cast(thelastinst->get()->getOperand(2))) { auto thebrBlock = dynamic_cast(thelastinst->get()->getOperand(1)); - SysYIROptUtils::usedelete(thelastinst->get()); - thelastinst = basicBlock->getInstructions().erase(thelastinst); + thelastinst = SysYIROptUtils::usedelete(thelastinst); pBuilder->setPosition(basicBlock.get(), basicBlock->end()); pBuilder->createUncondBrInst(thebrBlock); changed = true; // 标记IR被修改 @@ -425,9 +420,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder* pBuilder) { for (auto instIter = iter->get()->getInstructions().begin(); instIter != iter->get()->getInstructions().end();) { - SysYIROptUtils::usedelete(instIter->get()); // 仅删除 use 关系 - // 显式地从基本块中删除指令并更新迭代器 - instIter = iter->get()->getInstructions().erase(instIter); + instIter = SysYIROptUtils::usedelete(instIter); } // 删除不可达基本块的phi指令的操作数 for (auto &succ : iter->get()->getSuccessors()) { @@ -523,8 +516,7 @@ bool SysYCFGOptUtils::SysYCondBr2Br(Function *func, IRBuilder* pBuilder) { auto thenBlock = dynamic_cast(thelast->get()->getOperand(1)); auto elseBlock = dynamic_cast(thelast->get()->getOperand(2)); - SysYIROptUtils::usedelete(thelast->get()); - thelast = basicblock->getInstructions().erase(thelast); + thelast = SysYIROptUtils::usedelete(thelast); if ((constfloat_Use && constfloat == 1.0F) || (constint_Use && constint == 1)) { // cond为true或非0 pBuilder->setPosition(basicblock.get(), basicblock->end());