我一直在研究使用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可以自动将其转换为变异{ {1}}在一般情况下调用基础程序集并避免讨厌的副本?
答案 0 :(得分:1)
SSA表示单个静态分配。它是一种处理应用于寄存器的值语义的方法。每个对象都是一台机器指令的结果。
LLVM提供通用"移动"指令,这很有用,因为在移植8,32,N字节的架构范围内有许多指令。它还提供结构化数据类型和数组,因为将这些内容提升到寄存器很有用,它们可用于表示古怪的高级机器结构。目的不是模拟OOP。