[llvm] [Sparc] Apply the GRLIB-TN-0011 errata workaround to ldstub (PR #205781)

Daniel Cederman via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 1 00:02:34 PDT 2026


https://github.com/doac updated https://github.com/llvm/llvm-project/pull/205781

>From 249966a6f455c36f393146e0bc718baa1ae1597e Mon Sep 17 00:00:00 2001
From: Daniel Cederman <cederman at gaisler.com>
Date: Wed, 24 Jun 2026 10:52:01 +0200
Subject: [PATCH 1/2] [Sparc] Apply the GRLIB-TN-0011 errata workaround to
 ldstub

Add ldstub to the list of atomic instruction that needs to be aligned.
---
 llvm/lib/Target/Sparc/SparcAsmPrinter.cpp | 4 ++++
 llvm/test/CodeGen/SPARC/tn0011.ll         | 8 ++++++++
 2 files changed, 12 insertions(+)

diff --git a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
index c311af40ef142..39c5ab3b319a0 100644
--- a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
+++ b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
@@ -344,6 +344,10 @@ void SparcAsmPrinter::emitInstruction(const MachineInstr *MI) {
   case SP::CASArr:
   case SP::SWAPrr:
   case SP::SWAPri:
+  case SP::LDSTUBrr:
+  case SP::LDSTUBri:
+  case SP::LDSTUBArr:
+  case SP::LDSTUBAri:
     if (MF->getSubtarget<SparcSubtarget>().fixTN0011())
       OutStreamer->emitCodeAlignment(Align(16), getSubtargetInfo());
     break;
diff --git a/llvm/test/CodeGen/SPARC/tn0011.ll b/llvm/test/CodeGen/SPARC/tn0011.ll
index e13379eb54f4a..61f465432f0fc 100644
--- a/llvm/test/CodeGen/SPARC/tn0011.ll
+++ b/llvm/test/CodeGen/SPARC/tn0011.ll
@@ -24,3 +24,11 @@ entry:
   %2 = atomicrmw xchg ptr %1, i32 %v seq_cst, align 4
   ret i32 %2
 }
+
+; CHECK: .p2align 4
+; CHECK-NEXT: ldstub
+define i32 @test_fence() {
+entry:
+  fence seq_cst
+  ret i32 0
+}

>From a207d4b69abcf64389c419f887f3f4d3a7b63cac Mon Sep 17 00:00:00 2001
From: Daniel Cederman <cederman at gaisler.com>
Date: Wed, 1 Jul 2026 08:37:33 +0200
Subject: [PATCH 2/2] [Sparc] Remove LDSTUBAri that is Sparc V9 only

---
 llvm/lib/Target/Sparc/SparcAsmPrinter.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
index 39c5ab3b319a0..84768bc450703 100644
--- a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
+++ b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
@@ -347,7 +347,6 @@ void SparcAsmPrinter::emitInstruction(const MachineInstr *MI) {
   case SP::LDSTUBrr:
   case SP::LDSTUBri:
   case SP::LDSTUBArr:
-  case SP::LDSTUBAri:
     if (MF->getSubtarget<SparcSubtarget>().fixTN0011())
       OutStreamer->emitCodeAlignment(Align(16), getSubtargetInfo());
     break;



More information about the llvm-commits mailing list