[LLVMbugs] [Bug 11197] New: varargs is unnecessarily inefficient

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Thu Oct 20 12:42:48 PDT 2011


           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: unassignedbugs at nondot.org
        ReportedBy: pickensd at synopsys.com
                CC: llvmbugs at cs.uiuc.edu

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;
        *p = va_arg(ap,int);
    if (*p == 0) break;

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

        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:

        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.

More information about the llvm-bugs mailing list