[midend]删除前驱后继移除时不存在的检查,phi增加llvm风格接口,重构CFGOpt特别是空块删除的逻辑(待验证)

This commit is contained in:
rain2133
2025-08-01 18:34:43 +08:00
parent a0b69f20fb
commit aef10b48e8
3 changed files with 465 additions and 321 deletions

View File

@@ -569,15 +569,15 @@ void User::replaceOperand(unsigned index, Value *value) {
* phi相关函数
*/
Value* PhiInst::getvalfromBlk(BasicBlock* blk){
refreshB2VMap();
Value* PhiInst::getvalfromBlk(BasicBlock* blk) const {
// refreshB2VMap();
if( blk2val.find(blk) != blk2val.end()) {
return blk2val.at(blk);
}
return nullptr;
}
BasicBlock* PhiInst::getBlkfromVal(Value* val){
BasicBlock* PhiInst::getBlkfromVal(Value* val) const {
// 返回第一个值对应的基本块
for(unsigned i = 0; i < vsize; i++) {
if(getValue(i) == val) {
@@ -591,6 +591,9 @@ void PhiInst::delValue(Value* val){
//根据value删除对应的基本块和值
unsigned i = 0;
BasicBlock* blk = getBlkfromVal(val);
if(blk == nullptr) {
return; // 如果val没有对应的基本块直接返回
}
for(i = 0; i < vsize; i++) {
if(getValue(i) == val) {
break;
@@ -606,6 +609,9 @@ void PhiInst::delBlk(BasicBlock* blk){
//根据Blk删除对应的基本块和值
unsigned i = 0;
Value* val = getvalfromBlk(blk);
if(val == nullptr) {
return; // 如果blk没有对应的值直接返回
}
for(i = 0; i < vsize; i++) {
if(getBlock(i) == blk) {
break;
@@ -618,9 +624,12 @@ void PhiInst::delBlk(BasicBlock* blk){
}
void PhiInst::replaceBlk(BasicBlock* newBlk, unsigned k){
refreshB2VMap();
// refreshB2VMap();
BasicBlock* oldBlk = getBlock(k);
Value* val = blk2val.at(oldBlk);
if(newBlk == oldBlk || oldBlk == nullptr) {
return; // 如果新旧基本块相同,直接返回
}
// Value* val = blk2val.at(getBlock(k));
// 替换基本块
setOperand(2 * k + 1, newBlk);
@@ -630,7 +639,7 @@ void PhiInst::replaceBlk(BasicBlock* newBlk, unsigned k){
}
void PhiInst::replaceold2new(BasicBlock* oldBlk, BasicBlock* newBlk){
refreshB2VMap();
// refreshB2VMap();
Value* val = blk2val.at(oldBlk);
// 替换基本块
delBlk(oldBlk);