Skip to content

IR User.cpp 移除操作数未维护 arg_no_ #2

@liuly0322

Description

@liuly0322

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions