[llvm] [ARM] Fix expansion of ABS in a call sequence (PR #147270)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 7 03:21:33 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-arm
Author: Jay Foad (jayfoad)
<details>
<summary>Changes</summary>
Fixes #<!-- -->147162
---
Full diff: https://github.com/llvm/llvm-project/pull/147270.diff
2 Files Affected:
- (modified) llvm/lib/Target/ARM/ARMISelLowering.cpp (+5)
- (modified) llvm/test/CodeGen/ARM/iabs.ll (+25)
``````````diff
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
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/147270
More information about the llvm-commits
mailing list