[llvm] 928b14b - [AVR] Fix selecting inline assembly operands (#195066)
via llvm-commits
llvm-commits at lists.llvm.org
Sun May 3 12:20:34 PDT 2026
Author: Ben Shi
Date: 2026-05-03T21:20:28+02:00
New Revision: 928b14b0ba66b4c6ab0244d2b29fde1eedd62ec7
URL: https://github.com/llvm/llvm-project/commit/928b14b0ba66b4c6ab0244d2b29fde1eedd62ec7
DIFF: https://github.com/llvm/llvm-project/commit/928b14b0ba66b4c6ab0244d2b29fde1eedd62ec7.diff
LOG: [AVR] Fix selecting inline assembly operands (#195066)
Added:
llvm/test/CodeGen/AVR/issue-167244.ll
Modified:
llvm/lib/Target/AVR/AVRAsmPrinter.cpp
llvm/lib/Target/AVR/AVRISelDAGToDAG.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AVR/AVRAsmPrinter.cpp b/llvm/lib/Target/AVR/AVRAsmPrinter.cpp
index 9aaf1e6c20103..cccca41694925 100644
--- a/llvm/lib/Target/AVR/AVRAsmPrinter.cpp
+++ b/llvm/lib/Target/AVR/AVRAsmPrinter.cpp
@@ -162,7 +162,13 @@ bool AVRAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
return true; // Unknown modifier
const MachineOperand &MO = MI->getOperand(OpNum);
- (void)MO;
+
+ // Print direct memory operands.
+ if (MO.isGlobal() || MO.isSymbol() || MO.isMCSymbol()) {
+ PrintSymbolOperand(MO, O);
+ return false;
+ }
+
assert(MO.isReg() && "Unexpected inline asm memory operand");
// TODO: We should be able to look up the alternative name for
diff --git a/llvm/lib/Target/AVR/AVRISelDAGToDAG.cpp b/llvm/lib/Target/AVR/AVRISelDAGToDAG.cpp
index 20d35340bd15a..8997d0fb07dc3 100644
--- a/llvm/lib/Target/AVR/AVRISelDAGToDAG.cpp
+++ b/llvm/lib/Target/AVR/AVRISelDAGToDAG.cpp
@@ -246,6 +246,16 @@ bool AVRDAGToDAGISel::SelectInlineAsmMemoryOperand(
return true;
}
+ // Select global addresses.
+ if (Op.getOpcode() == AVRISD::WRAPPER) {
+ SDValue Sub = Op.getOperand(0);
+ if (Sub.getOpcode() == ISD::TargetGlobalAddress &&
+ (Sub.getValueType() == MVT::i16 || Sub.getValueType() == MVT::i8)) {
+ OutOps.push_back(Sub);
+ return false;
+ }
+ }
+
// If Op is add 'register, immediate' and
// register is either virtual register or register of PTRDISPREGSRegClass
if (Op->getOpcode() == ISD::ADD || Op->getOpcode() == ISD::SUB) {
diff --git a/llvm/test/CodeGen/AVR/issue-167244.ll b/llvm/test/CodeGen/AVR/issue-167244.ll
new file mode 100644
index 0000000000000..0967995a6936f
--- /dev/null
+++ b/llvm/test/CodeGen/AVR/issue-167244.ll
@@ -0,0 +1,33 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=avr -mcpu=avr2 | FileCheck %s --check-prefix=AVR2
+; RUN: llc < %s -mtriple=avr -mcpu=avrtiny | FileCheck %s --check-prefix=TINY
+
+ at NVM = dso_local global i8 0, align 1
+
+define void @foo() addrspace(1) {
+; AVR2-LABEL: foo:
+; AVR2: ; %bb.0: ; %entry
+; AVR2-NEXT: sts NVM, r1
+; AVR2-NEXT: ldi r24, 45
+; AVR2-NEXT: ldi r25, 0
+; AVR2-NEXT: ;APP
+; AVR2-NEXT: sts NVM, r24
+; AVR2-NEXT: lds r24, NVM
+; AVR2-NEXT: ;NO_APP
+; AVR2-NEXT: ret
+;
+; TINY-LABEL: foo:
+; TINY: ; %bb.0: ; %entry
+; TINY-NEXT: sts NVM, r17
+; TINY-NEXT: ldi r24, 45
+; TINY-NEXT: ldi r25, 0
+; TINY-NEXT: ;APP
+; TINY-NEXT: sts NVM, r24
+; TINY-NEXT: lds r24, NVM
+; TINY-NEXT: ;NO_APP
+; TINY-NEXT: ret
+entry:
+ store i8 0, ptr @NVM, align 1
+ %0 = tail call addrspace(0) i8 asm "sts\09$1, $2\0Alds\09$0, $1", "=r,*m,r"(ptr nonnull elementtype(i8) @NVM, i16 45)
+ ret void
+}
More information about the llvm-commits
mailing list