http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58041
Mikael Pettersson <mikpe at it dot uu.se> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |wschmidt at gcc dot gnu.org --- Comment #4 from Mikael Pettersson <mikpe at it dot uu.se> --- Started with Bill Schmidt's PR46556 patch in r190037. (Author CC:d.) Comparing the generated code between 190036 and 190037 clearly shows how the misaligned accesses were wrongly replaced by aligned accesses: --- pr58041.s-r190036 2013-08-01 13:30:59.264514025 +0200 +++ pr58041.s-r190037 2013-08-01 13:27:38.874840851 +0200 @@ -18,37 +18,11 @@ @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. - stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, fp} add ip, r0, r1, asl #3 - ldrb r7, [ip, #2] @ zero_extendqisi2 - ldrb r6, [ip, #6] @ zero_extendqisi2 - ldrb r0, [ip, #1] @ zero_extendqisi2 - ldrb r1, [ip, #5] @ zero_extendqisi2 - ldrb r5, [ip, #3] @ zero_extendqisi2 - ldrb r4, [ip, #7] @ zero_extendqisi2 - orr r0, r0, r7, asl #8 - orr r1, r1, r6, asl #8 - ldrb r10, [ip, #4] @ zero_extendqisi2 - ldrb r6, [ip, #8] @ zero_extendqisi2 - mov fp, r2, lsr #8 - orr r0, r0, r5, asl #16 - mov r9, r2, lsr #16 - mov r8, r2, lsr #24 - mov r7, r3, lsr #8 - orr r1, r1, r4, asl #16 - mov r5, r3, lsr #16 - mov r4, r3, lsr #24 - strb fp, [ip, #2] - strb r2, [ip, #1] - strb r9, [ip, #3] - strb r8, [ip, #4] - strb r7, [ip, #6] - strb r3, [ip, #5] - strb r5, [ip, #7] - strb r4, [ip, #8] - orr r0, r0, r10, asl #24 - orr r1, r1, r6, asl #24 - ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, fp} + ldr r0, [ip, #1] + ldr r1, [ip, #5] + str r2, [ip, #1] + str r3, [ip, #5] bx lr .size foo, .-foo .section .text.startup,"ax",%progbits