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
值。
- 现在,我想在每个条件语句之后,把
i1
转换成i32
,这样我就可以进行二元运算了
- 此外,我想使用变量和表达式结果作为条件,例如
if(variable)
或 if(a + b)
。为此,我需要将 i32
转换为 i1
最后,我想要一种从 i1
到 i32
以及从 i32
到 i1
的类型转换的方法。到目前为止,我的代码出现了这些类型的错误:
对于像 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))
我正在为一种只能处理 int 值的自制语言编写编译器,即 i32
。条件和表达式类似于C语言。因此,我将条件语句视为表达式,即它们 return 一个 int 值。它们也可以用在表达式中,例如 (2 > 1) + (3 > 2)
will return 2
。但是 LLVM 条件输出 i1
值。
- 现在,我想在每个条件语句之后,把
i1
转换成i32
,这样我就可以进行二元运算了 - 此外,我想使用变量和表达式结果作为条件,例如
if(variable)
或if(a + b)
。为此,我需要将i32
转换为i1
最后,我想要一种从 i1
到 i32
以及从 i32
到 i1
的类型转换的方法。到目前为止,我的代码出现了这些类型的错误:
对于像 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))