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

Do basic block parameters mean code locality?

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

我三年前在 https://www.reddit.com/r/ProgrammingLanguages/comments/9z8qu3/a_new_compiler_backend_called_cranelift_uses/

偶然发现了这个评论

I must admit I prefer the parameter-passing approach myself, purely for easier debugging: parameter-passing means code locality.

With this style, and unlike PHI nodes, you can analyze each basic block in isolation:

No variable is declared in a far-away land.

No variable is potentially used in a far-away land.

嗯?

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

我是不是漏掉了什么?

作为您来源的 Cranelift 文档已失效 link。

但是,您似乎在询问与作为 phi 函数或 basic-block 参数的表示形式正交的问题:如何处理外部作用域中的定义。这些可以作为 φ 函数或基本块的额外参数直接或间接传递。事实上,您的 φ-函数将由基本块组成。

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

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