Skip to content

Commit 06883dd

Browse files
dylanmckaydylanmckay
dylanmckay
authored andcommitted
[AVR] Save/restore the frame pointer for all functions
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
1 parent fc7af32 commit 06883dd

File tree

4 files changed

+29
-30
lines changed

4 files changed

+29
-30
lines changed

lib/Target/AVR/AVRFrameLowering.cpp

+10-11
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,17 @@ void AVRFrameLowering::emitPrologue(MachineFunction &MF,
6666
.setMIFlag(MachineInstr::FrameSetup);
6767
}
6868

69+
// Save the frame pointer if we have one.
70+
if (HasFP) {
71+
BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHWRr))
72+
.addReg(AVR::R29R28, RegState::Kill)
73+
.setMIFlag(MachineInstr::FrameSetup);
74+
}
75+
6976
// Emit special prologue code to save R1, R0 and SREG in interrupt/signal
7077
// handlers before saving any other registers.
7178
if (CallConv == CallingConv::AVR_INTR ||
7279
CallConv == CallingConv::AVR_SIGNAL) {
73-
74-
// Save the frame pointer if we have one.
75-
if (HasFP) {
76-
BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHWRr))
77-
.addReg(AVR::R29R28, RegState::Kill)
78-
.setMIFlag(MachineInstr::FrameSetup);
79-
}
80-
8180
BuildMI(MBB, MBBI, DL, TII.get(AVR::PUSHWRr))
8281
.addReg(AVR::R1R0, RegState::Kill)
8382
.setMIFlag(MachineInstr::FrameSetup);
@@ -173,11 +172,11 @@ void AVRFrameLowering::emitEpilogue(MachineFunction &MF,
173172
.addImm(0x3f)
174173
.addReg(AVR::R0, RegState::Kill);
175174
BuildMI(MBB, MBBI, DL, TII.get(AVR::POPWRd), AVR::R1R0);
176-
177-
if (hasFP(MF))
178-
BuildMI(MBB, MBBI, DL, TII.get(AVR::POPWRd), AVR::R29R28);
179175
}
180176

177+
if (hasFP(MF))
178+
BuildMI(MBB, MBBI, DL, TII.get(AVR::POPWRd), AVR::R29R28);
179+
181180
// Early exit if there is no need to restore the frame pointer.
182181
if (!FrameSize) {
183182
return;

test/CodeGen/AVR/calling-conv/c/stack.ll

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ define void @ret_void_args_i64_i64_i32(i64 %a, i64 %b, i32 %c) {
1111
; CHECK-NEXT: in r29, 62
1212

1313
; Load the top two bytes from the 32-bit int.
14-
; CHECK-NEXT: ldd r24, Y+7
15-
; CHECK-NEXT: ldd r25, Y+8
14+
; CHECK-NEXT: ldd r24, Y+5
15+
; CHECK-NEXT: ldd r25, Y+6
1616
; Store the top two bytes of the 32-bit int to memory.
1717
; CHECK-NEXT: sts 7, r25
1818
; CHECK-NEXT: sts 6, r24
1919

2020
; Load the bottom two bytes from the 32-bit int.
21-
; CHECK-NEXT: ldd r24, Y+5
22-
; CHECK-NEXT: ldd r25, Y+6
21+
; CHECK-NEXT: ldd r24, Y+3
22+
; CHECK-NEXT: ldd r25, Y+4
2323
; Store the bottom two bytes of the 32-bit int to memory.
2424
; CHECK-NEXT: sts 5, r25
2525
; CHECK-NEXT: sts 4, r24

test/CodeGen/AVR/return.ll

+12-12
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,14 @@ define i64 @return64_arg2(i64 %x, i64 %y, i64 %z) {
9696
; CHECK-LABEL: return64_arg2:
9797
; CHECK: push r28
9898
; CHECK: push r29
99-
; CHECK: ldd r18, Y+5
100-
; CHECK: ldd r19, Y+6
101-
; CHECK: ldd r20, Y+7
102-
; CHECK: ldd r21, Y+8
103-
; CHECK: ldd r22, Y+9
104-
; CHECK: ldd r23, Y+10
105-
; CHECK: ldd r24, Y+11
106-
; CHECK: ldd r25, Y+12
99+
; CHECK: ldd r18, Y+3
100+
; CHECK: ldd r19, Y+4
101+
; CHECK: ldd r20, Y+5
102+
; CHECK: ldd r21, Y+6
103+
; CHECK: ldd r22, Y+7
104+
; CHECK: ldd r23, Y+8
105+
; CHECK: ldd r24, Y+9
106+
; CHECK: ldd r25, Y+10
107107
; CHECK: pop r29
108108
; CHECK: pop r28
109109
ret i64 %z
@@ -113,10 +113,10 @@ define i32 @return64_trunc(i32 %a, i32 %b, i32 %c, i64 %d) {
113113
; CHECK-LABEL: return64_trunc:
114114
; CHECK: push r28
115115
; CHECK: push r29
116-
; CHECK: ldd r22, Y+5
117-
; CHECK: ldd r23, Y+6
118-
; CHECK: ldd r24, Y+7
119-
; CHECK: ldd r25, Y+8
116+
; CHECK: ldd r22, Y+3
117+
; CHECK: ldd r23, Y+4
118+
; CHECK: ldd r24, Y+5
119+
; CHECK: ldd r25, Y+6
120120
; CHECK: pop r29
121121
; CHECK: pop r28
122122
%result = trunc i64 %d to i32

test/CodeGen/AVR/varargs.ll

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ declare void @llvm.va_end(i8*)
77
define i16 @varargs1(i8* nocapture %x, ...) {
88
; CHECK-LABEL: varargs1:
99
; CHECK: movw r20, r28
10-
; CHECK: subi r20, 215
10+
; CHECK: subi r20, 217
1111
; CHECK: sbci r21, 255
1212
; CHECK: movw r24, r28
1313
; CHECK: adiw r24, 3
14-
; CHECK: ldd r22, Y+39
15-
; CHECK: ldd r23, Y+40
14+
; CHECK: ldd r22, Y+37
15+
; CHECK: ldd r23, Y+38
1616
; CHECK: call
1717
%buffer = alloca [32 x i8]
1818
%ap = alloca i8*

0 commit comments

Comments
 (0)