gpt4 book ai didi

llvm - 在LLVM中输入,我想我不明白优势和phi节点的位置

转载 作者:行者123 更新时间:2023-12-04 04:55:58 26 4
gpt4 key购买 nike

我的目标是在 LLVM 中做一些简单的事情。我想使用 C 库函数 getchar 定义一个从命令行读取输入的 LLVM 函数。这是我的伪代码算法:

getInt:
get a character, set the value to VAL
check if VAL is '-'
if yes then set SGN to -1 and set VAL to the next character else set SGN to 1
set NV = to the next char minus 48
while (NV >= 0) // 48 is the first ASCII character that represents a number
set VAL = VAL*10
set VAL = VAL + NV
set NV to the next char minus 48
return SGN*VAL

所以现在,我想出的 LLVM 代码在我的脑海中是将上述内容转换为 LLVM IR 的最直接的方法。但是,我收到错误
“PHI 节点未分组在基本块的顶部。”如果我移动一些东西来修复这个错误,我会得到关于支配地位的错误。下面是 LLVM IR 代码,它给了我 PHI 节点错误。我相信我误解了 LLVM IR 的一些基本知识,因此非常感谢您提供的任何帮助。
define i32 @getIntLoop() {
_L1:
%0 = call i32 @getchar()
%1 = phi i32 [ %0, %_L1 ], [ %3, %_L2 ], [ %8, %_L4 ]
%2 = icmp eq i32 %1, 45
br i1 %2, label %_L2, label %_L5

_L2: ; preds = %_L1
%3 = call i32 @getchar()
br label %_L3

_L3: ; preds = %_L4, %_L2
%4 = call i32 @getchar()
%5 = icmp slt i32 %4, 40
br i1 %5, label %_L5, label %_L4

_L4: ; preds = %_L3
%6 = sub i32 %4, 48
%7 = mul i32 %1, 10
%8 = add i32 %6, %7
br label %_L3

_L5: ; preds = %_L3, %_L1
br i1 %2, label %_L6, label %_L7

_L6: ; preds = %_L5
%9 = mul i32 -1, %1
ret i32 %9

_L7: ; preds = %_L5
ret i32 %1
}

最佳答案

但是,您收到了一个非常明显的错误。根据 LLVM IR language reference :

There must be no non-phi instructions between the start of a basic block and the PHI instructions: i.e. PHI instructions must be first in a basic block.



您有一个 phiL1这违反了这一点。

为什么它有 %_L1作为其来源之一?没有跳转到 %_L1其他任何地方。我想你应该先了解如何 phi工作,可能通过使用 Clang 将小段 C 代码编译到 LLVM IR 并查看生成的内容。

简而言之,一个 phi需要在 SSA 形式中具有一致性,同时能够将多个值之一分配到同一个寄存器中。请务必阅读 SSA - 它也解释了 Phi 节点。额外的好资源是你应该阅读的 LLVM 教程。特别是 part 5 covers Phis .如上所述,通过 Clang 运行小块 C 是了解事情如何工作的好方法。这绝不是“hacky”——这是科学的方法!您阅读理论,认真思考,形成关于事物如何工作的假设,然后通过运行 Clang 并查看它为现实生活中的控制流生成什么来验证这些假设。

关于llvm - 在LLVM中输入,我想我不明白优势和phi节点的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16754324/

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