单一静态分配表单中的全局变量

Ben*_*cob 1 compiler-construction global-variables ssa

我正在研究一种编译器,它使用SSA作为包含全局变量的语言.我想知道我应该如何实现全局变量的用法和定义,例如我应该如何转换下面的代码?

非SSA表格:

x;
y;

main () {
  x = 0;
  foo();
  y = x;
  x = 2;
  foo();
}

foo () {
  print x;
  x = 1;
}
Run Code Online (Sandbox Code Playgroud)

在SSA形式中,有些地方我不确定要使用的下标:

main () {
  x.0 = 0;
  foo()
  y.0 = x.?
  x.1 = 2;
  foo();
}

foo () {
  print x.?;
  x.? = 1;
}
Run Code Online (Sandbox Code Playgroud)

我曾考虑添加phi函数,但这似乎并没有解决这些phi函数所指的下标问题.

非常感谢,本

小智 6

经典SSA并不真正涵盖全局变量,或任何其他可能由您看不到的代码读取和写入的内存位置.有一些扩展试图覆盖堆内存,但似乎并没有你正在追求其中一个.

作为比较点,LLVM不会尝试将全局变量用于SSA形式.全局变量是内存位置,其"名称"是指向该内存位置的指针,因此访问全局变量是普通的加载/存储操作.

  • 既然如此,是否意味着在执行数据流分析和优化时,我们会像对待数组一样忽略全局变量? (2认同)