我一直在研究使用 SSA 指定的 IR 代码 - 特别是以这种形式生成 LLVM IR。但是,当出现具有非平凡复制语义的类型时,我对这是否有效感到困惑。例如,
void f() {
std::string s = "Too long for you, short string optimization!";
std::string s1 = s + " Also, goodbye SSA.";
some_other_function(s1);
}
在这种 SSA 形式中,至少在最明显的层面上,这会导致令人讨厌的拷贝困惑(即使对于 C++)。像 LLVM 这样的优化器真的可以准确地优化这种情况吗?即使对于具有非平凡复制/赋值/等语义的类型,SSA 是否可行?
编辑:问题是,如果我使用一个LLVM SSA寄存器来表示一个复杂类型(在本例中,std:string
),这里通过手动使其成为SSA来表示,LLVM是否可以自动翻译在一般情况下,这会变成底层程序集中的变异 +=
调用并避免令人讨厌的拷贝?
最佳答案
SSA 表示单一静态赋值。这是一种处理应用于寄存器的值语义的方法。每个对象都是一条机器指令的结果。
LLVM 提供了一个通用的“移动”指令,这很有用,因为在架构范围内有许多指令可以移动 8、32、N 字节。它还提供结构化数据类型和数组,因为将这些东西提升到寄存器很有用,它们可用于表示古怪的高级机器构造。目的不是为 OOP 建模。
关于c++ - SSA 形式在多大程度上允许具有非平凡复制的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10961506/