]> granicus.if.org Git - llvm/commitdiff
[AVR] Save/restore the frame pointer for all functions
authorDylan McKay <me@dylanmckay.io>
Tue, 2 May 2017 01:57:48 +0000 (01:57 +0000)
committerDylan McKay <me@dylanmckay.io>
Tue, 2 May 2017 01:57:48 +0000 (01:57 +0000)
A recent commit I made made it so that we only did this for signal or
interrupt handlers. This broke normal functions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301893 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AVR/AVRFrameLowering.cpp
test/CodeGen/AVR/calling-conv/c/stack.ll
test/CodeGen/AVR/return.ll
test/CodeGen/AVR/varargs.ll

index 3c37a1a9989e3b37d101ea9016a7149c6c7e3d21..25232d2e47e13705b08998113dd779e1b7423d16 100644 (file)
@@ -66,18 +66,17 @@ void AVRFrameLowering::emitPrologue(MachineFunction &MF,
         .setMIFlag(MachineInstr::FrameSetup);
   }
 
+  // Save the frame pointer if we have one.
+  if (HasFP) {
+    BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHWRr))
+        .addReg(AVR::R29R28, RegState::Kill)
+        .setMIFlag(MachineInstr::FrameSetup);
+  }
+
   // Emit special prologue code to save R1, R0 and SREG in interrupt/signal
   // handlers before saving any other registers.
   if (CallConv == CallingConv::AVR_INTR ||
       CallConv == CallingConv::AVR_SIGNAL) {
-
-    // Save the frame pointer if we have one.
-    if (HasFP) {
-      BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHWRr))
-          .addReg(AVR::R29R28, RegState::Kill)
-          .setMIFlag(MachineInstr::FrameSetup);
-    }
-
     BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHWRr))
         .addReg(AVR::R1R0, RegState::Kill)
         .setMIFlag(MachineInstr::FrameSetup);
@@ -173,11 +172,11 @@ void AVRFrameLowering::emitEpilogue(MachineFunction &MF,
         .addImm(0x3f)
         .addReg(AVR::R0, RegState::Kill);
     BuildMI(MBB, MBBI, DL, TII.get(AVR::POPWRd), AVR::R1R0);
-
-    if (hasFP(MF))
-      BuildMI(MBB, MBBI, DL, TII.get(AVR::POPWRd), AVR::R29R28);
   }
 
+  if (hasFP(MF))
+    BuildMI(MBB, MBBI, DL, TII.get(AVR::POPWRd), AVR::R29R28);
+
   // Early exit if there is no need to restore the frame pointer.
   if (!FrameSize) {
     return;
index 00ff7d1acd8022dbd78a9ed6855af98c3a2dbf7b..52b6427476ab159860010682ebbafd324be39933 100644 (file)
@@ -11,15 +11,15 @@ define void @ret_void_args_i64_i64_i32(i64 %a, i64 %b, i32 %c) {
   ; CHECK-NEXT: in      r29, 62
 
   ; Load the top two bytes from the 32-bit int.
-  ; CHECK-NEXT: ldd     r24, Y+7
-  ; CHECK-NEXT: ldd     r25, Y+8
+  ; CHECK-NEXT: ldd     r24, Y+5
+  ; CHECK-NEXT: ldd     r25, Y+6
   ; Store the top two bytes of the 32-bit int to memory.
   ; CHECK-NEXT: sts     7, r25
   ; CHECK-NEXT: sts     6, r24
 
   ; Load the bottom two bytes from the 32-bit int.
-  ; CHECK-NEXT: ldd     r24, Y+5
-  ; CHECK-NEXT: ldd     r25, Y+6
+  ; CHECK-NEXT: ldd     r24, Y+3
+  ; CHECK-NEXT: ldd     r25, Y+4
   ; Store the bottom two bytes of the 32-bit int to memory.
   ; CHECK-NEXT: sts     5, r25
   ; CHECK-NEXT: sts     4, r24
index d57f435fd11c65d99a14555ee6a3a3ff320afc02..1f80576af2885e472db558ddf5f14532550310aa 100644 (file)
@@ -96,14 +96,14 @@ define i64 @return64_arg2(i64 %x, i64 %y, i64 %z) {
 ; CHECK-LABEL: return64_arg2:
 ; CHECK: push r28
 ; CHECK: push r29
-; CHECK: ldd r18, Y+5
-; CHECK: ldd r19, Y+6
-; CHECK: ldd r20, Y+7
-; CHECK: ldd r21, Y+8
-; CHECK: ldd r22, Y+9
-; CHECK: ldd r23, Y+10
-; CHECK: ldd r24, Y+11
-; CHECK: ldd r25, Y+12
+; CHECK: ldd r18, Y+3
+; CHECK: ldd r19, Y+4
+; CHECK: ldd r20, Y+5
+; CHECK: ldd r21, Y+6
+; CHECK: ldd r22, Y+7
+; CHECK: ldd r23, Y+8
+; CHECK: ldd r24, Y+9
+; CHECK: ldd r25, Y+10
 ; CHECK: pop r29
 ; CHECK: pop r28
     ret i64 %z
@@ -113,10 +113,10 @@ define i32 @return64_trunc(i32 %a, i32 %b, i32 %c, i64 %d) {
 ; CHECK-LABEL: return64_trunc:
 ; CHECK: push r28
 ; CHECK: push r29
-; CHECK: ldd r22, Y+5
-; CHECK: ldd r23, Y+6
-; CHECK: ldd r24, Y+7
-; CHECK: ldd r25, Y+8
+; CHECK: ldd r22, Y+3
+; CHECK: ldd r23, Y+4
+; CHECK: ldd r24, Y+5
+; CHECK: ldd r25, Y+6
 ; CHECK: pop r29
 ; CHECK: pop r28
   %result = trunc i64 %d to i32
index 4959f2d880c8bca6b7efa7581c43fa27421157e9..6f727cda582d54978a22a562d91f5c6b732c0c77 100644 (file)
@@ -7,12 +7,12 @@ declare void @llvm.va_end(i8*)
 define i16 @varargs1(i8* nocapture %x, ...) {
 ; CHECK-LABEL: varargs1:
 ; CHECK: movw r20, r28
-; CHECK: subi r20, 215
+; CHECK: subi r20, 217
 ; CHECK: sbci r21, 255
 ; CHECK: movw r24, r28
 ; CHECK: adiw r24, 3
-; CHECK: ldd r22, Y+39
-; CHECK: ldd r23, Y+40
+; CHECK: ldd r22, Y+37
+; CHECK: ldd r23, Y+38
 ; CHECK: call
   %buffer = alloca [32 x i8]
   %ap = alloca i8*