单一静态赋值形式的全局变量
Global variables in Single Static Assignment Form
我正在开发一个编译器,该编译器将 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 函数所指的下标问题。
非常感谢,
本
经典 SSA 并不真正涵盖全局变量,或任何其他可能由您看不到的代码读写的内存位置。有一些扩展试图覆盖堆内存,但您似乎并没有追求其中之一。
作为比较点,LLVM 不会尝试将全局变量带入 SSA 形式。全局变量是一个内存位置,它的 "name" 是指向该内存位置的 指针 ,因此访问全局变量是一个普通的 load/store 操作。
我正在开发一个编译器,该编译器将 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 函数所指的下标问题。
非常感谢, 本
经典 SSA 并不真正涵盖全局变量,或任何其他可能由您看不到的代码读写的内存位置。有一些扩展试图覆盖堆内存,但您似乎并没有追求其中之一。
作为比较点,LLVM 不会尝试将全局变量带入 SSA 形式。全局变量是一个内存位置,它的 "name" 是指向该内存位置的 指针 ,因此访问全局变量是一个普通的 load/store 操作。