LLVM IR:C++ API:从 i1 到 i32 和 i32 到 i1 的类型转换

LLVM IR : C++ API : Typecast from i1 to i32 and i32 to i1

我正在为一种只能处理 int 值的自制语言编写编译器,即 i32。条件和表达式类似于C语言。因此,我将条件语句视为表达式,即它们 return 一个 int 值。它们也可以用在表达式中,例如 (2 > 1) + (3 > 2) will return 2。但是 LLVM 条件输出 i1 值。

最后,我想要一种从 i1i32 以及从 i32i1 的类型转换的方法。到目前为止,我的代码出现了这些类型的错误:

对于像 if(variable) 这样的语句:

error: branch condition must have 'i1' type
br i32 %0, label %ifb, label %else
   ^

对于像 a = b > 3

这样的语句
error: stored value and pointer type do not match
store i1 %gttmp, i32* @a
      ^

关于如何做到这一点有什么建议吗?

我明白了。要从 i1 转换为 i32,正如 所指出的,我使用了 IRBuilder::CreateIntCast。因此,如果 v 是指向导致 i1 的表达式的 Value * 指针,我按照以下步骤将其转换为 i32 :

v = Builder.CreateIntCast(v, Type::getInt32Ty(getGlobalContext()), true);

但同样不能应用于将 i32 转换为 i1。它会将值截断为最低有效位。所以 i32 2 将导致 i1 0。对于非零 i32,我需要 i1 1。如果 v 是指向导致 i32 的表达式的 Value * 指针,我按照以下步骤将其转换为 i1

v = Builder.CreateICmpNE(v, ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 0, true))