33得票14回答
你是否发现你仍需要可更改的变量?如果是,为什么?

我听到过反对函数式语言的一个观点是,单赋值编程太难了,或者至少比“正常”编程要困难得多。 但是看着我的代码,我意识到如果你使用一个相当现代化的语言编写,那么我真的没有许多(或任何?)不能用单赋值形式编写的使用模式。 那么,在作用域的单个调用中变化的变量有哪些用例呢?请记住,循环索引、参数和...

18得票2回答
将SSA转换为堆栈机

我们都知道如何将代码从SSA表示法转换为寄存器机器码。 (基本上,图形着色寄存器分配是这种转换的核心。) 但是,将代码从SSA转换为堆栈机器有什么通用方法吗?(在我正在查看的情况下,是CIL字节码。)考虑到不需要寄存器分配,我预计这会更简单一些。

15得票2回答
LLVM opt mem2reg没有效果

我目前在研究LLVM,并尝试编写一些优化器,以便熟悉opt和clang。我编写了一个名为test.c的文件,内容如下:int foo(int aa, int bb, int cc){ int sum = aa + bb; return sum/cc; } 我编译了源代码并生成了...

10得票1回答
堆栈机代码的SSA

我正在为一个栈机(具体来说是CIL)编写编译器,我已经将代码解析成基本块的图形。从这里开始,我想对方法应用SSA,但进展不顺。我的第一次尝试(在使用平面列表而不是图形时)是遍历代码并保留SSA ID的堆栈(即分配目标),当我生成分配时将它们推入堆栈中,并在使用时将它们弹出。这对于单个基本块很好...

9得票1回答
我能否将抽象语法树翻译成静态单赋值形式,还是需要先将其转换成控制流图再转换成静态单赋值形式?

我能直接将抽象语法树转换成静态单赋值形式(SSA),还是需要创建控制流图(CFG),然后从该CFG创建静态单赋值形式? 在控制流图的上下文中:如何为类似于C的程序表示这个问题?我考虑存储每个函数中所有基本块的CFG图,但是当我调用函数时,这可能会使事情复杂化。另一种我能想到的方式是整个程序的...

8得票1回答
LLVM IR中的 `select` 和 `phi` 有什么区别?

例如,我有一个C代码: void foo(int x) { int y; if (x > 0) { y = 1; } else { y = 2; } // do something with y } 为了简化L...

8得票1回答
如何生成LLVM SSA格式

我写了以下C代码,变量X被赋值了两次: int main() { int x; x = 10; x = 20; return 0; } 使用以下命令进行编译并生成IR表示: clang -emit-llvm -c ssa....