将 i1 类型转换为整数值

5
对于以下分支指令。
br i1 %cmp, label %if.then, label %if.end, !dbg !35

由于 LLVM 是 SSA,我可以直接访问操作数 0,以确定比较是否为真。该类型评估为 i1,但我在提取值(真或假)方面遇到了困难。

BranchInst &I;
Value *val = I.getOperand(0);

类型转换遵循 i1 类型,但是当我尝试将其强制转换为 ConstantInt *cint = dyn_cast<ConstantInt>(val) 时,强制转换似乎不起作用?我该怎么做?

2个回答

10

回答自己的问题

 BranchInst &I;
    Module* module;
    IRBuilder<> irbuilder(&I);
    Value* value = irbuilder.CreateIntCast(I.getCondition(),
Type::getInt32Ty(module->getContext()), false);

这应该将i1转换为i32。


1
你想要一种不同类型的转换 - 在你的代码中使用 cast<> 转换,但是你想要的是在生成的代码中使用 CastInst 转换。布尔值是一位整型,因此你可能需要零扩展。CastInst::Create(CastInst::ZExt, I.getOperand(0), … 应该可以做到。

我不想插入指令,只想转换数值。我已经解决了,我会发布答案。 - webjockey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接