[llvm] [AVR] Optimize for no SPH devices (PR #152905)

Tom Vijlbrief via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 10 02:31:23 PDT 2025


https://github.com/tomtor created https://github.com/llvm/llvm-project/pull/152905

Minimal fix for https://github.com/llvm/llvm-project/issues/148560

>From ea170be328bd8195847720ed0eff1055585eb514 Mon Sep 17 00:00:00 2001
From: Tom Vijlbrief <tvijlbrief at gmail.com>
Date: Tue, 15 Jul 2025 21:34:15 +0200
Subject: [PATCH] Optimize for no SPH devices

---
 llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp | 25 +++++++++++---------
 llvm/test/CodeGen/AVR/pseudo/SPWRITE.mir     |  5 +---
 2 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp b/llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp
index 90505aa82aa46..cbd1f5fba322e 100644
--- a/llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp
+++ b/llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp
@@ -2547,25 +2547,28 @@ bool AVRExpandPseudo::expand<AVR::SPWRITE>(Block &MBB, BlockIt MBBI) {
         .addReg(SrcHiReg, getKillRegState(SrcIsKill))
         .setMIFlags(Flags);
 
-  } else { // Disable interrupts for older devices (3 extra instructions)
+  } else { // Disable interrupts for older devices with SPH (3 extra
+           // instructions)
 
-    buildMI(MBB, MBBI, AVR::INRdA)
-        .addReg(STI.getTmpRegister(), RegState::Define)
-        .addImm(STI.getIORegSREG())
-        .setMIFlags(Flags);
+    if (STI.getIORegSPH() != -1) {
+
+      buildMI(MBB, MBBI, AVR::INRdA)
+          .addReg(STI.getTmpRegister(), RegState::Define)
+          .addImm(STI.getIORegSREG())
+          .setMIFlags(Flags);
 
-    buildMI(MBB, MBBI, AVR::BCLRs).addImm(0x07).setMIFlags(Flags);
+      buildMI(MBB, MBBI, AVR::BCLRs).addImm(0x07).setMIFlags(Flags);
 
-    if (STI.getIORegSPH() != -1)
       buildMI(MBB, MBBI, AVR::OUTARr)
           .addImm(STI.getIORegSPH())
           .addReg(SrcHiReg, getKillRegState(SrcIsKill))
           .setMIFlags(Flags);
 
-    buildMI(MBB, MBBI, AVR::OUTARr)
-        .addImm(STI.getIORegSREG())
-        .addReg(STI.getTmpRegister(), RegState::Kill)
-        .setMIFlags(Flags);
+      buildMI(MBB, MBBI, AVR::OUTARr)
+          .addImm(STI.getIORegSREG())
+          .addReg(STI.getTmpRegister(), RegState::Kill)
+          .setMIFlags(Flags);
+    }
 
     buildMI(MBB, MBBI, AVR::OUTARr)
         .addImm(STI.getIORegSPL())
diff --git a/llvm/test/CodeGen/AVR/pseudo/SPWRITE.mir b/llvm/test/CodeGen/AVR/pseudo/SPWRITE.mir
index ed6e39c641b11..4e6f8eb148a23 100644
--- a/llvm/test/CodeGen/AVR/pseudo/SPWRITE.mir
+++ b/llvm/test/CodeGen/AVR/pseudo/SPWRITE.mir
@@ -1,4 +1,4 @@
-# RUN: llc -O0 -run-pass=avr-expand-pseudo -mtriple=avr -mcpu=attiny11 %s -o - \
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -mtriple=avr -mcpu=attiny13 %s -o - \
 # RUN:     | FileCheck --check-prefix=NOSPH %s
 # RUN: llc -O0 -run-pass=avr-expand-pseudo -mtriple=avr -mcpu=atmega328 %s -o - \
 # RUN:     | FileCheck %s
@@ -34,9 +34,6 @@ body: |
     ; CHECK:       OUTARr 61, $r14
 
     ; NOSPH-LABEL: test
-    ; NOSPH:       $r0 = INRdA 63
-    ; NOSPH:       BCLRs 7, implicit-def $sreg
-    ; NOSPH:       OUTARr 63, killed $r0
     ; NOSPH:       OUTARr 61, $r14
 
     ; XMEGA-LABEL: test



More information about the llvm-commits mailing list