LLVM IR:C++ API:从i1到i32和i32到i1的Typecast

Cha*_*tel 6 llvm llvm-gcc llvm-clang llvm-ir llvm-c++-api

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

  • 现在,我希望在每个条件语句之后,i1应该转换成i32,以便我可以执行二进制操作
  • 另外,我想将变量和表达式结果用作条件,例如if(variable)if(a + b).为此,我需要转换i32i1

最后,我想办法从类型转换i1i32i32i1.我的代码现在提供这些错误:

对于如下声明if(variable):

error: branch condition must have 'i1' type
br i32 %0, label %ifb, label %else
   ^
Run Code Online (Sandbox Code Playgroud)

对于声明 a = b > 3

error: stored value and pointer type do not match
store i1 %gttmp, i32* @a
      ^
Run Code Online (Sandbox Code Playgroud)

有关如何做到这一点的任何建议?

Cha*_*tel 5

我想到了。要转换i1i32,正如指出的伊斯梅尔巴达维在这里,我用IRBuilder::CreateIntCast。所以,如果vValue *指针指向导致的表达i1,我下面将其转换为i32

v = Builder.CreateIntCast(v, Type::getInt32Ty(getGlobalContext()), true);
Run Code Online (Sandbox Code Playgroud)

但同样不能用于转换i32i1. 它会将值截断为最低有效位。所以i32 2会导致i1 0. 我需要i1 1非零i32。如果vValue *指向导致 的表达式的指针i32,我执行以下操作将其转换为i1

v = Builder.CreateICmpNE(v, ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 0, true))
Run Code Online (Sandbox Code Playgroud)