optimization - LLVM 插入值优化不好?

标签 optimization code-generation llvm x86-64

当我发出 LLVM 代码时,我应该避免将“插入值”指令与加载和存储结合使用吗?
当我使用它时,我总是得到糟糕的优化 native 代码。看下面的例子:

; ModuleID = 'mod'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-pc-linux-gnu"

%A = type { i64, i64, i64, i64, i64, i64, i64, i64 }

@aa = external global %A*

define void @func() {
entry:
  %a1 = load %A** @aa
  %a2 = load %A* %a1
  %a3 = insertvalue %A %a2, i64 3, 3
  store %A %a3, %A* %a1
  ret void
}

当我运行“llc -o - -O3 mod.ll”时,我得到了这个可怕的代码:
func:                                   # @func
.Ltmp0:
        .cfi_startproc
# BB#0:                                 # %entry
        movq    aa(%rip), %rax
        movq    (%rax), %r8
        movq    8(%rax), %r9
        movq    16(%rax), %r10
        movq    32(%rax), %rdi
        movq    40(%rax), %rcx
        movq    48(%rax), %rdx
        movq    56(%rax), %rsi
        movq    %rsi, 56(%rax)
        movq    %rdx, 48(%rax)
        movq    %rcx, 40(%rax)
        movq    %rdi, 32(%rax)
        movq    %r10, 16(%rax)
        movq    %r9, 8(%rax)
        movq    %r8, (%rax)
        movq    $3, 24(%rax)
        ret

但我想看到的是:
func:                                   # @func
.Ltmp0:
        .cfi_startproc
# BB#0:                                 # %entry
        movq    aa(%rip), %rax
        movq    $3, 24(%rax)
        ret

当然我可以使用getelementptr什么的,但是有时候生成insertvalue和extractvalue指令比较容易,我希望这些能被优化...

我认为代码生成器很容易看到这样的事情是不好的:
        movq    56(%rax), %rsi
        movq    %rsi, 56(%rax)

最佳答案

首先,请注意 llc 不做任何 IR 级别的优化。因此,您应该运行 opt 来运行一组 IR 级优化器。

但是, opt 在这方面没有帮助。我希望标准的 IR 级优化器以某种方式将这些东西规范化为 gep。

请提交 LLVM PR,这看起来像是错过了优化!

关于optimization - LLVM 插入值优化不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8948879/

相关文章:

c++ - 是否有任何理由使用右值引用来重载运算符?

nhibernate - 代码生成器不好吗?

llvm - LLVM IR 中的调用约定

c++ - 如果不知道数组的大小,LLVM GEP 安全吗?

iphone - 从 Storyboard 文件/NIB 文件上的控件生成的 ID 值背后的逻辑

c++ - LLVM 拒绝编译 C++ 源代码,奇怪的错误

python - map(sum,zip(*list)) 是对任意长度列表的列求和的最快方法吗?

algorithm - 遍历加权边时最大化节点权重和

debugging - gcc LTO 似乎剥离调试符号

java - 如何修复: Jooq code does not generate java code for sqlite in memory db from sql script