[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cfe-commits
Subject:    [PATCH] Pass -mglobal-merge as a module flag metadata.
From:       Ahmed Bougacha <ahmed.bougacha () gmail ! com>
Date:       2015-02-28 2:52:33
Message-ID: differential-rev-PHID-DREV-cgukpnp3jsxsdohkekod-req () reviews ! llvm ! org
[Download RAW message or body]

Hi dexonsmith,

Per title, we used to pass -mno-global-merge when specified, and enable Glo=
balMerge always (leaving it to LLVM to decide whether to actually enable it=
: it does, on ARM and AArch64, for -O1 and above).

This addresses two problems (I'm fine with splitting the patch if desired):
- with LTO, passing -mno-global-merge didn't do anything, since LTO implies=
 -O3 from the backend's standpoint.
- GlobalMerge was enabled by -O1.  Instead, on AArch64, enable it at -O3, o=
r when -mglobal-merge is specified. (the goal is to have it predicated by -=
O3 on ARM as well, but I still need to measure before doing that.)

Now, -mglobal-merge and -mno-global-merge are both explicitly passed by the=
 driver.
They are then passed to the backend using module flag metadata (bikesheddin=
g time: name is prose, and value is string.  We can change both, and AFAICT=
 there's no similar backend flag to be consistent with, yet.)

Thanks!
-Ahmed

http://reviews.llvm.org/D7968

Files:
  include/clang/Driver/Options.td
  include/clang/Frontend/CodeGenOptions.def
  lib/CodeGen/BackendUtil.cpp
  lib/CodeGen/CodeGenModule.cpp
  lib/CodeGen/CodeGenModule.h
  lib/Driver/Tools.cpp
  lib/Frontend/CompilerInvocation.cpp
  test/CodeGen/global-merge.c
  test/Driver/mglobal-merge.c
  test/Driver/mno-global-merge.c

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/

["D7968.20925.patch" (text/x-patch)]

Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -1126,7 +1126,7 @@
 def mfpmath_EQ : Joined<["-"], "mfpmath=">, Group<m_Group>;
 def mfpu_EQ : Joined<["-"], "mfpu=">, Group<m_Group>;
 def mhwdiv_EQ : Joined<["-"], "mhwdiv=">, Group<m_Group>;
-def mglobal_merge : Flag<["-"], "mglobal-merge">, Group<m_Group>;
+def mglobal_merge : Flag<["-"], "mglobal-merge">, Group<m_Group>, Flags<[CC1Option]>;
 def mhard_float : Flag<["-"], "mhard-float">, Group<m_Group>;
 def miphoneos_version_min_EQ : Joined<["-"], "miphoneos-version-min=">, Group<m_Group>;
 def mios_version_min_EQ : Joined<["-"], "mios-version-min=">,
Index: include/clang/Frontend/CodeGenOptions.def
===================================================================
--- include/clang/Frontend/CodeGenOptions.def
+++ include/clang/Frontend/CodeGenOptions.def
@@ -77,7 +77,7 @@
 CODEGENOPT(FatalWarnings     , 1, 0) ///< Set when -Wa,--fatal-warnings is
                                      ///< enabled.
 CODEGENOPT(EnableSegmentedStacks , 1, 0) ///< Set when -fsplit-stack is enabled.
-CODEGENOPT(NoGlobalMerge     , 1, 0) ///< Set when -mno-global-merge is enabled.
+CODEGENOPT(EnableGlobalMerge , 1, 0) ///< Set when -mglobal-merge is enabled.
 CODEGENOPT(NoImplicitFloat   , 1, 0) ///< Set when -mno-implicit-float is enabled.
 CODEGENOPT(NoInfsFPMath      , 1, 0) ///< Assume FP arguments, results not +-Inf.
 CODEGENOPT(NoSignedZeros     , 1, 0) ///< Allow ignoring the signedness of FP zero
Index: lib/CodeGen/BackendUtil.cpp
===================================================================
--- lib/CodeGen/BackendUtil.cpp
+++ lib/CodeGen/BackendUtil.cpp
@@ -433,8 +433,6 @@
     BackendArgs.push_back("-time-passes");
   for (unsigned i = 0, e = CodeGenOpts.BackendOptions.size(); i != e; ++i)
     BackendArgs.push_back(CodeGenOpts.BackendOptions[i].c_str());
-  if (CodeGenOpts.NoGlobalMerge)
-    BackendArgs.push_back("-enable-global-merge=false");
   BackendArgs.push_back(nullptr);
   llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1,
                                     BackendArgs.data());
Index: lib/CodeGen/CodeGenModule.cpp
===================================================================
--- lib/CodeGen/CodeGenModule.cpp
+++ lib/CodeGen/CodeGenModule.cpp
@@ -418,6 +418,8 @@
   EmitVersionIdentMetadata();
 
   EmitTargetMetadata();
+
+  EmitBackendOptionsMetadata();
 }
 
 void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
@@ -3609,6 +3611,12 @@
   }
 }
 
