[midend]适应上一次commit修改已有优化遍中相关指令删除的代码

This commit is contained in:
rain2133
2025-07-31 21:10:59 +08:00
parent ef09bc70d4
commit 9a53e1b917
4 changed files with 13 additions and 26 deletions

View File

@@ -51,10 +51,8 @@ void DCEContext::run(Function *func, AnalysisManager *AM, bool &changed) {
// 如果指令不在活跃集合中,则删除它。 // 如果指令不在活跃集合中,则删除它。
// 分支和返回指令由 isAlive 处理,并会被保留。 // 分支和返回指令由 isAlive 处理,并会被保留。
if (alive_insts.count(currentInst) == 0) { if (alive_insts.count(currentInst) == 0) {
// 删除指令,保留用户风格的 SysYIROptUtils::usedelete 和 erase instIter = SysYIROptUtils::usedelete(instIter); // 删除后返回下一个迭代器
changed = true; // 标记 IR 已被修改 changed = true; // 标记 IR 已被修改
SysYIROptUtils::usedelete(currentInst);
instIter = basicBlock->getInstructions().erase(instIter); // 删除后返回下一个迭代器
} else { } else {
++instIter; // 指令活跃,移动到下一个 ++instIter; // 指令活跃,移动到下一个
} }

View File

@@ -240,10 +240,9 @@ void Mem2RegContext::renameVariables(AllocaInst *currentAlloca, BasicBlock *curr
// loadInst->getPointer() 返回 AllocaInst* // loadInst->getPointer() 返回 AllocaInst*
// 将 LoadInst 的所有用途替换为当前 alloca 值栈顶部的 SSA 值 // 将 LoadInst 的所有用途替换为当前 alloca 值栈顶部的 SSA 值
assert(!allocaToValueStackMap[alloca].empty() && "Value stack empty for alloca during load replacement!"); 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()); loadInst->replaceAllUsesWith(allocaToValueStackMap[alloca].top());
// instIter = currentBB->force_delete_inst(loadInst); // 删除 LoadInst instIter = SysYIROptUtils::usedelete(instIter);
SysYIROptUtils::usedelete(loadInst); // 仅删除 use 关系
instIter = currentBB->getInstructions().erase(instIter); // 删除 LoadInst
instDeleted = true; instDeleted = true;
// std::cerr << "Mem2Reg: Replaced load " << loadInst->name() << " with SSA value." << std::endl; // std::cerr << "Mem2Reg: Replaced load " << loadInst->name() << " with SSA value." << std::endl;
break; break;
@@ -257,10 +256,10 @@ void Mem2RegContext::renameVariables(AllocaInst *currentAlloca, BasicBlock *curr
if (storeInst->getPointer() == alloca) { if (storeInst->getPointer() == alloca) {
// 假设 storeInst->getPointer() 返回 AllocaInst* // 假设 storeInst->getPointer() 返回 AllocaInst*
// 将 StoreInst 存储的值作为新的 SSA 值,压入值栈 // 将 StoreInst 存储的值作为新的 SSA 值,压入值栈
std::cout << "Mem2Reg: Replacing store to " << storeInst->getPointer()->getName() << " with SSA value." << std::endl;
allocaToValueStackMap[alloca].push(storeInst->getValue()); allocaToValueStackMap[alloca].push(storeInst->getValue());
localStackPushed.push(storeInst->getValue()); // 记录以便弹出 localStackPushed.push(storeInst->getValue()); // 记录以便弹出
SysYIROptUtils::usedelete(storeInst); instIter = SysYIROptUtils::usedelete(instIter);
instIter = currentBB->getInstructions().erase(instIter); // 删除 StoreInst
instDeleted = true; instDeleted = true;
// std::cerr << "Mem2Reg: Replaced store to " << storeInst->ptr()->name() << " with SSA value." << std::endl; // std::cerr << "Mem2Reg: Replaced store to " << storeInst->ptr()->name() << " with SSA value." << std::endl;
break; break;
@@ -327,7 +326,6 @@ void Mem2RegContext::cleanup() {
if (alloca && alloca->getParent()) { if (alloca && alloca->getParent()) {
// 删除 alloca 指令本身 // 删除 alloca 指令本身
SysYIROptUtils::usedelete(alloca); SysYIROptUtils::usedelete(alloca);
alloca->getParent()->removeInst(alloca); // 从基本块中删除 alloca
// std::cerr << "Mem2Reg: Deleted alloca " << alloca->name() << std::endl; // std::cerr << "Mem2Reg: Deleted alloca " << alloca->name() << std::endl;
} }

View File

@@ -181,8 +181,7 @@ void Reg2MemContext::rewritePhis(Function *func) {
// 实际删除 Phi 指令 // 实际删除 Phi 指令
for (auto phi : phisToErase) { for (auto phi : phisToErase) {
if (phi && phi->getParent()) { if (phi && phi->getParent()) {
SysYIROptUtils::usedelete(phi); // 清理 use-def 链 SysYIROptUtils::usedelete(phi);
phi->getParent()->removeInst(phi); // 从基本块中删除
} }
} }
} }

View File

@@ -91,13 +91,11 @@ bool SysYCFGOptUtils::SysYBlockMerge(Function *func) {
auto thelastinstinst = block->end(); auto thelastinstinst = block->end();
(--thelastinstinst); (--thelastinstinst);
if (thelastinstinst->get()->isUnconditional()) { if (thelastinstinst->get()->isUnconditional()) {
SysYIROptUtils::usedelete(thelastinstinst->get()); thelastinstinst = SysYIROptUtils::usedelete(thelastinstinst);
thelastinstinst = block->getInstructions().erase(thelastinstinst);
} else if (thelastinstinst->get()->isConditional()) { } else if (thelastinstinst->get()->isConditional()) {
// 如果是条件分支,判断条件是否相同,主要优化相同布尔表达式 // 如果是条件分支,判断条件是否相同,主要优化相同布尔表达式
if (thelastinstinst->get()->getOperand(1)->getName() == thelastinstinst->get()->getOperand(1)->getName()) { if (thelastinstinst->get()->getOperand(1)->getName() == thelastinstinst->get()->getOperand(1)->getName()) {
SysYIROptUtils::usedelete(thelastinstinst->get()); thelastinstinst = SysYIROptUtils::usedelete(thelastinstinst);
thelastinstinst = block->getInstructions().erase(thelastinstinst);
} }
} }
} }
@@ -164,8 +162,7 @@ bool SysYCFGOptUtils::SysYDelNoPreBLock(Function *func) {
if (!blockIter->get()->getreachable()) { if (!blockIter->get()->getreachable()) {
for (auto instIter = blockIter->get()->getInstructions().begin(); for (auto instIter = blockIter->get()->getInstructions().begin();
instIter != blockIter->get()->getInstructions().end();) { instIter != blockIter->get()->getInstructions().end();) {
SysYIROptUtils::usedelete(instIter->get()); instIter = SysYIROptUtils::usedelete(instIter);
instIter = blockIter->get()->getInstructions().erase(instIter);
} }
} }
} }
@@ -306,8 +303,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder* pBuilder) {
if (dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1)) == if (dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1)) ==
dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(2))) { dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(2))) {
auto thebrBlock = dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1)); auto thebrBlock = dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1));
SysYIROptUtils::usedelete(thelastinst->get()); thelastinst = SysYIROptUtils::usedelete(thelastinst);
thelastinst = basicBlock->getInstructions().erase(thelastinst);
pBuilder->setPosition(basicBlock.get(), basicBlock->end()); pBuilder->setPosition(basicBlock.get(), basicBlock->end());
pBuilder->createUncondBrInst(thebrBlock); pBuilder->createUncondBrInst(thebrBlock);
changed = true; // 标记IR被修改 changed = true; // 标记IR被修改
@@ -345,8 +341,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder* pBuilder) {
if (dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1)) == if (dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1)) ==
dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(2))) { dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(2))) {
auto thebrBlock = dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1)); auto thebrBlock = dynamic_cast<BasicBlock *>(thelastinst->get()->getOperand(1));
SysYIROptUtils::usedelete(thelastinst->get()); thelastinst = SysYIROptUtils::usedelete(thelastinst);
thelastinst = basicBlock->getInstructions().erase(thelastinst);
pBuilder->setPosition(basicBlock.get(), basicBlock->end()); pBuilder->setPosition(basicBlock.get(), basicBlock->end());
pBuilder->createUncondBrInst(thebrBlock); pBuilder->createUncondBrInst(thebrBlock);
changed = true; // 标记IR被修改 changed = true; // 标记IR被修改
@@ -425,9 +420,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder* pBuilder) {
for (auto instIter = iter->get()->getInstructions().begin(); for (auto instIter = iter->get()->getInstructions().begin();
instIter != iter->get()->getInstructions().end();) { instIter != iter->get()->getInstructions().end();) {
SysYIROptUtils::usedelete(instIter->get()); // 仅删除 use 关系 instIter = SysYIROptUtils::usedelete(instIter);
// 显式地从基本块中删除指令并更新迭代器
instIter = iter->get()->getInstructions().erase(instIter);
} }
// 删除不可达基本块的phi指令的操作数 // 删除不可达基本块的phi指令的操作数
for (auto &succ : iter->get()->getSuccessors()) { for (auto &succ : iter->get()->getSuccessors()) {
@@ -523,8 +516,7 @@ bool SysYCFGOptUtils::SysYCondBr2Br(Function *func, IRBuilder* pBuilder) {
auto thenBlock = dynamic_cast<BasicBlock *>(thelast->get()->getOperand(1)); auto thenBlock = dynamic_cast<BasicBlock *>(thelast->get()->getOperand(1));
auto elseBlock = dynamic_cast<BasicBlock *>(thelast->get()->getOperand(2)); auto elseBlock = dynamic_cast<BasicBlock *>(thelast->get()->getOperand(2));
SysYIROptUtils::usedelete(thelast->get()); thelast = SysYIROptUtils::usedelete(thelast);
thelast = basicblock->getInstructions().erase(thelast);
if ((constfloat_Use && constfloat == 1.0F) || (constint_Use && constint == 1)) { if ((constfloat_Use && constfloat == 1.0F) || (constint_Use && constint == 1)) {
// cond为true或非0 // cond为true或非0
pBuilder->setPosition(basicblock.get(), basicblock->end()); pBuilder->setPosition(basicblock.get(), basicblock->end());