我正在编写一个自制语言的编译器,它只能处理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
^
有关如何做到这一点的任何建议吗?
答案 0 :(得分:2)
我明白了。要按照here by Ismail Badawi指出要从i1
转换为i32
,我使用了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))