[llvm] ff855f5 - Pass code-model through Module IR to [llc].

via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 28 23:30:59 PDT 2022


Author: esmeyi
Date: 2022-06-29T02:30:13-04:00
New Revision: ff855f5ec0c3eb15a7a9409971e46a8599c79471

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

LOG: Pass code-model through Module IR to [llc].

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

Reviewed By: shchenz, MaskRay

Differential Revision: https://reviews.llvm.org/D128623

Added: 
    llvm/test/tools/llc/codemodel-1.ll
    llvm/test/tools/llc/codemodel-2.ll

Modified: 
    llvm/include/llvm/Target/TargetMachine.h
    llvm/lib/Target/TargetMachine.cpp
    llvm/tools/llc/llc.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h
index a4d3581ff3a66..bf37ad7010ec7 100644
--- a/llvm/include/llvm/Target/TargetMachine.h
+++ b/llvm/include/llvm/Target/TargetMachine.h
@@ -222,7 +222,10 @@ class TargetMachine {
 
   /// Returns the code model. The choices are small, kernel, medium, large, and
   /// target default.
-  CodeModel::Model getCodeModel() const;
+  CodeModel::Model getCodeModel() const { return CMModel; }
+
+  /// Set the code model.
+  void setCodeModel(CodeModel::Model CM) { CMModel = CM; }
 
   bool isPositionIndependent() const;
 

diff  --git a/llvm/lib/Target/TargetMachine.cpp b/llvm/lib/Target/TargetMachine.cpp
index 615fe6f483784..8d1ad617889c9 100644
--- a/llvm/lib/Target/TargetMachine.cpp
+++ b/llvm/lib/Target/TargetMachine.cpp
@@ -67,10 +67,6 @@ void TargetMachine::resetTargetOptions(const Function &F) const {
 /// and dynamic-no-pic.
 Reloc::Model TargetMachine::getRelocationModel() const { return RM; }
 
-/// Returns the code model. The choices are small, kernel, medium, large, and
-/// target default.
-CodeModel::Model TargetMachine::getCodeModel() const { return CMModel; }
-
 /// Get the IR-specified TLS model for Var.
 static TLSModel::Model getSelectedTLSModel(const GlobalValue *GV) {
   switch (GV->getThreadLocalMode()) {

diff  --git a/llvm/test/tools/llc/codemodel-1.ll b/llvm/test/tools/llc/codemodel-1.ll
new file mode 100644
index 0000000000000..0af663fe5c04e
--- /dev/null
+++ b/llvm/test/tools/llc/codemodel-1.ll
@@ -0,0 +1,22 @@
+; REQUIRES: x86-registered-target
+; RUN: llc %s -o - | FileCheck %s --check-prefix=CHECK-LARGE
+
+;; Check the llc option will override the IR input.
+; RUN: llc -code-model=small %s -o - | FileCheck %s --check-prefix=CHECK-SMALL
+
+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: movabsq $data, %rax
+; CHECK-SMALL: movl    $data, %eax
+    ret i32* getelementptr ([0 x i32], [0 x i32]* @data, i64 0, i64 0)
+}

diff  --git a/llvm/test/tools/llc/codemodel-2.ll b/llvm/test/tools/llc/codemodel-2.ll
new file mode 100644
index 0000000000000..a52febe05d7b1
--- /dev/null
+++ b/llvm/test/tools/llc/codemodel-2.ll
@@ -0,0 +1,22 @@
+; REQUIRES: x86-registered-target
+; RUN: llc %s -o - | FileCheck %s --check-prefix=CHECK-SMALL
+
+;; Check the llc option will override the IR input.
+; RUN: llc -code-model=large %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 1}
+
+ at data = internal constant [0 x i32] []
+
+define i32* @foo() nounwind readonly {
+entry:
+; CHECK-LARGE: movabsq $data, %rax
+; CHECK-SMALL: movl    $data, %eax
+    ret i32* getelementptr ([0 x i32], [0 x i32]* @data, i64 0, i64 0)
+}

diff  --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp
index c4b8adb399e9c..8d82d78b15b5e 100644
--- a/llvm/tools/llc/llc.cpp
+++ b/llvm/tools/llc/llc.cpp
@@ -520,6 +520,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
   };
 
   Optional<Reloc::Model> RM = codegen::getExplicitRelocModel();
+  Optional<CodeModel::Model> CM = codegen::getExplicitCodeModel();
 
   const Target *TheTarget = nullptr;
   std::unique_ptr<TargetMachine> Target;
@@ -552,8 +553,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
 
       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();
@@ -573,6 +573,10 @@ static int compileModule(char **argv, LLVMContext &Context) {
     }
     if (!TargetTriple.empty())
       M->setTargetTriple(Triple::normalize(TargetTriple));
+
+    Optional<CodeModel::Model> CM_IR = M->getCodeModel();
+    if (!CM && CM_IR)
+      Target->setCodeModel(CM_IR.getValue());
   } else {
     TheTriple = Triple(Triple::normalize(TargetTriple));
     if (TheTriple.getTriple().empty())
@@ -597,8 +601,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
 
     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


        


More information about the llvm-commits mailing list