C++ LLVM强制转换指令

C++ LLVM强制转换指令,c++,llvm,llvm-c++-api,C++,Llvm,Llvm C++ Api,我有ConstantInt和ConstantFP值,我想使用fadd添加这些值。但是,我无法将ConstantInt转换为fadd可以接受的浮点数 以下是代码的摘录: 其中currentBlock()返回一个BasicBlock。在尝试为此生成操作码后,LLVM抱怨无法添加这两个值,因为它们不相同 我对LLVM很陌生,所以如果这个代码没有意义,我会采纳任何建议。 < P>我通常的方法是看Clang生成什么——LLVM IR和C++ API调用(C++后端)。为了简单起见,您可以使用。因此,编译

我有
ConstantInt
ConstantFP
值,我想使用
fadd
添加这些值。但是,我无法将
ConstantInt
转换为
fadd
可以接受的浮点数

以下是代码的摘录:

其中
currentBlock()
返回一个
BasicBlock
。在尝试为此生成操作码后,LLVM抱怨无法添加这两个值,因为它们不相同


<>我对LLVM很陌生,所以如果这个代码没有意义,我会采纳任何建议。

< P>我通常的方法是看Clang生成什么——LLVM IR和C++ API调用(C++后端)。为了简单起见,您可以使用。因此,编译此C代码:

float foo(int a, float b) {
  return a + b;
}
给我这个LLVM IR:

define float @foo(i32 %a, float %b) #0 {
entry:
  %conv = sitofp i32 %a to float
  %add = fadd float %conv, %b
  ret float %add
}

这是需要重新创建C++的API调用:

 // Function: foo (func_foo)
 {
  Function::arg_iterator args = func_foo->arg_begin();
  Value* int32_a = args++;
  int32_a->setName("a");
  Value* float_b = args++;
  float_b->setName("b");

  BasicBlock* label_entry = BasicBlock::Create(mod->getContext(), "entry",func_foo,0);

  // Block entry (label_entry)
  CastInst* float_conv = new SIToFPInst(int32_a, Type::getFloatTy(mod->getContext()), "conv", label_entry);
  BinaryOperator* float_add = BinaryOperator::Create(Instruction::FAdd, float_conv, float_b, "add", label_entry);
  ReturnInst::Create(mod->getContext(), float_add, label_entry);   
 }
您可以自由地调整输入C代码(即用常量替换变量等),并查看Clang/LLVM发出什么。当您不太熟悉IR和API时,这是找到解决它的最佳/最快方法。

问题在于:

Instruction* cast = CastInst::Create(Instruction::SIToFP, left, left->getType(), "", currentBlock());
您将
left
强制转换为
left->getType()
,即,您什么也没做。改为强制转换为
right->getType()

Instruction* cast = CastInst::Create(Instruction::SIToFP, left, right->getType(), "", currentBlock());
LLVM 12

Value*cg\u二进制(BinaryAst*ast)
{
自动l=codegen(ast->left);
自动r=codegen(ast->右侧);
开关(ast->op)
{
大小写分析器::令牌::加号:
{
如果(l->getType()->getTypeID()==Type::TypeID::DoubleTyID | | r->getType()->getTypeID()==Type::TypeID::DoubleTyID)
返回b->CreateFAdd(b->CreateSIToFP(l,b->getDoubleTy()),b->CreateSIToFP(r,b->getDoubleTy());
其他的
返回b->CreateAdd(l,r);
}
}
}

啊,这是一个非常好的工具。我可以用它(和你的例子)来调试我的问题。谢谢
Instruction* cast = CastInst::Create(Instruction::SIToFP, left, right->getType(), "", currentBlock());