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

  • 现在,我希望在每个条件语句之后,i1应该转换为i32,以便我可以执行二进制操作
  • 另外,我想使用变量和表达式结果作为条件,例如if(variable)if(a + b)。为此,我需要将i32转换为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,正如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/

    10-10 19:35