我正在为一种自制语言编写编译器,该编译器只能处理int值,即i32
。条件和表达式类似于C语言。因此,我将条件语句视为表达式,即它们返回一个int值。它们也可以在表达式中使用,例如(2 > 1) + (3 > 2)
将返回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
,正如here by Ismail Badawi所指出的,我使用了IRBuilder::CreateIntCast
。所以,如果v
是指向导致Value *
的表达式的i1
指针,我做了以下操作将其转换为i32
:
v = Builder.CreateIntCast(v, Type::getInt32Ty(getGlobalContext()), true);
但是,不能将
i32
转换为i1
。它将截断该值到最低有效位。因此i32 2
将产生i1 0
。我需要i1 1
为非零i32
。如果v
是指向导致Value *
的表达式的i32
指针,则我按照以下说明将其转换为i1
:v = Builder.CreateICmpNE(v, ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 0, true))
关于LLVM IR : C++ API : Typecast from i1 to i32 and i32 to i1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47264133/