llvm在不映射的情况下进行复制

llvm在不映射的情况下进行复制,llvm,Llvm,我正在做一个优化过程,用一个参数更少的重复函数替换现有函数。 通过使用function::Create初始化并使用CloneBasicBlock复制现有函数的每个块,可以创建重复函数。打印出来似乎没问题,但会导致“引用另一个函数中的参数!”错误 CloneBasicBlock上的文档描述了“返回的块是指定基本块的精确副本,没有任何重新映射”,这似乎是原因,但我找不到问题的解决方案 我试图查看有关模块、函数、函数类型、ValueMapper和其他一些的llvm文档,但没有找到答案。使模块在打印输出

我正在做一个优化过程,用一个参数更少的重复函数替换现有函数。 通过使用function::Create初始化并使用CloneBasicBlock复制现有函数的每个块,可以创建重复函数。打印出来似乎没问题,但会导致“引用另一个函数中的参数!”错误

CloneBasicBlock上的文档描述了“返回的块是指定基本块的精确副本,没有任何重新映射”,这似乎是原因,但我找不到问题的解决方案

我试图查看有关模块、函数、函数类型、ValueMapper和其他一些的llvm文档,但没有找到答案。使模块在打印输出上清晰可见是我的意图

下面是从F.getParent()打印输出获得的更改后的代码,错误如下。我正在将@0上调用的用法转换为@use\u now\u寄存器

以下是代码的相关部分

Value* arg1 = dyn_cast<Value>(F.getArg(0));
  Value* arg2 = dyn_cast<Value>(F.getArg(1));
  ValueToValueMapTy VMap;
  auto *I64Ty = Type::getInt64Ty(Context);

  vector<Type*> ArgTypes;
  ArgTypes.push_back(I64Ty);

  FunctionType *ftype = FunctionType::get(F.getFunctionType()->getReturnType(), ArgTypes, false);
  Function *func = Function::Create(ftype, F.getLinkage());
  func->copyAttributesFrom(&F);
  func->takeName(&F);
  F.getParent()->getFunctionList().push_back(func);

  for (auto &Arg : func->args()){
    Arg.setName("merged"); //testing on one Arg only
  }

  for (auto &BB : F){
    auto *clone = CloneBasicBlock(&BB, VMap);
    func->getBasicBlockList().push_back(clone);
  }

  Instruction* X = BinaryOperator::Create(Instruction::AShr, func->getArg(0), ConstantInt::get(func->getArg(0)->getType(), 32), "tmp1");
  Instruction* Y = BinaryOperator::Create(Instruction::And, func->getArg(0), ConstantInt::get(func->getArg(0)->getType(), 4294967295), "tmp2");
  Instruction* X_trunc = CastInst::Create(Instruction::Trunc, X, arg1->getType(), arg1->getName());
  Instruction* Y_trunc = CastInst::Create(Instruction::Trunc, Y, arg2->getType(), arg2->getName());

  Y_trunc->insertBefore(&func->getEntryBlock().front());
  X_trunc->insertBefore(Y_trunc);
  Y->insertBefore(X_trunc);
  X->insertBefore(Y);

  return func;
Value*arg1=dyn_cast(F.getArg(0));
值*arg2=dyn_cast(F.getArg(1));
ValueToValueMapTy VMap;
auto*I64Ty=Type::getInt64Ty(上下文);
向量类型;
ArgTypes.push_back(I64Ty);
FunctionType*ftype=FunctionType::get(F.getFunctionType()->getReturnType(),ArgTypes,false);
Function*func=Function::Create(ftype,F.getLinkage());
func->copyAttributesFrom(&F);
func->takeName(&F);
F.getParent()->getFunctionList().向后推(func);
用于(自动&Arg:func->args()){
Arg.setName(“合并”);//仅在一个Arg上测试
}
用于(自动和BB:F){
自动*clone=CloneBasicBlock(&BB,VMap);
func->getBasicBlockList()。向后推(克隆);
}
指令*X=BinaryOperator::Create(指令::AShr,func->getArg(0),ConstantInt::get(func->getArg(0)->getType(),32),“tmp1”);
指令*Y=BinaryOperator::Create(指令::And,func->getArg(0),ConstantInt::get(func->getArg(0)->getType(),4294967295),“tmp2”);
指令*X_trunc=CastInst::Create(指令::trunc,X,arg1->getType(),arg1->getName());
指令*Y_trunc=CastInst::Create(指令::trunc,Y,arg2->getType(),arg2->getName());
Y_trunc->insertBefore(&func->getEntryBlock().front());
X\u trunc->insertBefore(Y\u trunc);
Y->insertBefore(X_trunc);
X->insertBefore(Y);
返回函数;

如果您对相关文档/方法有任何建议或建议,我们将不胜感激。

您的问题是CloneBasicBlock完全按照其名称进行操作,您需要的是稍有不同的东西:您需要一个在大多数方面都相同的克隆,但有两点不同:当原始函数引用原始函数中的参数或基本块时,您希望克隆引用副本中的参数或基本块


您最好的选择是看CulnBasic Buffor()是如何实现的,并编写类似的方法,但是调用一个额外的循环,调用<代码> GETOffATAND()/CUT>来考虑每个指令的每个操作数,并执行<代码>(isa.

您的问题是CloneBasicBlock完全按照其名称执行,您想要的是稍有不同的东西:您想要一个在大多数方面相同,但在两个方面不同的克隆:当原始函数引用原始函数中的参数或基本块时,您想要克隆引用t中的参数或基本块他抄袭了

您最好的选择是看CulnBasic Buffor()是如何实现的,并编写类似的东西,但是调用一个额外的循环,调用<代码> GETOffATAND()/Cord>来考虑每个指令的每个操作数,如果是(iS.< /P>),请执行<代码>。