[llvm] 86eaf60 - [X86] Refine X86DAGToDAGISel::isSExtAbsoluteSymbolRef() (#76191)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 19 14:11:23 PST 2024


Author: Arthur Eubanks
Date: 2024-01-19T14:11:18-08:00
New Revision: 86eaf6083b2cd27b8811f4791ad2eb8dacbb0e5f

URL: https://github.com/llvm/llvm-project/commit/86eaf6083b2cd27b8811f4791ad2eb8dacbb0e5f
DIFF: https://github.com/llvm/llvm-project/commit/86eaf6083b2cd27b8811f4791ad2eb8dacbb0e5f.diff

LOG: [X86] Refine X86DAGToDAGISel::isSExtAbsoluteSymbolRef() (#76191)

We just need to check if the global is large or not.

In the kernel code model, globals are in the negative 2GB of the address
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.

Added: 
    llvm/test/CodeGen/X86/relocimm-code-model.ll

Modified: 
    llvm/lib/Target/X86/X86ISelDAGToDAG.cpp

Removed: 
    llvm/test/CodeGen/X86/relocimm-small-model.ll


################################################################################
diff  --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
index 853d654457ef37..833f058253d880 100644
--- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -3188,12 +3188,16 @@ bool X86DAGToDAGISel::isSExtAbsoluteSymbolRef(unsigned Width, SDNode *N) const {
   if (!GA)
     return false;
 
-  std::optional<ConstantRange> CR = GA->getGlobal()->getAbsoluteSymbolRange();
-  if (!CR)
-    return Width == 32 && TM.getCodeModel() == CodeModel::Small;
-
-  return CR->getSignedMin().sge(-1ull << Width) &&
-         CR->getSignedMax().slt(1ull << Width);
+  auto *GV = GA->getGlobal();
+  std::optional<ConstantRange> CR = GV->getAbsoluteSymbolRange();
+  if (CR)
+    return CR->getSignedMin().sge(-1ull << Width) &&
+           CR->getSignedMax().slt(1ull << Width);
+  // In the kernel code model, globals are in the negative 2GB of the address
+  // 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);
 }
 
 X86::CondCode X86DAGToDAGISel::getCondFromNode(SDNode *N) const {

diff  --git a/llvm/test/CodeGen/X86/relocimm-small-model.ll b/llvm/test/CodeGen/X86/relocimm-code-model.ll
similarity index 62%
rename from llvm/test/CodeGen/X86/relocimm-small-model.ll
rename to llvm/test/CodeGen/X86/relocimm-code-model.ll
index 5c128e15c1e26c..82483abc1ed0a5 100644
--- a/llvm/test/CodeGen/X86/relocimm-small-model.ll
+++ b/llvm/test/CodeGen/X86/relocimm-code-model.ll
@@ -1,5 +1,9 @@
 ; RUN: llc < %s | FileCheck %s --check-prefix=CHECK-SMALL
-; RUN: llc --code-model=medium < %s | FileCheck %s --check-prefix=CHECK-MEDIUM
+; 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 < %s | FileCheck %s --check-prefix=CHECK-LARGE
+; RUN: llc --code-model=kernel < %s | FileCheck %s --check-prefix=CHECK-SMALL
 
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
@@ -9,7 +13,7 @@ target triple = "x86_64-unknown-linux-gnu"
 declare void @f()
 
 define void @foo(i64 %b) {
-; CHECK-MEDIUM: cmpq  %rax, %rdi
+; CHECK-LARGE: cmpq %rax, %rdi
 ; CHECK-SMALL: cmpq $a, %rdi
 entry:
   %cmp = icmp eq i64 %b, ptrtoint (ptr @a to i64)


        


More information about the llvm-commits mailing list