[Issue 1149] New: Optimizer: obsolete array length loads,	common subexpr. elimin. not working
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Sun Apr 15 10:05:39 PDT 2007
    
    
  
http://d.puremagic.com/issues/show_bug.cgi?id=1149
           Summary: Optimizer: obsolete array length loads, common subexpr.
                    elimin. not working
           Product: D
           Version: 1.012
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla at digitalmars.com
        ReportedBy: jascha at mainia.de
consider the following code:
void main()
{
    uint[] arr;
    arr.length = 4;
    arr[0] = 1;
    arr[1] = 1;
    arr[2] = 1;
    arr[3] = 1;
}
for the 4 assignments, "dmd -O -inline" generates
mov     ECX,1
mov     EDX,010h[ESP]
mov     EAX,0Ch[ESP]
mov     [EDX],ECX
mov     EDX,010h[ESP]
mov     EAX,0Ch[ESP]
mov     4[EDX],ECX
mov     EDX,010h[ESP]
mov     EAX,0Ch[ESP]
mov     8[EDX],ECX
mov     EDX,010h[ESP]
mov     EAX,0Ch[ESP]
mov     0Ch[EDX],ECX
instead of
mov     ECX,1
mov     EDX,010h[ESP]
mov     [EDX],ECX
mov     4[EDX],ECX
mov     8[EDX],ECX
mov     0Ch[EDX],ECX
- the length of the array is always loaded, even if it's not used
- the array pointer is loaded multiple times into the same register
the common subexpression elimination appears to be working for the value in
ECX, but not for the pointer in EDX.
-- 
    
    
More information about the Digitalmars-d-bugs
mailing list