+void CodeGenModule::EmitBackendOptionsMetadata() {
+  if (getCodeGenOpts().EnableGlobalMerge)
+    getModule().addModuleFlag(llvm::Module::Error, "Enable Global Merge",
+                              llvm::MDString::get("true"));
+}
+
 void CodeGenModule::EmitCoverageFile() {
   if (!getCodeGenOpts().CoverageFile.empty()) {
     if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) {
Index: lib/CodeGen/CodeGenModule.h
===================================================================
--- lib/CodeGen/CodeGenModule.h
+++ lib/CodeGen/CodeGenModule.h
@@ -1199,6 +1199,10 @@
   /// Emits target specific Metadata for global declarations.
   void EmitTargetMetadata();
 
+  /// Emit the module flag metadata used to pass options controlling the
+  /// the backend to LLVM.
+  void EmitBackendOptionsMetadata();
+
   /// Emit the llvm.gcov metadata used to tell LLVM where to emit the .gcno and
   /// .gcda files in a way that persists in .bc files.
   void EmitCoverageFile();
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -860,12 +860,14 @@
     }
   }
 
-  // Setting -mno-global-merge disables the codegen global merge pass. Setting 
-  // -mglobal-merge has no effect as the pass is enabled by default.
+  // Forward the -mglobal-merge option, for explicit control over the
+  // global-merge pass.
   if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
                                options::OPT_mno_global_merge)) {
     if (A->getOption().matches(options::OPT_mno_global_merge))
       CmdArgs.push_back("-mno-global-merge");
+    else
+      CmdArgs.push_back("-mglobal-merge");
   }
 
   if (!Args.hasFlag(options::OPT_mimplicit_float,
@@ -956,12 +958,14 @@
     CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
   }
 
-  // Setting -mno-global-merge disables the codegen global merge pass. Setting
-  // -mglobal-merge has no effect as the pass is enabled by default.
+  // Forward the -mglobal-merge option, for explicit control over the
+  // global-merge pass.
   if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
                                options::OPT_mno_global_merge)) {
     if (A->getOption().matches(options::OPT_mno_global_merge))
       CmdArgs.push_back("-mno-global-merge");
+    else
+      CmdArgs.push_back("-mglobal-merge");
   }
 
   if (Args.hasArg(options::OPT_ffixed_x18)) {
Index: lib/Frontend/CompilerInvocation.cpp
===================================================================
--- lib/Frontend/CompilerInvocation.cpp
+++ lib/Frontend/CompilerInvocation.cpp
@@ -309,6 +309,16 @@
   return "default";
 }
 
+static bool shouldEnableGlobalMergeForTarget(const llvm::Triple &T,
+                                             const unsigned OptLevel) {
+  llvm::Triple::ArchType Arch = T.getArch();
+  return (OptLevel > 0 &&
+          (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
+           Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)) ||
+         (OptLevel > 2 &&
+          (Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be));
+}
+
 /// \brief Create a new Regex instance out of the string value in \p RpassArg.
 /// It returns a pointer to the newly generated Regex instance.
 static std::shared_ptr<llvm::Regex>
@@ -445,7 +455,12 @@
   Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
   Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option);
   Opts.NumRegisterParameters = getLastArgIntValue(Args, OPT_mregparm, 0, Diags);
-  Opts.NoGlobalMerge = Args.hasArg(OPT_mno_global_merge);
+
+  Opts.EnableGlobalMerge = Args.hasFlag(
+      OPT_mglobal_merge, OPT_mno_global_merge,
+      shouldEnableGlobalMergeForTarget(llvm::Triple(TargetOpts.Triple),
+                                       Opts.OptimizationLevel));
+
   Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
   Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);
   Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks);
Index: test/CodeGen/global-merge.c
===================================================================
--- /dev/null
+++ test/CodeGen/global-merge.c
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -emit-llvm -mglobal-merge %s -o - | FileCheck %s -check-prefix=CHECK-GM
+// RUN: %clang_cc1 -emit-llvm -mno-global-merge %s -o - | FileCheck %s -check-prefix=CHECK-NGM
+
+// RUN: %clang_cc1 -emit-llvm -triple arm64-- -O1 %s -o - | FileCheck %s -check-prefix=CHECK-NGM
+// RUN: %clang_cc1 -emit-llvm -triple arm64-- -O3 %s -o - | FileCheck %s -check-prefix=CHECK-GM
+
+// RUN: %clang_cc1 -emit-llvm -triple arm-- -O1 %s -o - | FileCheck %s -check-prefix=CHECK-GM
+// RUN: %clang_cc1 -emit-llvm -triple arm-- -O3 %s -o - | FileCheck %s -check-prefix=CHECK-GM
+
+// CHECK-GM: !llvm.module.flags = !{{{.*}}}
+// CHECK-GM: !{{[0-9]+}} = !{i32 1, !"Enable Global Merge", !"true"}
+// CHECK-NGM: !llvm.module.flags = !{{{.*}}}
+// CHECK-NGM: !{{[0-9]+}} = !{i32 1, !"Enable Global Merge", !"false"}
Index: test/Driver/mglobal-merge.c
===================================================================
--- test/Driver/mglobal-merge.c
+++ test/Driver/mglobal-merge.c
@@ -16,5 +16,5 @@
 // RUN:   -mglobal-merge -### -fsyntax-only %s 2> %t
 // RUN: FileCheck --check-prefix=CHECK-GM < %t %s
 
-// CHECK-GM-NOT: "-mglobal-merge"
+// CHECK-GM: "-mglobal-merge"
 


_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic