http://llvm.org/bugs/show_bug.cgi?id=11197

           Summary: varargs is unnecessarily inefficient
           Product: libraries
           Version: trunk
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Common Code Generator Code
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected]


The way LLVM implements varargs is unnecessarily inefficient. It seems to force
the "va_list" variable into memory when it could easily be mapped to a
register.  Is there a way to circumvent this behavior? 

Consider the following test case:

#include <stdarg.h>
void foo(int *p, ...){
    va_list ap;
    va_start(ap,p);
    while(1){
        *p = va_arg(ap,int);
    if (*p == 0) break;
    p++;
    }
}


The ARM target compiles this (at -O3) such that the loop code is quite strange:

.LBB0_3:
        ldr     r2, [sp]          <--- Unnecessary
        add     r0, r0, #4
        add     r1, r2, #4
        str     r1, [sp]          <---- Unnecessary
        ldr     r2, [r2]
        str     r2, [r0]         
        cmp     r2, #0
        bne     .LBB0_3


By contrast, GCC produces a loop that is half the size without the silly load
and store of the va_list variable:

.L3:
        ldr     r0, [r1, #4]!
        cmp     r0, #0
        str     r0, [r2, #4]!
        bne     .L3

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to