【问题标题】:Global variables in Single Static Assignment Form单一静态赋值表单中的全局变量
【发布时间】:2017-04-30 23:49:58
【问题描述】:

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

非常感谢, 本

【问题讨论】:

    标签: compiler-construction global-variables ssa


    【解决方案1】:

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

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

    【讨论】:

    • 这种情况是否意味着我们在进行数据流分析和优化时会像数组一样忽略全局变量?
    • @BenJacob 是的,至少对于仅基于 SSA 变量的分析。您仍然可以使用非 SSA 算法来推断可变存储位置(例如,如果两个位置之间没有干预写入,则来自同一地址的两个加载可以被认为是等效的)。正如我所说,SSA 也可以扩展到内存位置,但 LLVM 至少没有实现它们(在 IR 级别;它现在有一个 "memory SSA" 实用程序)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2022-01-28
    • 2012-12-01
    • 1970-01-01
    相关资源
    最近更新 更多