[llvm] [llvm][ARM] Allow MOVT and MOVW on the offset between two labels (PR #168072)

Loïc Yhuel via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 18 02:10:59 PST 2025


https://github.com/hwti updated https://github.com/llvm/llvm-project/pull/168072

>From ced66106ce9e10fe1348d4bb24e9d1a2d64274df Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Yhuel?= <loic.yhuel at softathome.com>
Date: Fri, 14 Nov 2025 15:57:17 +0100
Subject: [PATCH 1/2] [llvm][ARM] Allow MOVT and MOVW on the offset between two
 labels

In this case, the value is a constant, not an addend to a relocation.
So the "Relocation Not In Range" error must not be triggered.

Regression from PR #112877
Fixes #132322
---
 llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp |  2 +-
 llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s     | 14 ++++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s

diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
index f8196e460ae9c..02a7b1a3d0919 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
@@ -428,7 +428,7 @@ unsigned ARMAsmBackend::adjustFixupValue(const MCAssembler &Asm,
   // signed 16bit range.
   if ((Kind == ARM::fixup_arm_movw_lo16 || Kind == ARM::fixup_arm_movt_hi16 ||
        Kind == ARM::fixup_t2_movw_lo16 || Kind == ARM::fixup_t2_movt_hi16) &&
-      (Addend < minIntN(16) || Addend > maxIntN(16))) {
+      !Target.isAbsolute() && (Addend < minIntN(16) || Addend > maxIntN(16))) {
     Ctx.reportError(Fixup.getLoc(), "Relocation Not In Range");
     return 0;
   }
diff --git a/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s b/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s
new file mode 100644
index 0000000000000..ed888a0a4aaae
--- /dev/null
+++ b/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s
@@ -0,0 +1,14 @@
+ at RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s 2>&1 | FileCheck %s
+
+    .text
+a:
+    movw    r1, #:lower16:b - a + 65536
+    movt    r1, #:upper16:b - a + 65536
+b:
+
+ at CHECK-NOT: error: Relocation Not In Range
+ at CHECK-NOT: movw    r1, #:lower16:b - a + 65536
+ at CHECK-NOT: ^
+ at CHECK-NOT: error: Relocation Not In Range
+ at CHECK-NOT: movt    r1, #:upper16:b - a + 65536
+ at CHECK-NOT: ^

>From 693ac07ef8cbf36ad120ebc87260ce54bb4cfaa1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Yhuel?= <loic.yhuel at softathome.com>
Date: Tue, 18 Nov 2025 11:10:04 +0100
Subject: [PATCH 2/2] fixup! [llvm][ARM] Allow MOVT and MOVW on the offset
 between two labels

---
 llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp |  2 +-
 llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s     | 11 +++--------
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
index 02a7b1a3d0919..cc21844b26350 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
@@ -428,7 +428,7 @@ unsigned ARMAsmBackend::adjustFixupValue(const MCAssembler &Asm,
   // signed 16bit range.
   if ((Kind == ARM::fixup_arm_movw_lo16 || Kind == ARM::fixup_arm_movt_hi16 ||
        Kind == ARM::fixup_t2_movw_lo16 || Kind == ARM::fixup_t2_movt_hi16) &&
-      !Target.isAbsolute() && (Addend < minIntN(16) || Addend > maxIntN(16))) {
+      !IsResolved && (Addend < minIntN(16) || Addend > maxIntN(16))) {
     Ctx.reportError(Fixup.getLoc(), "Relocation Not In Range");
     return 0;
   }
diff --git a/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s b/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s
index ed888a0a4aaae..21239504bd46c 100644
--- a/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s
+++ b/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s
@@ -1,14 +1,9 @@
- at RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s 2>&1 | FileCheck %s
+ at RUN: llvm-mc -triple armv7-eabi -filetype obj %s -o - | llvm-objdump -d --triple armv7-eabi - | FileCheck %s
 
-    .text
 a:
     movw    r1, #:lower16:b - a + 65536
     movt    r1, #:upper16:b - a + 65536
 b:
 
- at CHECK-NOT: error: Relocation Not In Range
- at CHECK-NOT: movw    r1, #:lower16:b - a + 65536
- at CHECK-NOT: ^
- at CHECK-NOT: error: Relocation Not In Range
- at CHECK-NOT: movt    r1, #:upper16:b - a + 65536
- at CHECK-NOT: ^
+ at CHECK: 0: e3001008 movw r1, #0x8
+ at CHECK: 4: e3401001 movt r1, #0x1



More information about the llvm-commits mailing list