[LLVMbugs] [Bug 9199] New: Not properly lowering memcpy intrinsic using LDMIA/STMIA on ARM

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Fri Feb 11 04:14:47 PST 2011


           Summary: Not properly lowering memcpy intrinsic using
                    LDMIA/STMIA on ARM
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Backend: ARM
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: vasiliy.korchagin at gmail.com
                CC: llvmbugs at cs.uiuc.edu

llvm emits code for "memcpy" intrinsic on ARM as consecutive ldr/str commands,
and further combines them into ldm/stm with special pass after register
allocation. But ldm/stm commands require registers to go in ascending order,
what is often not so after regalloc, therefore some str/ldr commands remain.
For example such code:

struct Foo {int a, b, c, d; };
void CopyStruct(struct Foo *a, struct Foo *b) { *a = *b; }

compiled to:

ldmia  r1, {r2, r3, r12}
ldr    r1, [r1, #12]
stmia  r0, {r2, r3, r12}
str    r1, [r0, #12]
bx     lr

I ran different tests and always regalloc allocates at least one register not
in ascending order.

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