我一直在研究使用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建模。

09-25 18:52