c++ - SSA 形式在多大程度上允许具有非平凡复制的类型?

标签 c++ llvm ssa

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

相关文章:

haskell - 您是否发现仍然需要可以更改的变量,如果需要,为什么?

compiler-construction - 在基本 block 中包含原子值

c++ - 如何从文本文件中读取多个单词?

c++ - 在 C++ linux 中将字符串写入串口

c++ - 使用 cin 时的内存损坏 >>

haskell - 将 G-Machine 源转换为 LLVM IR

python - 为什么我收到错误 : command 'llvm-gcc-4.2' failed with exit status 1

c++ - 与 LLVM JIT 代码共享 C++ 指针

Java RSASSA-PKCS1 操作指南

c++ - windows编程,如何在dll中创建一个可以将所有数据类型作为输入的函数?