基本块参数是否意味着代码局部性?

Do basic block parameters mean code locality?

提问人:rwallace 提问时间:5/14/2022 更新时间:5/15/2022 访问量:173

问:

大多数现代编译器使用某种形式的 SSA 进行内部表示,这需要对值可能来自多个源的变量进行一些表示法。经典版本使用 phi 节点。基本模块参数也是一个选项。据我了解,它们在逻辑上是等价的,块参数可以说是更简洁的,处理代码中的特殊情况更少。

三年前,我偶然发现了这句话,当时 https://www.reddit.com/r/ProgrammingLanguages/comments/9z8qu3/a_new_compiler_backend_called_cranelift_uses/

我必须承认,我自己更喜欢参数传递方法,纯粹是为了更容易调试:参数传递意味着代码局部性。

使用这种风格,与 PHI 节点不同,您可以单独分析每个基本块:

在遥远的土地上没有声明任何变量。

在遥远的土地上,没有变量可能被使用。

嗯?

在我看来,区块参数在这方面与 phi 节点基本相同。变量确实有可能在遥远的土地上使用,即定义和使用可以通过不提及相关变量的块进行任意数量的跳转来分隔,正确性标准是定义必须主导所有使用,就像你使用 phi 节点一样。

我错过了什么吗?

参数 编译器构造 中间语言 SSA

评论


答:

1赞 Davislor 5/15/2022 #1

作为源的来源的 Cranelift 文档是一个死链接。

但是,您似乎在询问与 phi 函数或基本块参数等表示正交的东西:如何处理外部范围内的定义。这些参数可以直接或间接地作为φ函数或基本块的额外参数传递。事实上,你的φ函数将由基本块组成。

假设您有一个表达式,例如 ,其中 是一个局部变量,并且位于某个外部范围内。如果你让它成为你生成的局部φ函数的参数,你确实可以防止在遥远的土地上被定义。也就是说,您可以编译此代码,就好像您调用了内联函数一样,以便它捕获所需的所有状态。这甚至可以有效地编译,如果你有一个好的内联函数后端,你可以在这里重用。x*x >= y ? x*x : yxyyphi_1(x,y)

或者,嵌套块或嵌套函数可以引用在外部作用域中定义的变量。

评论

1赞 rici 5/15/2022
更新了 Cranelift 文档 URL