[llvm] r309076 - Add test coverage for new PM PGOOpt handling.

Dehao Chen via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 25 19:00:43 PDT 2017


Author: dehao
Date: Tue Jul 25 19:00:43 2017
New Revision: 309076

URL: http://llvm.org/viewvc/llvm-project?rev=309076&view=rev
Log:
Add test coverage for new PM PGOOpt handling.

Summary: This patch adds flags and tests to cover the PGOOpt handling logic in new PM.

Reviewers: chandlerc, davide

Reviewed By: chandlerc

Subscribers: sanjoy, llvm-commits

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

Added:
    llvm/trunk/test/Other/Inputs/new-pm-pgo.prof
    llvm/trunk/test/Other/Inputs/new-pm-pgo.proftext
    llvm/trunk/test/Other/new-pm-pgo.ll
Modified:
    llvm/trunk/include/llvm/Passes/PassBuilder.h
    llvm/trunk/tools/opt/NewPMDriver.cpp

Modified: llvm/trunk/include/llvm/Passes/PassBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Passes/PassBuilder.h?rev=309076&r1=309075&r2=309076&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Passes/PassBuilder.h (original)
+++ llvm/trunk/include/llvm/Passes/PassBuilder.h Tue Jul 25 19:00:43 2017
@@ -29,10 +29,14 @@ class TargetMachine;
 
 /// A struct capturing PGO tunables.
 struct PGOOptions {
-  std::string ProfileGenFile = "";
-  std::string ProfileUseFile = "";
-  std::string SampleProfileFile = "";
-  bool RunProfileGen = false;
+  PGOOptions(std::string ProfileGenFile = "", std::string ProfileUseFile = "",
+             std::string SampleProfileFile = "", bool RunProfileGen = false)
+      : ProfileGenFile(ProfileGenFile), ProfileUseFile(ProfileUseFile),
+        SampleProfileFile(SampleProfileFile), RunProfileGen(RunProfileGen) {}
+  std::string ProfileGenFile;
+  std::string ProfileUseFile;
+  std::string SampleProfileFile;
+  bool RunProfileGen;
 };
 
 /// \brief This class provides access to building LLVM's passes.

Added: llvm/trunk/test/Other/Inputs/new-pm-pgo.prof
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/Inputs/new-pm-pgo.prof?rev=309076&view=auto
==============================================================================
--- llvm/trunk/test/Other/Inputs/new-pm-pgo.prof (added)
+++ llvm/trunk/test/Other/Inputs/new-pm-pgo.prof Tue Jul 25 19:00:43 2017
@@ -0,0 +1 @@
+foo:0:0

Added: llvm/trunk/test/Other/Inputs/new-pm-pgo.proftext
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/Inputs/new-pm-pgo.proftext?rev=309076&view=auto
==============================================================================
--- llvm/trunk/test/Other/Inputs/new-pm-pgo.proftext (added)
+++ llvm/trunk/test/Other/Inputs/new-pm-pgo.proftext Tue Jul 25 19:00:43 2017
@@ -0,0 +1 @@
+:ir

Added: llvm/trunk/test/Other/new-pm-pgo.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pm-pgo.ll?rev=309076&view=auto
==============================================================================
--- llvm/trunk/test/Other/new-pm-pgo.ll (added)
+++ llvm/trunk/test/Other/new-pm-pgo.ll Tue Jul 25 19:00:43 2017
@@ -0,0 +1,12 @@
+; RUN: opt -debug-pass-manager -passes='default<O2>' -pgo-kind=new-pm-pgo-instr-gen-pipeline -profile-file='temp' %s 2>&1 |FileCheck %s --check-prefixes=GEN
+; RUN: llvm-profdata merge %S/Inputs/new-pm-pgo.proftext -o %t.profdata
+; RUN: opt -debug-pass-manager -passes='default<O2>' -pgo-kind=new-pm-pgo-instr-use-pipeline -profile-file='%t.profdata' %s 2>&1 |FileCheck %s --check-prefixes=USE
+; RUN: opt -debug-pass-manager -passes='default<O2>' -pgo-kind=new-pm-pgo-sample-use-pipeline -profile-file='%S/Inputs/new-pm-pgo.prof' %s 2>&1 |FileCheck %s --check-prefixes=SAMPLE_USE
+;
+; GEN: Running pass: PGOInstrumentationGen
+; USE: Running pass: PGOInstrumentationUse
+; SAMPLE_USE: Running pass: SampleProfileLoaderPass
+
+define void @foo() {
+  ret void
+}

Modified: llvm/trunk/tools/opt/NewPMDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/NewPMDriver.cpp?rev=309076&r1=309075&r2=309076&view=diff
==============================================================================
--- llvm/trunk/tools/opt/NewPMDriver.cpp (original)
+++ llvm/trunk/tools/opt/NewPMDriver.cpp Tue Jul 25 19:00:43 2017
@@ -81,6 +81,19 @@ static cl::opt<std::string> VectorizerSt
     cl::desc("A textual description of the function pass pipeline inserted at "
              "the VectorizerStart extension point into default pipelines"),
     cl::Hidden);
+enum PGOKind { NoPGO, InstrGen, InstrUse, SampleUse };
+static cl::opt<PGOKind> PGOKindFlag(
+    "pgo-kind", cl::init(NoPGO), cl::Hidden,
+    cl::desc("The kind of profile guided optimization"),
+    cl::values(clEnumValN(NoPGO, "nopgo", "Do not use PGO."),
+               clEnumValN(InstrGen, "new-pm-pgo-instr-gen-pipeline",
+                          "Instrument the IR to generate profile."),
+               clEnumValN(InstrUse, "new-pm-pgo-instr-use-pipeline",
+                          "Use instrumented profile to guide PGO."),
+               clEnumValN(SampleUse, "new-pm-pgo-sample-use-pipeline",
+                          "Use sampled profile to guide PGO.")));
+static cl::opt<std::string> ProfileFile(
+    "profile-file", cl::desc("Path to the profile."), cl::Hidden);
 /// @}}
 
 template <typename PassManagerT>
@@ -153,7 +166,22 @@ bool llvm::runPassPipeline(StringRef Arg
                            bool ShouldPreserveBitcodeUseListOrder,
                            bool EmitSummaryIndex, bool EmitModuleHash) {
   bool VerifyEachPass = VK == VK_VerifyEachPass;
-  PassBuilder PB(TM);
+
+  Optional<PGOOptions> P;
+  switch (PGOKindFlag) {
+    case InstrGen:
+      P = PGOOptions(ProfileFile, "", "", true);
+      break;
+    case InstrUse:
+      P = PGOOptions("", ProfileFile, "", false);
+      break;
+    case SampleUse:
+      P = PGOOptions("", "", ProfileFile, false);
+      break;
+    case NoPGO:
+      P = None;      
+  }
+  PassBuilder PB(TM, P);
   registerEPCallbacks(PB, VerifyEachPass, DebugPM);
 
   // Specially handle the alias analysis manager so that we can register




More information about the llvm-commits mailing list