首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >llvm-IR中的phi指令语义

llvm-IR中的phi指令语义
EN

Stack Overflow用户
提问于 2019-03-13 22:59:29
回答 1查看 967关注 0票数 3

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

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

让我们看一下下面的例子:

代码语言:javascript
复制
 ; 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进行编译

代码语言:javascript
复制
 $ 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指令的描述中,我无法理解它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-13 23:31:17

当从块A到块B有多条边时,B中的PHI节点必须列出A与边数一样多的次数,每次都使用相同的值。在您的示例中,从entryL1有两条边(一条用于交换机的默认情况,另一条用于1种情况),因此entry需要在PHI节点中列出两次。

但在这种情况下,也许更干净的解决方案是从交换机上移除[i32 1, label %L1]外壳,因为这无论如何都是多余的。那么就只有一条边了,你只需要为entry输入一个条目。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55144976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档