【问题标题】:LLVM IR : C++ API : Typecast from i1 to i32 and i32 to i1LLVM IR:C++ API:从 i1 到 i32 和 i32 到 i1 的类型转换
【发布时间】:2018-04-26 02:58:06
【问题描述】:

我正在为一种只能处理 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
      ^

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

【问题讨论】:

  • TruncInst。我没有立即的答案,但我会编译一个简单的程序到 LLVM IR,看看如何使用 trunc 指令。这个简单的程序必须包含截断 i32 -> i1,以便发出 TruncInst。
  • 反之:i1 -> i32 你很可能需要CastInst
  • IRBuilder::CreateIntCast 将根据需要创建一个 zext / trunc / bitcast。

标签: llvm llvm-clang llvm-ir llvm-gcc llvm-c++-api


【解决方案1】:

我想通了。要将i1 转换为i32,正如here by Ismail Badawi 所指出的那样,我使用了IRBuilder::CreateIntCast。因此,如果vValue * 指向导致i1 的表达式的指针,我执行以下操作将其转换为i32

v = Builder.CreateIntCast(v, Type::getInt32Ty(getGlobalContext()), true);

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

v = Builder.CreateICmpNE(v, ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 0, true))

【讨论】:

    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 2017-09-13
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多