LLVM-вставка плохо оптимизирована?

Следует ли мне избегать использования инструкции 'insertvalue' в сочетании с загрузкой и сохранением при выдаче кода LLVM? Я всегда получаю плохой оптимизированный нативный код, когда использую его. Посмотрите на следующий пример:

; 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)

Ответы на вопрос(1)

Ваш ответ на вопрос