[LLVMbugs] [Bug 1160] NEW: loop code badly optimized
    bugzilla-daemon at cs.uiuc.edu 
    bugzilla-daemon at cs.uiuc.edu
       
    Fri Feb  2 20:41:52 PST 2007
    
    
  
http://llvm.org/bugs/show_bug.cgi?id=1160
           Summary: loop code badly optimized
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Backend: X86
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: nicholas at mxc.ca
This small program produces bad x86 assembly code:
unsigned int huge[2048];
unsigned int target[2048];
extern void foo();
int main(int argc, char *argv[])
{
  foo();
  for (unsigned int i = 0; i < 2048; i++)
  {
    target[i] |= huge[i];
  }
  unsigned int x = 0;
  for (unsigned int i = 0; i < 2048; i++)
  {
    x += target[i];
  }
  return x;
}
There are two problems with the resulting x86 assembly.
For the body of the first loop, LLVM produces:
        movl huge(,%eax,4), %ecx
        orl target(,%eax,4), %ecx
        movl %ecx, target(,%eax,4)
when it should really be loading from huge, then or'ing into target.
In the second loop, LLVM mis-predicts the exit branch, which is inexcusable
seeing as the loop is countable:
.LBB1_5:        #bb23
        cmpl $2048, %ecx
        jne .LBB1_3     #bb15   <--- should be reversed
.LBB1_6:        #bb27
        addl $4, %esp
        ret
.LBB1_3:        #bb15
        addl target(,%ecx,4), %eax
        incl %ecx
        jmp .LBB1_5     #bb23
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
    
    
More information about the llvm-bugs
mailing list