[PATCH] D128623: Pass code-model through Module IR to LLC

Esme Yi via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 26 21:51:02 PDT 2022


Esme created this revision.
Esme added reviewers: shchenz, rzurob, MaskRay, PowerPC.
Herald added subscribers: StephenFan, hiraditya.
Herald added a project: All.
Esme requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Currently, the code-model specified in IR can't be captured by LLC.
This patch fixes that.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D128623

Files:
  llvm/include/llvm/Target/TargetMachine.h
  llvm/lib/Target/TargetMachine.cpp
  llvm/test/tools/llc/codemodel.ll
  llvm/tools/llc/llc.cpp


Index: llvm/tools/llc/llc.cpp
===================================================================
--- llvm/tools/llc/llc.cpp
+++ llvm/tools/llc/llc.cpp
@@ -521,6 +521,7 @@
   };
 
   Optional<Reloc::Model> RM = codegen::getExplicitRelocModel();
+  Optional<CodeModel::Model> CM = codegen::getExplicitCodeModel();
 
   const Target *TheTarget = nullptr;
   std::unique_ptr<TargetMachine> Target;
@@ -553,8 +554,7 @@
 
       InitializeOptions(TheTriple);
       Target = std::unique_ptr<TargetMachine>(TheTarget->createTargetMachine(
-          TheTriple.getTriple(), CPUStr, FeaturesStr, Options, RM,
-          codegen::getExplicitCodeModel(), OLvl));
+          TheTriple.getTriple(), CPUStr, FeaturesStr, Options, RM, CM, OLvl));
       assert(Target && "Could not allocate target machine!");
 
       return Target->createDataLayout().getStringRepresentation();
@@ -574,6 +574,11 @@
     }
     if (!TargetTriple.empty())
       M->setTargetTriple(Triple::normalize(TargetTriple));
+
+    Optional<CodeModel::Model> CM_IR = M->getCodeModel();
+    if (!CM.hasValue() && CM_IR.hasValue()) {
+      Target->setCodeModel(CM_IR.getValue());
+    }
   } else {
     TheTriple = Triple(Triple::normalize(TargetTriple));
     if (TheTriple.getTriple().empty())
@@ -598,8 +603,7 @@
 
     InitializeOptions(TheTriple);
     Target = std::unique_ptr<TargetMachine>(TheTarget->createTargetMachine(
-        TheTriple.getTriple(), CPUStr, FeaturesStr, Options, RM,
-        codegen::getExplicitCodeModel(), OLvl));
+        TheTriple.getTriple(), CPUStr, FeaturesStr, Options, RM, CM, OLvl));
     assert(Target && "Could not allocate target machine!");
 
     // If we don't have a module then just exit now. We do this down
Index: llvm/test/tools/llc/codemodel.ll
===================================================================
--- /dev/null
+++ llvm/test/tools/llc/codemodel.ll
@@ -0,0 +1,18 @@
+; RUN: llc %s -o - | FileCheck %s --check-prefix=CHECK-LARGE
+
+target triple = "x86_64-unknown-linux-gnu"
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+
+!llvm.module.flags = !{!0, !1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 1, !"Code Model", i32 4}
+
+ at data = internal constant [0 x i32] []
+
+define i32* @foo() nounwind readonly {
+entry:
+; CHECK-LARGE-LABEL: foo:
+; CHECK-LARGE: movabsq $data, %rax
+    ret i32* getelementptr ([0 x i32], [0 x i32]* @data, i64 0, i64 0)
+}
Index: llvm/lib/Target/TargetMachine.cpp
===================================================================
--- llvm/lib/Target/TargetMachine.cpp
+++ llvm/lib/Target/TargetMachine.cpp
@@ -71,6 +71,9 @@
 /// target default.
 CodeModel::Model TargetMachine::getCodeModel() const { return CMModel; }
 
+/// Set the code model.
+void TargetMachine::setCodeModel(CodeModel::Model CM) { CMModel = CM; }
+
 /// Get the IR-specified TLS model for Var.
 static TLSModel::Model getSelectedTLSModel(const GlobalValue *GV) {
   switch (GV->getThreadLocalMode()) {
Index: llvm/include/llvm/Target/TargetMachine.h
===================================================================
--- llvm/include/llvm/Target/TargetMachine.h
+++ llvm/include/llvm/Target/TargetMachine.h
@@ -223,6 +223,7 @@
   /// Returns the code model. The choices are small, kernel, medium, large, and
   /// target default.
   CodeModel::Model getCodeModel() const;
+  void setCodeModel(CodeModel::Model CM);
 
   bool isPositionIndependent() const;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D128623.440108.patch
Type: text/x-patch
Size: 3448 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220627/7a1907fe/attachment.bin>


More information about the llvm-commits mailing list