Compiler construction 单一静态赋值形式的全局变量

Compiler construction 单一静态赋值形式的全局变量,compiler-construction,global-variables,ssa,Compiler Construction,Global Variables,Ssa,我正在开发一个编译器,它将SSA用于包含全局变量的语言。我想知道我应该如何实现全局变量的使用和定义,例如,我应该如何转换下面的代码 非SSA表格: x; y; main () { x = 0; foo(); y = x; x = 2; foo(); } foo () { print x; x = 1; } 在SSA表格中,有些地方我不确定要使用的下标: main () { x.0 = 0; foo() y.0 = x.? x.1 = 2; f

我正在开发一个编译器,它将SSA用于包含全局变量的语言。我想知道我应该如何实现全局变量的使用和定义,例如,我应该如何转换下面的代码

非SSA表格:

x;
y;

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

foo () {
  print x;
  x = 1;
}
在SSA表格中,有些地方我不确定要使用的下标:

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

foo () {
  print x.?;
  x.? = 1;
}
我曾考虑过添加phi函数,但这似乎无法解决那些phi函数所指的下标问题

非常感谢,,
Ben

经典的SSA并没有真正涵盖全局变量,也没有涵盖任何其他可能由您看不到的代码读写的内存位置。有一些扩展试图覆盖堆内存,但看起来您并不是在追求这些扩展之一


作为一个比较点,LLVM并不试图将全局变量引入SSA形式。全局变量是一个内存位置,其“名称”是指向该内存位置的指针,因此访问全局变量是一个普通的加载/存储操作。

这种情况是否意味着在执行数据流分析和优化时,我们会像忽略数组一样忽略全局变量?@BenJacob Yes,至少对于仅基于SSA变量的分析。您仍然可以使用非SSA算法来解释可变存储位置(例如,如果两个位置之间没有中间写入,则来自同一地址的两个加载可以被视为等效)。正如我所说,SSA对内存位置也有扩展,但LLVM至少没有实现它们(在IR级别;现在它有一个实用程序)。