myhsu updated this revision to Diff 290849.
myhsu edited the summary of this revision.
myhsu added a comment.

Unified driver options from "-fprofile-deopt-cold-*" into 
"-fprofile-omit-cold-opt" and "-fprofile-omit-cold-opt=<percentage>". Where the 
former one is just a shorthand of "-fprofile-omit-cold-opt=0"


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87338/new/

https://reviews.llvm.org/D87338

Files:
  clang/docs/ClangCommandLineReference.rst
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/lib/Driver/ToolChains/CommonArgs.cpp
  clang/test/Driver/gold-lto-omit-cold-opt.c
  clang/test/Driver/omit-cold-opt.c

Index: clang/test/Driver/omit-cold-opt.c
===================================================================
--- /dev/null
+++ clang/test/Driver/omit-cold-opt.c
@@ -0,0 +1,20 @@
+// RUN: %clang -### -fprofile-instr-use -fprofile-omit-cold-opt -c %s 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-BASE %s
+
+// RUN: %clang -### -fprofile-instr-use \
+// RUN:             -fprofile-omit-cold-opt=87 \
+// RUN:             -c %s 2>&1 \
+// RUN: | FileCheck --check-prefixes=CHECK-BASE,CHECK-PERCENT %s
+
+// RUN: %clang -### -fprofile-instr-use \
+// RUN:             -fprofile-omit-cold-opt -fno-profile-omit-cold-opt \
+// RUN:             -c %s 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-NEG %s
+
+// Shouldn't do anything if it's not using PGO profile
+// RUN: %clang -### -fprofile-omit-cold-opt -c %s 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-NEG %s
+
+// CHECK-BASE: "-mllvm" "-profile-omit-cold-func-opt=true"
+// CHECK-PERCENT: "-mllvm" "-profile-omit-cold-func-opt-percent=87"
+// CHECK-NEG-NOT: "-profile-omit-cold-func-opt=true"
Index: clang/test/Driver/gold-lto-omit-cold-opt.c
===================================================================
--- /dev/null
+++ clang/test/Driver/gold-lto-omit-cold-opt.c
@@ -0,0 +1,11 @@
+// RUN: touch %t.o
+//
+// RUN: %clang -### -fprofile-instr-use -fprofile-omit-cold-opt %t.o -flto 2>&1 \
+// RUN:     | FileCheck --check-prefix=CHECK-BASE %s
+
+// RUN: %clang -### -fprofile-instr-use -fprofile-omit-cold-opt=87 \
+// RUN:     %t.o -flto 2>&1 \
+// RUN:     | FileCheck --check-prefixes=CHECK-BASE,CHECK-PERCENT %s
+
+// CHECK-BASE: "-plugin-opt=-profile-omit-cold-func-opt=true"
+// CHECK-PERCENT: "-plugin-opt=-profile-omit-cold-func-opt-percent=87"
Index: clang/lib/Driver/ToolChains/CommonArgs.cpp
===================================================================
--- clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -516,6 +516,18 @@
       llvm::sys::path::append(Path, "default.profdata");
     CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=cs-profile-path=") +
                                          Path));
+    // Propagate -profile-omit-cold-func-opt options
+    if (Args.hasFlag(options::OPT_fprofile_omit_cold_opt,
+                     options::OPT_fprofile_omit_cold_opt_EQ,
+                     options::OPT_fno_profile_omit_cold_opt, false)) {
+      CmdArgs.push_back("-plugin-opt=-profile-omit-cold-func-opt=true");
+      Arg *A = Args.getLastArg(options::OPT_fprofile_omit_cold_opt_EQ);
+      if (A) {
+        CmdArgs.push_back(Args.MakeArgString(
+            Twine("-plugin-opt=-profile-omit-cold-func-opt-percent=") +
+            A->getValue()));
+      }
+    }
   }
 
   // Need this flag to turn on new pass manager via Gold plugin.
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -824,6 +824,19 @@
       CmdArgs.push_back(
           Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
     }
+    // Tell profile passes to avoid optimizing cold functions.
+    if (Args.hasFlag(options::OPT_fprofile_omit_cold_opt,
+                     options::OPT_fprofile_omit_cold_opt_EQ,
+                     options::OPT_fno_profile_omit_cold_opt, false)) {
+      CmdArgs.push_back("-mllvm");
+      CmdArgs.push_back("-profile-omit-cold-func-opt=true");
+
+      if (Arg *A = Args.getLastArg(options::OPT_fprofile_omit_cold_opt_EQ)) {
+        CmdArgs.push_back("-mllvm");
+        CmdArgs.push_back(Args.MakeArgString(
+            Twine("-profile-omit-cold-func-opt-percent=") + A->getValue()));
+      }
+    }
   }
 
   bool EmitCovNotes = Args.hasFlag(options::OPT_ftest_coverage,
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -793,6 +793,17 @@
     Alias<fdebug_compilation_dir>;
 defm debug_info_for_profiling : OptInFFlag<"debug-info-for-profiling",
   "Emit extra debug info to make sample profile more accurate">;
+
+// Options to omit optimizations on cold code.
+def fprofile_omit_cold_opt : Flag<["-"], "fprofile-omit-cold-opt">,
+    Group<f_Group>, Flags<[CoreOption]>,
+    HelpText<"Do not optimize functions that profiling indicates are cold">;
+def fno_profile_omit_cold_opt : Flag<["-"], "fno-profile-omit-cold-opt">,
+    Group<f_Group>, Flags<[CoreOption]>;
+def fprofile_omit_cold_opt_EQ : Joined<["-"], "fprofile-omit-cold-opt=">,
+    Group<f_Group>, Flags<[CoreOption]>, MetaVarName<"<percentage>">,
+    HelpText<"Do not optimize functions whose profiling count is lower than this percentage">;
+
 def fprofile_instr_generate : Flag<["-"], "fprofile-instr-generate">,
     Group<f_Group>, Flags<[CoreOption]>,
     HelpText<"Generate instrumented code to collect execution counts into default.profraw file (overridden by '=' form of option or LLVM_PROFILE_FILE env var)">;
Index: clang/docs/ClangCommandLineReference.rst
===================================================================
--- clang/docs/ClangCommandLineReference.rst
+++ clang/docs/ClangCommandLineReference.rst
@@ -2016,6 +2016,16 @@
 
 Use instrumentation data for profile-guided optimization. If pathname is a directory, it reads from <pathname>/default.profdata. Otherwise, it reads from file <pathname>.
 
+.. option:: -fprofile-omit-cold-opt, -fno-profile-omit-cold-opt
+
+Adds ``optnone`` attributes to functions whose instrumentation-based PGO profiling counts are equal to zero (i.e. "cold").
+
+.. program:: clang1
+.. option:: -fprofile-omit-cold-opt=<percentage>
+.. program:: clang
+
+This allows you to choose the lower <percentage>% of functions, sorted by their profiling counts, as cold functions that will not be optimized.
+
 .. option:: -freciprocal-math, -fno-reciprocal-math
 
 Allow division operations to be reassociated
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to