LLVM强制转换说明
LLVM Cast Instructions
我有要使用fadd
添加的ConstantInt
和ConstantFP
值。但是,我很难将ConstantInt
转换为fadd
可以接受的浮点数。
以下是代码摘录:
Value* left = ConstantInt::get(Type::getInt64Ty(getGlobalContext()), 12, true);
Value* right = ConstantFP::get(Type::getFloatTy(getGlobalContext()), 11.6);
Instruction* cast = CastInst::Create(Instruction::SIToFP, left, left->getType(), "", currentBlock());
left = cast->getOperand(0);
BinaryOperator::Create(Instruction::FAdd, left, right, "", currentBlock());
其中CCD_ 6返回CCD_。在尝试为此生成操作码后,LLVM抱怨它无法添加这两个值,因为它们不相同。
我是LLVM的新手,所以如果这段代码没有意义,我会接受任何建议。
我通常处理这些事情的方法是查看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_binary(BinaryAst *ast)
{
auto l = codegen(ast->left);
auto r = codegen(ast->right);
switch (ast->op)
{
case parser::token::PLUS:
{
if (l->getType()->getTypeID() == Type::TypeID::DoubleTyID || r->getType()->getTypeID() == Type::TypeID::DoubleTyID)
return b->CreateFAdd(b->CreateSIToFP(l, b->getDoubleTy()), b->CreateSIToFP(r, b->getDoubleTy()));
else
return b->CreateAdd(l, r);
}
}
}
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 16 位到 10 位转换代码说明
- 将get_word转换为功能,不理解说明?
- LLVM:如何将一些指令/内在的指令转换为几个链式说明
- 转换构造函数说明
- LLVM强制转换说明
- C 样式字符串到 std::字符串转换说明
- 关于在处使用字符串:将char转换为字符串的说明
- 转换常量表达式定义的说明
- 对指向函数转换的指针的说明
- c++规范是否说明如何在static_cast/const_cast链中选择用于C风格强制转换的类型?
- 无法'this'指针从'const Line'转换为'Line &'说明?
- 环境变量在一个char*中,说明如何将其转换为std::字符串