Index: llvm/lib/CodeGen/CodeGenPrepare.cpp =================================================================== --- llvm/lib/CodeGen/CodeGenPrepare.cpp +++ llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -2127,7 +2127,7 @@ // idea unsigned MinSize; Align PrefAlign; - if (TLI->shouldAlignPointerArgs(CI, MinSize, PrefAlign)) { + if (!OptSize && TLI->shouldAlignPointerArgs(CI, MinSize, PrefAlign)) { for (auto &Arg : CI->args()) { // We want to align both objects whose address is used directly and // objects whose address is used in casts and GEPs, though it only makes Index: llvm/test/CodeGen/ARM/memcpy-no-inline.ll =================================================================== --- llvm/test/CodeGen/ARM/memcpy-no-inline.ll +++ llvm/test/CodeGen/ARM/memcpy-no-inline.ll @@ -17,7 +17,7 @@ ; CHECK-NEXT: .pad #32 ; CHECK-NEXT: sub sp, #32 ; CHECK-NEXT: ldr r1, .LCPI0_0 -; CHECK-NEXT: mov r0, sp +; CHECK-NEXT: add.w r0, sp, #1 ; CHECK-NEXT: movs r2, #31 ; CHECK-NEXT: bl __aeabi_memcpy ; CHECK-NEXT: add sp, #32 @@ -36,18 +36,16 @@ define void @bar() #0 { ; CHECK-LABEL: bar: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: .save {r4, r5, r6, lr} -; CHECK-NEXT: push {r4, r5, r6, lr} +; CHECK-NEXT: .save {r7, lr} +; CHECK-NEXT: push {r7, lr} ; CHECK-NEXT: .pad #32 ; CHECK-NEXT: sub sp, #32 -; CHECK-NEXT: ldr r0, .LCPI1_0 -; CHECK-NEXT: mov r1, sp -; CHECK-NEXT: ldm r0!, {r2, r3, r4, r5, r6} -; CHECK-NEXT: stm r1!, {r2, r3, r4, r5, r6} -; CHECK-NEXT: ldrb r0, [r0] -; CHECK-NEXT: strb r0, [r1] +; CHECK-NEXT: ldr r1, .LCPI1_0 +; CHECK-NEXT: add.w r0, sp, #1 +; CHECK-NEXT: movs r2, #21 +; CHECK-NEXT: bl __aeabi_memcpy ; CHECK-NEXT: add sp, #32 -; CHECK-NEXT: pop {r4, r5, r6, pc} +; CHECK-NEXT: pop {r7, pc} ; CHECK-NEXT: .p2align 2 ; CHECK-NEXT: @ %bb.1: ; CHECK-NEXT: .LCPI1_0: Index: llvm/test/CodeGen/ARM/memfunc.ll =================================================================== --- llvm/test/CodeGen/ARM/memfunc.ll +++ llvm/test/CodeGen/ARM/memfunc.ll @@ -377,6 +377,45 @@ ret void } +; Check that alloca arguments are not aligned when the function is minsize +define void @fminsize(i8* %dest, i32 %n) "frame-pointer"="all" minsize { +entry: + ; CHECK-LABEL: fminsize + + ; CHECK: {{add(.w)? r., sp, #27|sub(.w)? r., r(7|11), #17}} + ; CHECK-IOS: bl _memmove + ; CHECK-DARWIN: bl _memmove + ; CHECK-EABI: bl __aeabi_memmove + ; CHECK-GNUEABI: bl memmove + %arr0 = alloca [9 x i8], align 1 + %0 = bitcast [9 x i8]* %arr0 to i8* + call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %0, i32 %n, i1 false) + + ; CHECK: {{add(.w)? r., sp, #(10|14)|sub(.w)? r., r(7|11), #26}} + ; CHECK-IOS: bl _memcpy + ; CHECK-DARWIN: bl _memcpy + ; CHECK-EABI: bl __aeabi_memcpy + ; CHECK-GNUEABI: bl memcpy + %arr1 = alloca [9 x i8], align 1 + %1 = bitcast [9 x i8]* %arr1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %1, i32 %n, i1 false) + + ; CHECK: {{add(.w)? r., sp, #(1|5)|sub(.w)? r., r(7|11), #35}} + ; CHECK-IOS: mov r1, #1 + ; CHECK-IOS: bl _memset + ; CHECK-DARWIN: movs r1, #1 + ; CHECK-DARWIN: bl _memset + ; CHECK-EABI: mov r2, #1 + ; CHECK-EABI: bl __aeabi_memset + ; CHECK-GNUEABI: mov r1, #1 + ; CHECK-GNUEABI: bl memset + %arr2 = alloca [9 x i8], align 1 + %2 = bitcast [9 x i8]* %arr2 to i8* + call void @llvm.memset.p0i8.i32(i8* %2, i8 1, i32 %n, i1 false) + + ret void +} + ; Check that global variables are aligned if they are large enough, but only if ; they are defined in this object and don't have an explicit section. @arr1 = global [7 x i8] c"\01\02\03\04\05\06\07", align 1