[AVR] Fix a bug in prologue of ISR
authorBen Shi <powerman1st@163.com>
Tue, 29 Jun 2021 13:44:50 +0000 (21:44 +0800)
committerBen Shi <powerman1st@163.com>
Tue, 29 Jun 2021 13:44:50 +0000 (21:44 +0800)
The r1 register should be cleared in prologue of ISR as it is used
as constant zero.

Reviewed By: dylanmckay

Differential Revision: https://reviews.llvm.org/D99467

llvm/lib/Target/AVR/AVRFrameLowering.cpp
llvm/test/CodeGen/AVR/interrupts.ll

index e998010..89ed30e 100644 (file)
@@ -83,6 +83,11 @@ void AVRFrameLowering::emitPrologue(MachineFunction &MF,
         .addReg(AVR::R0, RegState::Kill)
         .addReg(AVR::R0, RegState::Kill)
         .setMIFlag(MachineInstr::FrameSetup);
+    BuildMI(MBB, MBBI, DL, TII.get(AVR::EORRdRr))
+        .addReg(AVR::R1, RegState::Define)
+        .addReg(AVR::R1, RegState::Kill)
+        .addReg(AVR::R1, RegState::Kill)
+        .setMIFlag(MachineInstr::FrameSetup);
   }
 
   // Early exit if the frame pointer is not needed in this function.
index c6550a0..e112de0 100644 (file)
@@ -8,6 +8,7 @@ define avr_intrcc void @interrupt_handler() {
 ; CHECK-NEXT: in r0, 63
 ; CHECK-NEXT: push r0
 ; CHECK: clr r0
+; CHECK-NEXT: clr r1
 ; CHECK: pop r0
 ; CHECK-NEXT: out 63, r0
 ; CHECK-NEXT: pop r1
@@ -24,6 +25,7 @@ define void @interrupt_handler_via_ir_attribute() #0 {
 ; CHECK-NEXT: in r0, 63
 ; CHECK-NEXT: push r0
 ; CHECK: clr r0
+; CHECK-NEXT: clr r1
 ; CHECK: pop r0
 ; CHECK-NEXT: out 63, r0
 ; CHECK-NEXT: pop r1
@@ -40,6 +42,7 @@ define avr_signalcc void @signal_handler() {
 ; CHECK-NEXT: in r0, 63
 ; CHECK-NEXT: push r0
 ; CHECK: clr r0
+; CHECK-NEXT: clr r1
 ; CHECK: pop r0
 ; CHECK-NEXT: out 63, r0
 ; CHECK-NEXT: pop r1
@@ -56,6 +59,7 @@ define void @signal_handler_via_attribute() #1 {
 ; CHECK-NEXT: in r0, 63
 ; CHECK-NEXT: push r0
 ; CHECK: clr r0
+; CHECK-NEXT: clr r1
 ; CHECK: pop r0
 ; CHECK-NEXT: out 63, r0
 ; CHECK-NEXT: pop r1
@@ -72,6 +76,7 @@ define avr_intrcc void @interrupt_alloca() {
 ; CHECK-NEXT: in r0, 63
 ; CHECK-NEXT: push r0
 ; CHECK: clr r0
+; CHECK-NEXT: clr r1
 ; CHECK: push r28
 ; CHECK-NEXT: push r29
 ; CHECK-NEXT: in r28, 61