https://llvm.org/bugs/show_bug.cgi?id=31232
Bug ID: 31232 Summary: [Thumb2] Rebase ld/st to avoid negative offsets Product: new-bugs Version: trunk Hardware: PC OS: Linux Status: NEW Severity: normal Priority: P Component: new bugs Assignee: unassignedb...@nondot.org Reporter: weimi...@codeaurora.org CC: llvm-bugs@lists.llvm.org Classification: Unclassified given test.c: typedef struct { unsigned char* Src; unsigned char* Dst; unsigned int Len; } ContextType; void test(ContextType* pContext) { unsigned char* Src = (pContext->Src) - 26; unsigned int Offset = (pContext->Len) - 26; unsigned char* pDst = pContext->Dst; unsigned int dest_p1 = *((unsigned int*)(&Src[4])); unsigned short dest_p2 = *((unsigned short*)(&Src[8])); unsigned short src_p1 = *((unsigned short*)(&Src[10])); unsigned int src_p2 = *((unsigned int*)(&Src[12])); unsigned short EType = *((unsigned short*)(&Src[24])); *((unsigned int*)(&pDst[4+Offset])) = dest_p1; *((unsigned short*)(&pDst[8+Offset])) = dest_p2; *((unsigned short*)(&pDst[10+Offset])) = src_p1; *((unsigned int*)(&pDst[12+Offset])) = src_p2; *((unsigned short*)(&pDst[24+Offset])) = EType; } clang -Os -mcpu=cortex-m3 test.c -o llvm.s generates: @ BB#0: @ %entry .save {r4, r6, r7, lr} push {r4, r6, r7, lr} .setfp r7, sp, #8 add r7, sp, #8 ldrd r1, lr, [r0] ldr r0, [r0, #8] ldrh r12, [r1, #-2] ldrh r3, [r1, #-16] ldrh r2, [r1, #-18] ldr r4, [r1, #-22] ldr r1, [r1, #-14] add r0, lr str r4, [r0, #-22] strh r2, [r0, #-18] strh r3, [r0, #-16] str r1, [r0, #-14] strh r12, [r0, #-2] pop {r4, r6, r7, pc} Since the offset are all negative, the ld/st are wide instructions. The expected code are like: subs r1, #26 subs r0, #26 ldrh r12, [r1, #-2] ldrh r3, [r1, #10] ldrh r2, [r1, #8] ldr r4, [r1, #4] ldr r1, [r1, #12] str r4, [r0, #4] strh r2, [r0, #8] strh r3, [r0, #10] str r1, [r0, #12] -- You are receiving this mail because: You are on the CC list for the bug.
_______________________________________________ llvm-bugs mailing list llvm-bugs@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs