LLVM Cast Instructions(LLVM强制转换指令)
本文介绍了LLVM强制转换指令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有要使用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());
WHEREcurrentBlock()返回BasicBlock。在尝试为此生成操作码之后,LLVM抱怨它无法将这两个值相加,因为它们不相同。
我对LLVM比较陌生,因此如果此代码没有任何意义,我将听取任何建议。
Clang
我处理这些事情的通常方法是查看推荐答案生成什么-LLVMIR和C++API调用(C++后端)。为简单起见,您可以使用online instance。因此,编译这段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代码(例如,用常量替换var等)并查看Clang/LLVM发出的内容。当您不太熟悉IR和API时,这是最好/最快的方法。
这篇关于LLVM强制转换指令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:LLVM强制转换指令
基础教程推荐
猜你喜欢
- 与 CAS 的原子交换(使用 gcc 同步内置函数) 2022-01-01
- c++ STL设置差异 2022-01-01
- 如何更改 SysDateTimePick32 或 CDateTimeCtrl 的背景颜色? 2022-01-01
- 如何在 C++ 中正确使用命名空间? 2022-01-01
- C++:获取传递给函数的多维数组的行大小 2021-01-01
- 提升 ASIO 流缓冲 2021-01-01
- 将不可复制的闭包对象传递给 std::function 参数 2021-01-01
- 随机插入/删除的综合向量与链表基准 2022-01-01
- 如何部分禁用 cmake C/C++ 自定义编译器检查 2021-01-01
- 为什么我们不能使用“虚拟继承"?在 COM 中? 2022-01-01
