RE: VC.NET 'Optimization'

"Mat Noguchi (BUNGIE)" <[email protected]> Tue, 12 Apr 2005 12:02:57 -0700
Newsgroups gmane.games.devel.windows
Message-ID <1B678752C03CB44AAA5D9C90991EFEEC057A52DC@RED-MSG-42.redmond.corp.microsoft.com>
What worries you? The compiler optimizing out essentially dead code, or
the optimization pass that destroys trivial profiling code?

MSN
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of
yogiwp
Sent: Tuesday, April 12, 2005 11:52 AM
To: [email protected]
Subject: Re: [GD-Windows] VC.NET 'Optimization'

----- Original Message ----- 
From: Kent Quirk 

> fib is declared locally, and no one ever takes its address. The
compiler is pretty safe in assuming 
> that no sane code could possibly affect the value of fib. Similarly,
the fibonacci function only 
> takes a constant argument. If it's in the same source file, it might
even know that the function has 
> no aliasing issues. Consequently, it's reasonable to optimize away the
creation of the fib variable 
> and simply embed the function call in the printf call.
> 
> My guess is that what the compiler did was optimize this to:
> 
> ----------------------------------------------------
>     timer.Restart();
>     printf( "time=%f, result=%d\n", timer.GetElapsed(), fibonacci(42)
);
> ----------------------------------------------------

Yes, this is exactly what happened (disassembly below).
Sigh. I must say that this makes my worry.

Btw, #pragma optimize("a",off) and/or ("w",off) have no effect; it's
still generating the exact same code. Declaring msTime as 'volatile'
does fix it.

------------------------------------------------------------------------
-------
; 5215 :    timer.Restart();

    lea ecx, DWORD PTR _timer$[esp+148]
    call    ?Restart@CRealTimer@Torture@@QAEXXZ ;
Torture::CRealTimer::Restart

; 5216 :    int fib = fibonacci( 42 );
; 5217 :    float msTime = timer.GetElapsed();

    lea ecx, DWORD PTR _timer$[esp+148]
    call    ?GetElapsed@CRealTimer@Torture@@QAEMXZ  ;
Torture::CRealTimer::GetElapsed
    push    41                  ; 00000029H
    call    ?fibonacci@@YAHH@Z          ; fibonacci
    push    40                  ; 00000028H
    mov edx, eax
    call    ?fibonacci@@YAHH@Z          ; fibonacci
    add esp, 8
    add edx, eax

; 5218 :    printf( "msTime=%f, result=%d\n", msTime, fib );

    push    edx
    sub esp, 8
    fstp    QWORD PTR [esp]
    push    OFFSET
FLAT:??_C@_0BG@BEAEGCGA@msTime?$DN?$CFf?0?5result?$DN?$CFd?6?$AA@
    call    _printf
    add esp, 16                 ; 00000010H
------------------------------------------------------------------------
-------
(There are 2 fibonacci() calls because of inlining -- fibonacci() is a
recursive function calling itself twice.)


Yogi Wahyu Prasidha



-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
Gamedevlists-windows mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gamedevlists-windows
Archives:
http://sourceforge.net/mailarchive/forum.php?forum_id=555


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_ide95&alloc_id396&op=click
_______________________________________________
Gamedevlists-windows mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gamedevlists-windows
Archives:
http://sourceforge.net/mailarchive/forum.php?forum_idU5