[LLVMdev] LLVM Optmizer
Manoel Teixeira
manoel at fonetica.com.br
Tue Jan 6 03:02:51 PST 2009
The following C code :
#include <stdio.h>
#include <stdlib.h>
int TESTE2( int parami , int paraml ,double paramd )
{
int varx=0,vary;
int nI =0;
//varx= parami;
if( parami > 0 )
{
varx = parami;
vary = varx + 1;
}
else
{
varx = vary + 1;
vary = paraml;
}
varx = varx + parami + paraml;
for( nI = 1 ; nI <= paraml; nI++)
{
varx = varx + parami + 1 ;
vary = varx + nI;
}
vary = varx + 5;
varx = vary + paraml;
return varx ;
}
Generates the IR :
; ModuleID = '/tmp/webcompile/_9908_0.bc'
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
target triple = "i386-pc-linux-gnu"
define i32 @TESTE2(i32 %parami, i32 %paraml, double %paramd) nounwind readnone {
entry:
%0 = shl i32 %parami, 1 ; <i32> [#uses=1]
%varx.110 = add i32 %0, %paraml ; <i32> [#uses=2]
%1 = icmp slt i32 %paraml, 1 ; <i1> [#uses=1]
br i1 %1, label %bb5, label %bb3
bb3: ; preds = %bb3, %entry
%indvar = phi i32 [ %indvar.next, %bb3 ], [ 0, %entry ] ; <i32> [#uses=3]
%2 = add i32 %indvar, 2 ; <i32> [#uses=1]
%3 = icmp sgt i32 %2, %paraml ; <i1> [#uses=1]
%indvar.next = add i32 %indvar, 1 ; <i32> [#uses=1]
br i1 %3, label %bb5.loopexit, label %bb3
bb5.loopexit: ; preds = %bb3
%tmp14 = add i32 %parami, 1 ; <i32> [#uses=1]
%tmp15 = mul i32 %indvar, %tmp14 ; <i32> [#uses=1]
%varx.111 = add i32 %tmp15, %varx.110 ; <i32> [#uses=1]
%4 = add i32 %varx.111, %parami ; <i32> [#uses=1]
%phitmp = add i32 %4, 1 ; <i32> [#uses=1]
br label %bb5
bb5: ; preds = %bb5.loopexit, %entry
%varx.1.lcssa = phi i32 [ %varx.110, %entry ], [ %phitmp, %bb5.loopexit ] ; <i32> [#uses=1]
%5 = add i32 %paraml, 5 ; <i32> [#uses=1]
%6 = add i32 %5, %varx.1.lcssa ; <i32> [#uses=1]
ret i32 %6
}
While the MSVC generates the assemble :
PUBLIC _TESTE
; Function compile flags: /Ogtpy
; File c:\msys\1.0\home\mteixeira\testeadvpl.c
; COMDAT _TESTE
_TEXT SEGMENT
_parami$ = 8 ; size = 4
_paraml$ = 12 ; size = 4
_paramd$ = 16 ; size = 8
_TESTE PROC ; COMDAT
; 6 : int varx=0,vary;
; 7 : int nI =0;
; 8 : //varx= parami;
; 9 : if( parami > 0 )
mov ecx, DWORD PTR _parami$[esp-4]
; 10 : {
; 11 : varx = parami;
; 12 : vary = 0;
; 13 : }
; 14 : else
; 15 : {
; 16 : varx = 0;
; 17 : vary = paraml;
; 18 : }
; 19 : for( nI = 1 ; nI <= paraml; nI++)
mov edx, DWORD PTR _paraml$[esp-4]
xor eax, eax
test ecx, ecx
setle al
sub eax, 1
and eax, ecx
cmp edx, 1
jl SHORT $LN3 at TESTE
add ecx, 1
imul ecx, edx
add eax, ecx
$LN3 at TESTE:
; 20 : {
; 21 : varx = varx + parami + 1 ;
; 22 : vary = varx + nI;
; 23 : }
; 24 :
; 25 : return varx ;
; 26 : }
ret 0
_TESTE ENDP
_TEXT ENDS
Running the same code, the objetc generated with MSVC is 600 times faster than that generate with the LLVM compiler
Is threre any way to get the same optimzation with the LLVM?
Manoel Teixeira
More information about the llvm-dev
mailing list