将 i1 类型转换为整数值

Converting i1 type to integer value

对于下面的分支指令

br i1 %cmp, label %if.then, label %if.end, !dbg !35

由于llvm是SSA,我可以直接访问操作数0,判断比较是否为真。该类型的计算结果为 i1,但我无法提取值(真或假)

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

Type 屈服于 i1 类型,但是当我尝试转换为

ConstantInt *cint = dyn_cast<ConstantInt>(val) 选角好像不行?我该怎么做

您想要一种不同类型的强制转换 — 在您的代码中进行强制转换<>,而您想要的是在生成的代码中进行强制转换,CastInst。 Boolean 是一个 one-bit 整数类型,所以你想要的可能是一个零扩展。 CastInst::Create(CastInst::ZExt, I.getOperand(0), … 应该可以。

回答我自己的问题

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

这应该将 i1 转换为 i32。