gpt4 book ai didi

LLVM IR : C++ API : Typecast from i1 to i32 and i32 to i1

转载 作者:行者123 更新时间:2023-12-01 23:30:36 24 4
gpt4 key购买 nike

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

  • 现在,我希望在每个条件语句之后,应将 i1 转换为 i32,以便我可以执行二进制运算
  • 此外,我想使用变量和表达式结果作为条件,例如if(变量)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 是指向导致 i1 的表达式的 Value * 指针,我按照以下步骤将其转换为 i32:

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

但同样不能将 i32 转换为 i1。它将将该值截断为最低有效位。因此,i32 2 将导致 i1 0。我需要 i1 1 来表示非零 i32。如果 vValue * 指针,指向导致 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com