2

我正在开发一个将 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 函数所指下标的问题。

非常感谢,本

4

1 回答 1

7

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

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

于 2017-05-01T13:41:19.853 回答