Devo evitare di usare l'istruzione "insertvalue" combinata con load e store quando emetto il codice LLVM? Ricevo sempre codice nativo ottimizzato male quando lo uso. Guardate il seguente esempio:LLVM valore di inserimento non ottimale?
; 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
}
Quando eseguo "llc -o - -O3 mod.ll", ottengo questo codice orribile:
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
Ma quello che mi piacerebbe vedere è questo :
func: # @func
.Ltmp0:
.cfi_startproc
# BB#0: # %entry
movq aa(%rip), %rax
movq $3, 24(%rax)
ret
Certo che posso usare getelementptr o qualcosa del genere, ma a volte è più facile per generare istruzioni insertvalue e extractvalue, e voglio questi per essere ottimizzato ...
penso che sarebbe molto facile per il codegen di vedere che le cose come queste sono cattive:
movq 56(%rax), %rsi
movq %rsi, 56(%rax)
quale versione di LLVM stai usando? – CAFxX
Io uso la versione 3.0 – Emil