|
void User::remove_operands(int index1,int index2){ |
|
for(int i=index1;i<=index2;i++){ |
|
operands_[i].lock()->remove_use(shared_from_this()); |
|
} |
|
operands_.erase(operands_.begin()+index1,operands_.begin()+index2+1); |
|
// std::cout<<operands_.size()<<std::endl; |
|
num_ops_=operands_.size(); |
|
} |
这里的问题在于,假设对于一个 4 个操作数的 phi 指令:%op = phi i32 [ %op1, %label1 ], [ %op2, %label2 ],我们删除第 0 到 1 个操作数,此时会发现原先的第 2 到 3 个操作数变成了第 0 到 1 个操作数,但它们的 use.arg_no_ 仍然是原来的 2 和 3,并没有及时更新。
为了解决这一问题,我们需要将 index2 下标之后的操作数也进行维护:
void User::remove_operands(int index1,int index2){
// index2 之后的也要删,但是要加回去
auto backup = std::vector<Value*>{};
for (int i = index2 + 1; i < num_ops_; i++) {
backup.push_back(operands_[i]);
}
for(int i = index1; i < num_ops_; i++){
operands_[i]->remove_use(this);
}
operands_.erase(operands_.begin() + index1,operands_.begin() + num_ops_);
// std::cout<<operands_.size()<<std::endl;
num_ops_=operands_.size();
for (auto* op: backup) {
add_operand(op);
}
}
patch 可以同步 CodeGen, CodeOpt
IRGen/src/SysYFIR/User.cpp
Lines 54 to 61 in b07aa53
这里的问题在于,假设对于一个 4 个操作数的 phi 指令:
%op = phi i32 [ %op1, %label1 ], [ %op2, %label2 ],我们删除第 0 到 1 个操作数,此时会发现原先的第 2 到 3 个操作数变成了第 0 到 1 个操作数,但它们的use.arg_no_仍然是原来的 2 和 3,并没有及时更新。为了解决这一问题,我们需要将 index2 下标之后的操作数也进行维护:
patch 可以同步 CodeGen, CodeOpt