[llvm] [X86] Do not use movq in -mcmodel=kernel on an out of range abs global (PR #163323)

via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 14 12:07:42 PDT 2025


================
@@ -1256,8 +1256,20 @@ def : Pat<(i64 (X86Wrapper tconstpool  :$dst)),
           (MOV64ri32 tconstpool  :$dst)>, Requires<[KernelCode]>;
 def : Pat<(i64 (X86Wrapper tjumptable  :$dst)),
           (MOV64ri32 tjumptable  :$dst)>, Requires<[KernelCode]>;
-def : Pat<(i64 (X86Wrapper tglobaladdr :$dst)),
-          (MOV64ri32 tglobaladdr :$dst)>, Requires<[KernelCode]>;
+
+// If the globaladdr has an absolute_symbol range, we should assert it would
+// fit into a 32-bit offset.
+def inRange32GlobalAddr : PatLeaf<(tglobaladdr:$dst), [{
+  auto *GA = cast<GlobalAddressSDNode>(N);
+  std::optional<ConstantRange> CR = GA->getGlobal()->getAbsoluteSymbolRange();
+  if (!CR)
+    return true;
+  return CR->getSignedMin().sge(-1ull << 32) &&
+         CR->getSignedMax().slt(1ull << 32);
----------------
PiJoules wrote:

Done. I think it needs to be `CR->getMinSignedBits() <= 32`.

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


More information about the llvm-commits mailing list