diff --git a/src/include/midend/IR.h b/src/include/midend/IR.h index 2920ccd..5658d9d 100644 --- a/src/include/midend/IR.h +++ b/src/include/midend/IR.h @@ -920,7 +920,7 @@ class PhiInst : public Instruction { Value *getIncomingValue(unsigned Idx) const { return getOperand(Idx * 2); } ///< 获取指定位置的传入值 BasicBlock *getIncomingBlock(unsigned Idx) const {return dynamic_cast(getOperand(Idx * 2 + 1)); } ///< 获取指定位置的传入基本块 - Value* getvalfromBlk(BasicBlock* block); + Value* getValfromBlk(BasicBlock* block); BasicBlock* getBlkfromVal(Value* value); void addIncoming(Value *value, BasicBlock *block) { @@ -933,17 +933,23 @@ class PhiInst : public Instruction { void removeIncoming(unsigned Idx) { assert(Idx < vsize && "PhiInst: Index out of bounds"); auto blk = getIncomingBlock(Idx); - removeOperand(Idx * 2); // Remove value removeOperand(Idx * 2 + 1); // Remove block + removeOperand(Idx * 2); // Remove value blk2val.erase(blk); vsize--; } ///< 移除指定位置的传入值和对应的基本块 + // 移除指定的传入值或基本块 void removeIncomingValue(Value *value); void removeIncomingBlock(BasicBlock *block); + // 设置指定位置的传入值或基本块 void setIncomingValue(unsigned Idx, Value *value); void setIncomingBlock(unsigned Idx, BasicBlock *block); + // 替换指定位置的传入值或基本块(原理是删除再添加)保留旧块或者旧值 void replaceIncomingValue(Value *oldValue, Value *newValue); void replaceIncomingBlock(BasicBlock *oldBlock, BasicBlock *newBlock); + // 替换指定位置的传入值或基本块(原理是删除再添加) + void replaceIncomingValue(Value *oldValue, Value *newValue, BasicBlock *newBlock); + void replaceIncomingBlock(BasicBlock *oldBlock, BasicBlock *newBlock, Value *newValue); void refreshMap() { blk2val.clear(); for (unsigned i = 0; i < vsize; ++i) { diff --git a/src/midend/IR.cpp b/src/midend/IR.cpp index 636f38f..10b133f 100644 --- a/src/midend/IR.cpp +++ b/src/midend/IR.cpp @@ -258,7 +258,7 @@ void User::removeOperand(unsigned index) { * phi相关函数 */ -Value* PhiInst::getvalfromBlk(BasicBlock* blk) { +Value* PhiInst::getValfromBlk(BasicBlock* blk) { refreshMap(); if( blk2val.find(blk) != blk2val.end()) { return blk2val.at(blk); @@ -294,7 +294,7 @@ void PhiInst::removeIncomingValue(Value* val){ void PhiInst::removeIncomingBlock(BasicBlock* blk){ //根据Blk删除对应的基本块和值 unsigned i = 0; - Value* val = getvalfromBlk(blk); + Value* val = getValfromBlk(blk); if(val == nullptr) { return; // 如果blk没有对应的值,直接返回 } @@ -341,6 +341,21 @@ void PhiInst::replaceIncomingBlock(BasicBlock* newBlk, BasicBlock* oldBlk) { addIncoming(val, newBlk); } +void PhiInst::replaceIncomingValue(Value *oldValue, Value *newValue, BasicBlock *newBlock) { + refreshMap(); + assert(blk2val.find(getBlkfromVal(oldValue)) != blk2val.end() && "PhiInst: oldValue not found in blk2val"); + auto oldBlock = getBlkfromVal(oldValue); + removeIncomingValue(oldValue); + addIncoming(newValue, newBlock); +} + +void PhiInst::replaceIncomingBlock(BasicBlock *oldBlock, BasicBlock *newBlock, Value *newValue) { + refreshMap(); + assert(blk2val.find(oldBlock) != blk2val.end() && "PhiInst: oldBlock not found in blk2val"); + auto oldValue = blk2val[oldBlock]; + removeIncomingBlock(oldBlock); + addIncoming(newValue, newBlock); +} CallInst::CallInst(Function *callee, const std::vector &args, BasicBlock *parent, const std::string &name) : Instruction(kCall, callee->getReturnType(), parent, name) { diff --git a/src/midend/Pass/Optimize/Reg2Mem.cpp b/src/midend/Pass/Optimize/Reg2Mem.cpp index 199153b..cd52f51 100644 --- a/src/midend/Pass/Optimize/Reg2Mem.cpp +++ b/src/midend/Pass/Optimize/Reg2Mem.cpp @@ -148,8 +148,8 @@ void Reg2MemContext::rewritePhis(Function *func) { // 1. 为 Phi 指令的每个入边,在前驱块的末尾插入 Store 指令 // PhiInst 假设有 getIncomingValues() 和 getIncomingBlocks() for (unsigned i = 0; i < phiInst->getNumIncomingValues(); ++i) { // 假设 PhiInst 是通过操作数来管理入边的 - Value *incomingValue = phiInst->getValue(i); // 获取入值 - BasicBlock *incomingBlock = phiInst->getBlock(i); // 获取对应的入块 + Value *incomingValue = phiInst->getIncomingValue(i); // 获取入值 + BasicBlock *incomingBlock = phiInst->getIncomingBlock(i); // 获取对应的入块 // 在入块的跳转指令之前插入 StoreInst // 需要找到 incomingBlock 的终结指令 (Terminator Instruction) diff --git a/src/midend/Pass/Optimize/SCCP.cpp b/src/midend/Pass/Optimize/SCCP.cpp index 33d716f..e83bc31 100644 --- a/src/midend/Pass/Optimize/SCCP.cpp +++ b/src/midend/Pass/Optimize/SCCP.cpp @@ -845,7 +845,7 @@ void SCCPContext::RemovePhiIncoming(BasicBlock *phiParentBB, BasicBlock *removed for (Instruction *inst : insts_to_check) { if (auto phi = dynamic_cast(inst)) { - phi->delBlk(removedPred); + phi->removeIncomingBlock(removedPred); } } } diff --git a/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp b/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp index a4c584b..5e75645 100644 --- a/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp +++ b/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp @@ -189,7 +189,7 @@ bool SysYCFGOptUtils::SysYDelNoPreBLock(Function *func) { break; } // 将这个 Phi 节点中来自不可达前驱(unreachableBlock)的输入参数删除 - dynamic_cast(phiInstPtr.get())->delBlk(unreachableBlock); + dynamic_cast(phiInstPtr.get())->removeIncomingBlock(unreachableBlock); } } } @@ -311,7 +311,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder *pBuilder) { // 找到在空块链中导致 currentDefBlock 的那个前驱块 if (emptyBlockRedirectMap.count(incomingBlock) || incomingBlock == currentBlock) { // 递归追溯该传入值 - return getUltimateSourceValue(phi->getIncomingValue(incomingBlock), incomingBlock); + return getUltimateSourceValue(phi->getValfromBlk(incomingBlock), incomingBlock); } } } @@ -354,7 +354,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder *pBuilder) { if (actualEmptyPredecessorOfS) { // 获取 Phi 节点原本从 actualEmptyPredecessorOfS 接收的值 - Value *valueFromEmptyPredecessor = phiInst->getIncomingValue(actualEmptyPredecessorOfS); + Value *valueFromEmptyPredecessor = phiInst->getValfromBlk(actualEmptyPredecessorOfS); // 追溯这个值,找到它在非空块中的最终来源 // currentBlock 是 P @@ -364,12 +364,13 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder *pBuilder) { // 替换 Phi 节点的传入块和传入值 if (ultimateSourceValue) { // 确保成功追溯到有效来源 - phiInst->replaceIncoming(actualEmptyPredecessorOfS, currentBlock, ultimateSourceValue); + // phiInst->replaceIncoming(actualEmptyPredecessorOfS, currentBlock, ultimateSourceValue); + phiInst->replaceIncomingBlock(actualEmptyPredecessorOfS, currentBlock, ultimateSourceValue); } else { assert(false && "[DelEmptyBlock] Unable to trace a valid source for Phi instruction"); // 无法追溯到有效来源,这可能是个错误或特殊情况 // 此时可能需要移除该 Phi 项,或者插入一个 undef 值 - phiInst->removeIncoming(actualEmptyPredecessorOfS); + phiInst->getValfromBlk(actualEmptyPredecessorOfS); } } } else { @@ -421,7 +422,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder *pBuilder) { if (actualEmptyPredecessorOfS) { // 获取 Phi 节点原本从 actualEmptyPredecessorOfS 接收的值 - Value *valueFromEmptyPredecessor = phiInst->getIncomingValue(actualEmptyPredecessorOfS); + Value *valueFromEmptyPredecessor = phiInst->getValfromBlk(actualEmptyPredecessorOfS); // 追溯这个值,找到它在非空块中的最终来源 // currentBlock 是 P @@ -431,12 +432,13 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder *pBuilder) { // 替换 Phi 节点的传入块和传入值 if (ultimateSourceValue) { // 确保成功追溯到有效来源 - phiInst->replaceIncoming(actualEmptyPredecessorOfS, currentBlock, ultimateSourceValue); + // phiInst->replaceIncoming(actualEmptyPredecessorOfS, currentBlock, ultimateSourceValue); + phiInst->replaceIncomingBlock(actualEmptyPredecessorOfS, currentBlock, ultimateSourceValue); } else { assert(false && "[DelEmptyBlock] Unable to trace a valid source for Phi instruction"); // 无法追溯到有效来源,这可能是个错误或特殊情况 // 此时可能需要移除该 Phi 项,或者插入一个 undef 值 - phiInst->removeIncoming(actualEmptyPredecessorOfS); + phiInst->removeIncomingBlock(actualEmptyPredecessorOfS); } } } else { @@ -481,7 +483,7 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder *pBuilder) { if (actualEmptyPredecessorOfS) { // 获取 Phi 节点原本从 actualEmptyPredecessorOfS 接收的值 - Value *valueFromEmptyPredecessor = phiInst->getIncomingValue(actualEmptyPredecessorOfS); + Value *valueFromEmptyPredecessor = phiInst->getValfromBlk(actualEmptyPredecessorOfS); // 追溯这个值,找到它在非空块中的最终来源 // currentBlock 是 P @@ -491,12 +493,13 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder *pBuilder) { // 替换 Phi 节点的传入块和传入值 if (ultimateSourceValue) { // 确保成功追溯到有效来源 - phiInst->replaceIncoming(actualEmptyPredecessorOfS, currentBlock, ultimateSourceValue); + // phiInst->replaceIncoming(actualEmptyPredecessorOfS, currentBlock, ultimateSourceValue); + phiInst->replaceIncomingBlock(actualEmptyPredecessorOfS, currentBlock, ultimateSourceValue); } else { assert(false && "[DelEmptyBlock] Unable to trace a valid source for Phi instruction"); // 无法追溯到有效来源,这可能是个错误或特殊情况 // 此时可能需要移除该 Phi 项,或者插入一个 undef 值 - phiInst->removeIncoming(actualEmptyPredecessorOfS); + phiInst->removeIncomingBlock(actualEmptyPredecessorOfS); } } } else { @@ -647,7 +650,7 @@ bool SysYCFGOptUtils::SysYCondBr2Br(Function *func, IRBuilder *pBuilder) { break; } // 使用 delBlk 方法删除 basicblock.get() 对应的传入值 - dynamic_cast(phiinst.get())->removeIncoming(basicblock.get()); + dynamic_cast(phiinst.get())->removeIncomingBlock(basicblock.get()); } } else { // cond为false或0 @@ -665,7 +668,7 @@ bool SysYCFGOptUtils::SysYCondBr2Br(Function *func, IRBuilder *pBuilder) { break; } // 使用 delBlk 方法删除 basicblock.get() 对应的传入值 - dynamic_cast(phiinst.get())->removeIncoming(basicblock.get()); + dynamic_cast(phiinst.get())->removeIncomingBlock(basicblock.get()); } } } diff --git a/src/midend/SysYIRPrinter.cpp b/src/midend/SysYIRPrinter.cpp index 9a0f427..3706ff4 100644 --- a/src/midend/SysYIRPrinter.cpp +++ b/src/midend/SysYIRPrinter.cpp @@ -512,9 +512,9 @@ void SysYPrinter::printInst(Instruction *pInst) { if (!firstPair) std::cout << ", "; firstPair = false; std::cout << "[ "; - printValue(phiInst->getValue(i)); + printValue(phiInst->getIncomingValue(i)); std::cout << ", %"; - printBlock(phiInst->getBlock(i)); + printBlock(phiInst->getIncomingBlock(i)); std::cout << " ]"; } std::cout << std::endl;