Created
November 28, 2023 11:55
-
-
Save fhahn/67937125b64440a8a414909c4a1b7973 to your computer and use it in GitHub Desktop.
Reset IsRestored for multiple return blocks
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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