[clang] [clang] Fix incorrect register information of AVR (PR #193940)

via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 24 04:10:18 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Ben Shi (benshi001)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/193940.diff


2 Files Affected:

- (modified) clang/lib/Basic/Targets/AVR.h (+6-8) 
- (added) clang/test/CodeGen/avr/issue-176830.c (+17) 


``````````diff
diff --git a/clang/lib/Basic/Targets/AVR.h b/clang/lib/Basic/Targets/AVR.h
index 927a63d052d5d..f6fed1d97c9ea 100644
--- a/clang/lib/Basic/Targets/AVR.h
+++ b/clang/lib/Basic/Targets/AVR.h
@@ -77,9 +77,10 @@ class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {
 
   ArrayRef<const char *> getGCCRegNames() const override {
     static const char *const GCCRegNames[] = {
-        "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8",  "r9",
-        "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19",
-        "r20", "r21", "r22", "r23", "r24", "r25", "X",   "Y",   "Z",   "SP"};
+        "r0",  "r1",  "r2",  "r3",  "r4",  "r5",       "r6",      "r7",  "r8",
+        "r9",  "r10", "r11", "r12", "r13", "r14",      "r15",     "r16", "r17",
+        "r18", "r19", "r20", "r21", "r22", "r23",      "r24",     "r25", "r26",
+        "r27", "r28", "r29", "r30", "r31", "__SP_L__", "__SP_H__"};
     return llvm::ArrayRef(GCCRegNames);
   }
 
@@ -89,11 +90,8 @@ class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {
 
   ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
     static const TargetInfo::AddlRegName AddlRegNames[] = {
-        {{"r26", "r27"}, 26},
-        {{"r28", "r29"}, 27},
-        {{"r30", "r31"}, 28},
-        {{"SPL", "SPH"}, 29},
-    };
+        {{"xl", "X"}, 26}, {{"xh"}, 27},      {{"yl", "Y"}, 28},
+        {{"yh"}, 29},      {{"zl", "Z"}, 30}, {{"zh"}, 31}};
     return llvm::ArrayRef(AddlRegNames);
   }
 
diff --git a/clang/test/CodeGen/avr/issue-176830.c b/clang/test/CodeGen/avr/issue-176830.c
new file mode 100644
index 0000000000000..c1b6b0c2d6742
--- /dev/null
+++ b/clang/test/CodeGen/avr/issue-176830.c
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -triple avr -target-cpu atmega328 -emit-llvm < %s | FileCheck %s
+
+// This test case verifies https://github.com/llvm/llvm-project/issues/176830,
+// and the test code is gained from 
+// https://github.com/avrdudes/avr-libc/blob/main/include/string.h
+
+unsigned int strlen(const char *__s) {
+  if (__builtin_constant_p (__builtin_strlen (__s))) {
+    return __builtin_strlen (__s);
+  } else {
+    register const char *__r24 __asm("24") = __s;
+    register unsigned int __res __asm("24");
+    // CHECK: call addrspace(0) i16 asm "call ${2:x}", "={r24},{r24},i,~{r30},~{r31},~{memory}"(ptr %1, ptr addrspace(1) @strlen)
+    __asm ("%~call %x2" : "=r" (__res) : "r" (__r24), "i" (strlen) : "30", "31", "memory");
+    return __res;
+  }
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/193940


More information about the cfe-commits mailing list