llvm 制作没有映射的副本
llvm make copy without mapping
我正在进行优化传递,以用少一个参数的重复函数替换现有函数。
复制函数是通过使用 Function::Create 初始化并少一个参数,并使用 CloneBasicBlock 复制现有函数的每个块来创建的。打印出来好像没问题,但是造成"Referring to an argument in another function!"错误
CloneBasicBlock 上的文档描述了 "The block returned is an exact copy of the specified basic block, without any remapping" 这似乎是原因,但我找不到问题的解决方案。
我试图查看有关模块、函数、函数类型、ValueMapper 和其他一些内容的 llvm 文档,但无法得到答案。使模块在打印输出时明确可见是我的意图。
下面是从F.getParent()打印输出中得到的更改后的代码,下面有错误。我正在将 @0 上的调用转换为 @use_few_register.
下面是代码的相关部分
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;
任何关于相关文件/方法的意见或建议将不胜感激
你的问题是 CloneBasicBlock 确实如它的名字所暗示的那样,你想要一些稍微不同的东西:你想要一个在大多数方面相同但有两点不同的克隆:当原始引用一个参数或基本块时在原始函数中,您希望克隆引用副本中的参数或基本块。
您最好的选择可能是查看 CloneBasicBlock() 的实现方式并编写类似的东西,但是有一个额外的循环调用 getOperand()
来考虑每条指令的每个操作数,并执行 if(isa<Argument>(…){…} elsif(isa<BasicBlock>(…){…}
适当地对待那些。您可能还需要 slightly special treatment of phi nodes.
我正在进行优化传递,以用少一个参数的重复函数替换现有函数。 复制函数是通过使用 Function::Create 初始化并少一个参数,并使用 CloneBasicBlock 复制现有函数的每个块来创建的。打印出来好像没问题,但是造成"Referring to an argument in another function!"错误
CloneBasicBlock 上的文档描述了 "The block returned is an exact copy of the specified basic block, without any remapping" 这似乎是原因,但我找不到问题的解决方案。
我试图查看有关模块、函数、函数类型、ValueMapper 和其他一些内容的 llvm 文档,但无法得到答案。使模块在打印输出时明确可见是我的意图。
下面是从F.getParent()打印输出中得到的更改后的代码,下面有错误。我正在将 @0 上的调用转换为 @use_few_register.
下面是代码的相关部分
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;
任何关于相关文件/方法的意见或建议将不胜感激
你的问题是 CloneBasicBlock 确实如它的名字所暗示的那样,你想要一些稍微不同的东西:你想要一个在大多数方面相同但有两点不同的克隆:当原始引用一个参数或基本块时在原始函数中,您希望克隆引用副本中的参数或基本块。
您最好的选择可能是查看 CloneBasicBlock() 的实现方式并编写类似的东西,但是有一个额外的循环调用 getOperand()
来考虑每条指令的每个操作数,并执行 if(isa<Argument>(…){…} elsif(isa<BasicBlock>(…){…}
适当地对待那些。您可能还需要 slightly special treatment of phi nodes.