试图理解llvm-IR中的phi指令语义
(https://llvm.org/docs/LangRef.html#phi-instruction)
让我们看一下下面的例子:
; Function Attrs: norecurse nounwind
define i32 @main( i32 %argc, i8** %argv) {
entry:
switch i32 %argc, label %L1 [ i32 0, label %L0
i32 1, label %L1 ]
L0:
%x = add i32 %argc, 1
br label %L1
L1:
%y = phi i32 [ %argc, %entry ], [ %x, %L0 ]
%z = sub i32 %y, 1
%w = udiv i32 100, %z
ret i32 %w
}使用clang-7.0.1进行编译
$ clang-7.0.1 -O0 test.ll -o a.out
PHINode should have one entry for each predecessor of its parent basic
block!
%y = phi i32 [ %argc, %entry ], [ %x, %L0 ]
fatal error: error in backend: Broken function found, compilation中止!
当我替换"%y = phi ...“通过"%y = add i32 2,1“成功编译了测试。
这里的问题是关于错误消息:为什么测试中的phi中没有列出所有的前置任务?从LangRef.html# phi -instruction中对phi指令的描述中,我无法理解它。
发布于 2019-03-13 23:31:17
当从块A到块B有多条边时,B中的PHI节点必须列出A与边数一样多的次数,每次都使用相同的值。在您的示例中,从entry到L1有两条边(一条用于交换机的默认情况,另一条用于1种情况),因此entry需要在PHI节点中列出两次。
但在这种情况下,也许更干净的解决方案是从交换机上移除[i32 1, label %L1]外壳,因为这无论如何都是多余的。那么就只有一条边了,你只需要为entry输入一个条目。
https://stackoverflow.com/questions/55144976
复制相似问题