[llvm] [X86] Fix sext optimization accidentally applying to large code model (PR #172721)

Arthur Eubanks via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 18 10:07:41 PST 2025


https://github.com/aeubanks updated https://github.com/llvm/llvm-project/pull/172721

>From c8f036964971c55e8ccdbcab3b77c43e46a4ac0f Mon Sep 17 00:00:00 2001
From: Arthur Eubanks <aeubanks at google.com>
Date: Wed, 17 Dec 2025 19:33:53 +0000
Subject: [PATCH 1/2] [X86] Fix sext optimization accidentally applying to
 large code model

Otherwise we were seeing "unsupported relocation" errors when
referencing a small symbol under the large code model.
---
 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp       |  3 ++-
 .../X86/large-code-model-sext-small-symbol.ll | 27 +++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/X86/large-code-model-sext-small-symbol.ll

diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
index 9791c1999086b..ab608806e5dce 100644
--- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -3311,7 +3311,8 @@ bool X86DAGToDAGISel::isSExtAbsoluteSymbolRef(unsigned Width, SDNode *N) const {
   // space, so globals can be a sign extended 32-bit immediate.
   // In other code models, small globals are in the low 2GB of the address
   // space, so sign extending them is equivalent to zero extending them.
-  return Width == 32 && !TM.isLargeGlobalValue(GV);
+  return TM.getCodeModel() != CodeModel::Large && Width == 32 &&
+         !TM.isLargeGlobalValue(GV);
 }
 
 X86::CondCode X86DAGToDAGISel::getCondFromNode(SDNode *N) const {
diff --git a/llvm/test/CodeGen/X86/large-code-model-sext-small-symbol.ll b/llvm/test/CodeGen/X86/large-code-model-sext-small-symbol.ll
new file mode 100644
index 0000000000000..0a4b3d3cff903
--- /dev/null
+++ b/llvm/test/CodeGen/X86/large-code-model-sext-small-symbol.ll
@@ -0,0 +1,27 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=large | FileCheck %s
+
+; ensure that emitted relocations are valid
+; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=large -filetype=obj
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-linux-gnu"
+
+ at g = external dso_local constant i8, code_model "small"
+
+define ptr @f(i64 %0) {
+; CHECK-LABEL: f:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:  .L0$pb:
+; CHECK-NEXT:    leaq .L0$pb(%rip), %rax
+; CHECK-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L0$pb, %rcx
+; CHECK-NEXT:    addq %rax, %rcx
+; CHECK-NEXT:    movabsq $g at GOTOFF, %rax
+; CHECK-NEXT:    cmpq $1, %rdi
+; CHECK-NEXT:    adcq %rcx, %rax
+; CHECK-NEXT:    retq
+  %2 = icmp eq i64 %0, 0
+  %3 = zext i1 %2 to i64
+  %4 = getelementptr i8, ptr @g, i64 %3
+  ret ptr %4
+}

>From 752fc8155c8113b64d434cd4b3b7bc8d23e42dd3 Mon Sep 17 00:00:00 2001
From: Arthur Eubanks <aeubanks at google.com>
Date: Wed, 17 Dec 2025 21:03:51 +0000
Subject: [PATCH 2/2] fix relocimm-code-model.ll

---
 llvm/test/CodeGen/X86/relocimm-code-model.ll | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/CodeGen/X86/relocimm-code-model.ll b/llvm/test/CodeGen/X86/relocimm-code-model.ll
index 82483abc1ed0a..ceb298fc0e581 100644
--- a/llvm/test/CodeGen/X86/relocimm-code-model.ll
+++ b/llvm/test/CodeGen/X86/relocimm-code-model.ll
@@ -1,7 +1,7 @@
 ; RUN: llc < %s | FileCheck %s --check-prefix=CHECK-SMALL
 ; RUN: llc --code-model=medium -large-data-threshold=100 < %s | FileCheck %s --check-prefix=CHECK-SMALL
 ; RUN: llc --code-model=medium < %s | FileCheck %s --check-prefix=CHECK-LARGE
-; RUN: llc --code-model=large -large-data-threshold=100 < %s | FileCheck %s --check-prefix=CHECK-SMALL
+; RUN: llc --code-model=large -large-data-threshold=100 < %s | FileCheck %s --check-prefix=CHECK-LARGE
 ; RUN: llc --code-model=large < %s | FileCheck %s --check-prefix=CHECK-LARGE
 ; RUN: llc --code-model=kernel < %s | FileCheck %s --check-prefix=CHECK-SMALL
 



More information about the llvm-commits mailing list