llvm-IR中的phi指令语义

问题描述 投票:1回答:1

试图理解llvm-IR中的phi指令语义

(Qazxswpoi)

让我们考虑以下示例:

https://llvm.org/docs/LangRef.html#phi-instruction

用clang-7.0.1编译

 ; 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
 }

中止!

当我用“%y = add i32 2,1”替换“%y = phi ...”时,测试编译成功。

这里的问题是关于错误信息:为什么不是所有的前辈都在测试中列入phi?从LangRef.html中的phi指令描述#phi-instruction我无法理解。

llvm llvm-ir
1个回答
0
投票

当从块A到块B存在多个边缘时,B中的PHI节点必须列出与边缘一样多的次数,每次都具有相同的值。在你的情况下,有两条边从 $ 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 entry(一个用于交换机的默认情况,一个用于1个情况),因此L1需要在PHI节点中列出两次。

但也许在这种情况下更清洁的解决方案是从您的开关中删除entry案例,因为这是多余的。然后只有一个边缘,你只需要一个条目为[i32 1, label %L1]

© www.soinside.com 2019 - 2024. All rights reserved.