将 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。
对于下面的分支指令
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。