Skip to content

Commit 17d6aa0

Browse files
authored
[ARM] Fix expansion of ABS in a call sequence (#147270)
Fixes #147162
1 parent 599b9de commit 17d6aa0

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12359,6 +12359,11 @@ ARMTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
1235912359
Fn->insert(BBI, RSBBB);
1236012360
Fn->insert(BBI, SinkBB);
1236112361

12362+
// Set the call frame size on entry to the new basic blocks.
12363+
unsigned CallFrameSize = TII->getCallFrameSizeAt(MI);
12364+
RSBBB->setCallFrameSize(CallFrameSize);
12365+
SinkBB->setCallFrameSize(CallFrameSize);
12366+
1236212367
Register ABSSrcReg = MI.getOperand(1).getReg();
1236312368
Register ABSDstReg = MI.getOperand(0).getReg();
1236412369
bool ABSSrcKIll = MI.getOperand(1).isKill();

llvm/test/CodeGen/ARM/iabs.ll

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,28 @@ define i64 @test3(i64 %a) {
5050
%abs = select i1 %b, i64 %a, i64 %tmp1neg
5151
ret i64 %abs
5252
}
53+
54+
declare void @callee(...)
55+
56+
define void @testcallframe(i32 %a) {
57+
; CHECK-LABEL: testcallframe:
58+
; CHECK: @ %bb.0: @ %bb
59+
; CHECK-NEXT: .save {r11, lr}
60+
; CHECK-NEXT: push {r11, lr}
61+
; CHECK-NEXT: .pad #8
62+
; CHECK-NEXT: sub sp, sp, #8
63+
; CHECK-NEXT: cmp r0, #0
64+
; CHECK-NEXT: mov r1, #0
65+
; CHECK-NEXT: rsbmi r0, r0, #0
66+
; CHECK-NEXT: mov r2, #0
67+
; CHECK-NEXT: mov r3, #0
68+
; CHECK-NEXT: str r1, [sp]
69+
; CHECK-NEXT: bl callee
70+
; CHECK-NEXT: add sp, sp, #8
71+
; CHECK-NEXT: pop {r11, lr}
72+
; CHECK-NEXT: bx lr
73+
bb:
74+
%i = tail call i32 @llvm.abs.i32(i32 %a, i1 false)
75+
tail call void @callee(i32 %i, i32 0, i32 0, i32 0, i32 0)
76+
ret void
77+
}

0 commit comments

Comments
 (0)