2012-01-20 8 views
5

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) 
+0

quale versione di LLVM stai usando? – CAFxX

+0

Io uso la versione 3.0 – Emil

risposta

1

In primo luogo, si noti che llc non fare alcun ottimizzazioni a livello di IR. Quindi, si dovrebbe optare per eseguire il set di ottimizzatori a livello IR.

Tuttavia, opt non aiuta in questo. Mi aspetterei che gli ottimizzatori di livello IR standard possano ufficializzare il materiale in qualche modo.

Si prega di presentare un PR LLVM, questa sembra un'ottimizzazione persa!