diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index eb3c741c6ded2..5378ca2a485d4 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -12359,6 +12359,11 @@ ARMTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI, Fn->insert(BBI, RSBBB); Fn->insert(BBI, SinkBB); + // Set the call frame size on entry to the new basic blocks. + unsigned CallFrameSize = TII->getCallFrameSizeAt(MI); + RSBBB->setCallFrameSize(CallFrameSize); + SinkBB->setCallFrameSize(CallFrameSize); + Register ABSSrcReg = MI.getOperand(1).getReg(); Register ABSDstReg = MI.getOperand(0).getReg(); bool ABSSrcKIll = MI.getOperand(1).isKill(); diff --git a/llvm/test/CodeGen/ARM/iabs.ll b/llvm/test/CodeGen/ARM/iabs.ll index fffa9555b2966..758fe7507c0b2 100644 --- a/llvm/test/CodeGen/ARM/iabs.ll +++ b/llvm/test/CodeGen/ARM/iabs.ll @@ -50,3 +50,28 @@ define i64 @test3(i64 %a) { %abs = select i1 %b, i64 %a, i64 %tmp1neg ret i64 %abs } + +declare void @callee(...) + +define void @testcallframe(i32 %a) { +; CHECK-LABEL: testcallframe: +; CHECK: @ %bb.0: @ %bb +; CHECK-NEXT: .save {r11, lr} +; CHECK-NEXT: push {r11, lr} +; CHECK-NEXT: .pad #8 +; CHECK-NEXT: sub sp, sp, #8 +; CHECK-NEXT: cmp r0, #0 +; CHECK-NEXT: mov r1, #0 +; CHECK-NEXT: rsbmi r0, r0, #0 +; CHECK-NEXT: mov r2, #0 +; CHECK-NEXT: mov r3, #0 +; CHECK-NEXT: str r1, [sp] +; CHECK-NEXT: bl callee +; CHECK-NEXT: add sp, sp, #8 +; CHECK-NEXT: pop {r11, lr} +; CHECK-NEXT: bx lr +bb: + %i = tail call i32 @llvm.abs.i32(i32 %a, i1 false) + tail call void @callee(i32 %i, i32 0, i32 0, i32 0, i32 0) + ret void +}