Function* Function::Clone(IRContext* ctx) const { Function* clone = new Function(std::unique_ptr<Instruction>(DefInst().Clone(ctx))); clone->params_.reserve(params_.size()); ForEachParam( [clone, ctx](const Instruction* inst) { clone->AddParameter(std::unique_ptr<Instruction>(inst->Clone(ctx))); }, true); clone->blocks_.reserve(blocks_.size()); for (const auto& b : blocks_) { std::unique_ptr<BasicBlock> bb(b->Clone(ctx)); bb->SetParent(clone); clone->AddBasicBlock(std::move(bb)); } clone->SetFunctionEnd(std::unique_ptr<Instruction>(EndInst()->Clone(ctx))); return clone; }