Skip to content

Instantly share code, notes, and snippets.

@fhahn
Created November 28, 2023 11:55
Show Gist options
  • Save fhahn/67937125b64440a8a414909c4a1b7973 to your computer and use it in GitHub Desktop.
Save fhahn/67937125b64440a8a414909c4a1b7973 to your computer and use it in GitHub Desktop.
Reset IsRestored for multiple return blocks
diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/llvm/lib/Target/ARM/ARMFrameLowering.cpp
index a3a71a8ec09a..d37316dcb0eb 100644
--- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp
@@ -2065,6 +2065,31 @@ bool ARMFrameLowering::restoreCalleeSavedRegisters(
&isARMArea1Register, 0);
}
+ // If there are multiple returns, not all of them may uses a POP that restores
+ // LR into PC and LR's Restored info may be incorrect for some return blocks.
+ // Restored is set to false, check if there are multiple return blocks, and
+ // set it to true again.
+ bool SeenReturn = false;
+ CalleeSavedInfo *LRCSI = nullptr;
+ for (CalleeSavedInfo &Info : CSI) {
+ if (Info.getReg() == ARM::LR && !Info.isRestored()) {
+ LRCSI = &Info;
+ break;
+ }
+ }
+ if (LRCSI) {
+ for (const MachineBasicBlock &MBB : MF)
+ for (const MachineInstr &MI : MBB.terminators()) {
+ if (!MI.isReturn())
+ continue;
+ if (SeenReturn) {
+ LRCSI->setRestored(true);
+ break;
+ }
+ SeenReturn = true;
+ }
+ }
+
return true;
}
diff --git a/llvm/test/CodeGen/Thumb2/mve-float16regloops.ll b/llvm/test/CodeGen/Thumb2/mve-float16regloops.ll
index 1c95d28b5eed..a75f445097f2 100644
--- a/llvm/test/CodeGen/Thumb2/mve-float16regloops.ll
+++ b/llvm/test/CodeGen/Thumb2/mve-float16regloops.ll
@@ -831,6 +831,7 @@ define void @arm_fir_f32_1_4_mve(ptr nocapture readonly %S, ptr nocapture readon
; CHECK-NEXT: mov r0, r1
; CHECK-NEXT: .LBB15_10: @ %while.end55
; CHECK-NEXT: ands r1, r9, #3
+; CHECK-NEXT: @ implicit-def: $lr
; CHECK-NEXT: beq .LBB15_12
; CHECK-NEXT: @ %bb.11: @ %if.then59
; CHECK-NEXT: vldrw.u32 q0, [r0]
diff --git a/llvm/test/CodeGen/Thumb2/mve-float32regloops.ll b/llvm/test/CodeGen/Thumb2/mve-float32regloops.ll
index 808626d9a0ae..c29653e68272 100644
--- a/llvm/test/CodeGen/Thumb2/mve-float32regloops.ll
+++ b/llvm/test/CodeGen/Thumb2/mve-float32regloops.ll
@@ -822,6 +822,7 @@ define void @arm_fir_f32_1_4_mve(ptr nocapture readonly %S, ptr nocapture readon
; CHECK-NEXT: mov r0, r1
; CHECK-NEXT: .LBB15_10: @ %while.end55
; CHECK-NEXT: ands r1, r10, #3
+; CHECK-NEXT: @ implicit-def: $lr
; CHECK-NEXT: beq .LBB15_12
; CHECK-NEXT: @ %bb.11: @ %if.then59
; CHECK-NEXT: vldrw.u32 q0, [r0]
diff --git a/llvm/test/CodeGen/Thumb2/outlined-fn-may-clobber-lr-in-caller.ll b/llvm/test/CodeGen/Thumb2/outlined-fn-may-clobber-lr-in-caller.ll
index d81d008b44be..34d93c985e72 100644
--- a/llvm/test/CodeGen/Thumb2/outlined-fn-may-clobber-lr-in-caller.ll
+++ b/llvm/test/CodeGen/Thumb2/outlined-fn-may-clobber-lr-in-caller.ll
@@ -22,11 +22,19 @@ define void @test(ptr nocapture noundef writeonly %arg, i32 noundef %arg1, i8 no
; CHECK-NEXT: cmp r1, #1
; CHECK-NEXT: bne .LBB0_5
; CHECK-NEXT: @ %bb.2: @ %bb4
-; CHECK-NEXT: bl OUTLINED_FUNCTION_0
+; CHECK-NEXT: movs r1, #1
+; CHECK-NEXT: strb.w r1, [r0, #36]
+; CHECK-NEXT: movs r1, #30
+; CHECK-NEXT: strb.w r1, [r0, #34]
+; CHECK-NEXT: add.w r1, r2, r2, lsl #3
; CHECK-NEXT: ldr r2, .LCPI0_1
; CHECK-NEXT: b .LBB0_4
; CHECK-NEXT: .LBB0_3: @ %bb14
-; CHECK-NEXT: bl OUTLINED_FUNCTION_0
+; CHECK-NEXT: movs r1, #1
+; CHECK-NEXT: strb.w r1, [r0, #36]
+; CHECK-NEXT: movs r1, #30
+; CHECK-NEXT: strb.w r1, [r0, #34]
+; CHECK-NEXT: add.w r1, r2, r2, lsl #3
; CHECK-NEXT: ldr r2, .LCPI0_0
; CHECK-NEXT: .LBB0_4: @ %bb4
; CHECK-NEXT: add.w r1, r2, r1, lsl #2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment