]> granicus.if.org Git - llvm/commitdiff
[PM]: port IR based profUse pass to new pass manager
authorXinliang David Li <davidxl@google.com>
Tue, 10 May 2016 21:59:52 +0000 (21:59 +0000)
committerXinliang David Li <davidxl@google.com>
Tue, 10 May 2016 21:59:52 +0000 (21:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@269129 91177308-0d34-0410-b5e6-96231b3b80d8

15 files changed:
include/llvm/Transforms/PGOInstrumentation.h
lib/Passes/PassRegistry.def
lib/Transforms/Instrumentation/PGOInstrumentation.cpp
test/Transforms/PGOProfile/branch1.ll
test/Transforms/PGOProfile/branch2.ll
test/Transforms/PGOProfile/criticaledge.ll
test/Transforms/PGOProfile/diag_FE_profile.ll
test/Transforms/PGOProfile/diag_mismatch.ll
test/Transforms/PGOProfile/diag_no_funcprofdata.ll
test/Transforms/PGOProfile/diag_no_profile.ll
test/Transforms/PGOProfile/indirect_call_annotation.ll
test/Transforms/PGOProfile/landingpad.ll
test/Transforms/PGOProfile/loop1.ll
test/Transforms/PGOProfile/loop2.ll
test/Transforms/PGOProfile/switch.ll

index 42f1e175b5b3d74b78f0f71315396d9060668eca..9ab82ea0cb6104336bc6080f4f688f89dcbe91e8 100644 (file)
@@ -14,9 +14,7 @@
 #ifndef LLVM_TRANSFORMS_PGOINSTRUMENTATION_H
 #define LLVM_TRANSFORMS_PGOINSTRUMENTATION_H
 
-#include "llvm/IR/IntrinsicInst.h"
 #include "llvm/IR/PassManager.h"
-#include "llvm/ProfileData/InstrProf.h"
 #include "llvm/Transforms/Instrumentation.h"
 
 namespace llvm {
@@ -27,5 +25,15 @@ public:
   PreservedAnalyses run(Module &M, AnalysisManager<Module> &AM);
 };
 
+/// The profile annotation (profile-instr-use) pass for IR based PGO.
+class PGOInstrumentationUse : public PassInfoMixin<PGOInstrumentationUse> {
+public:
+  PreservedAnalyses run(Module &M, AnalysisManager<Module> &AM);
+  PGOInstrumentationUse(std::string Filename = "");
+
+private:
+  std::string ProfileFileName;
+};
+
 } // End llvm namespace
 #endif
index d79a39cf952325c079a9591bbd70fced063359cd..a9c896029f69ff575ee9baeac476b62283c2076f 100644 (file)
@@ -48,6 +48,7 @@ MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
 MODULE_PASS("ipsccp", IPSCCPPass())
 MODULE_PASS("no-op-module", NoOpModulePass())
 MODULE_PASS("pgo-instr-gen", PGOInstrumentationGen())
+MODULE_PASS("pgo-instr-use", PGOInstrumentationUse())
 MODULE_PASS("print", PrintModulePass(dbgs()))
 MODULE_PASS("print-callgraph", CallGraphPrinterPass(dbgs()))
 MODULE_PASS("print-lcg", LazyCallGraphPrinterPass(dbgs()))
index ef496840fab000c4c0a2b90d41df15974a2a6c60..e5e798b3fd00ac32e6da68a67cc8d92f5758c7f8 100644 (file)
@@ -151,13 +151,9 @@ public:
   }
 
 private:
-  bool annotateAllFunctions(
-      Module &M, function_ref<BranchProbabilityInfo *(Function &)> LookupBPI,
-      function_ref<BlockFrequencyInfo *(Function &)> LookupBFI);
   std::string ProfileFileName;
-  std::unique_ptr<IndexedInstrProfReader> PGOReader;
-  bool runOnModule(Module &M) override;
 
+  bool runOnModule(Module &M) override;
   void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.addRequired<BlockFrequencyInfoWrapperPass>();
   }
@@ -835,8 +831,9 @@ static void setPGOCountOnFunc(PGOUseFunc &Func,
   }
 }
 
-bool PGOInstrumentationUseLegacyPass::annotateAllFunctions(
-    Module &M, function_ref<BranchProbabilityInfo *(Function &)> LookupBPI,
+static bool annotateAllFunctions(
+    Module &M, StringRef ProfileFileName,
+    function_ref<BranchProbabilityInfo *(Function &)> LookupBPI,
     function_ref<BlockFrequencyInfo *(Function &)> LookupBFI) {
   DEBUG(dbgs() << "Read in profile counters: ");
   auto &Ctx = M.getContext();
@@ -848,10 +845,11 @@ bool PGOInstrumentationUseLegacyPass::annotateAllFunctions(
     return false;
   }
 
-  PGOReader = std::move(ReaderOrErr.get());
+  std::unique_ptr<IndexedInstrProfReader> PGOReader =
+      std::move(ReaderOrErr.get());
   if (!PGOReader) {
     Ctx.diagnose(DiagnosticInfoPGOProfile(ProfileFileName.data(),
-                                          "Cannot get PGOReader"));
+                                          StringRef("Cannot get PGOReader")));
     return false;
   }
   // TODO: might need to change the warning once the clang option is finalized.
@@ -891,6 +889,30 @@ bool PGOInstrumentationUseLegacyPass::annotateAllFunctions(
   return true;
 }
 
+PGOInstrumentationUse::PGOInstrumentationUse(std::string Filename)
+    : ProfileFileName(Filename) {
+  if (!PGOTestProfileFile.empty())
+    ProfileFileName = PGOTestProfileFile;
+}
+
+PreservedAnalyses PGOInstrumentationUse::run(Module &M,
+                                             AnalysisManager<Module> &AM) {
+
+  auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
+  auto LookupBPI = [&FAM](Function &F) {
+    return &FAM.getResult<BranchProbabilityAnalysis>(F);
+  };
+
+  auto LookupBFI = [&FAM](Function &F) {
+    return &FAM.getResult<BlockFrequencyAnalysis>(F);
+  };
+
+  if (!annotateAllFunctions(M, ProfileFileName, LookupBPI, LookupBFI))
+    return PreservedAnalyses::all();
+
+  return PreservedAnalyses::none();
+}
+
 bool PGOInstrumentationUseLegacyPass::runOnModule(Module &M) {
   if (skipModule(M))
     return false;
@@ -902,5 +924,5 @@ bool PGOInstrumentationUseLegacyPass::runOnModule(Module &M) {
     return &this->getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI();
   };
 
-  return annotateAllFunctions(M, LookupBPI, LookupBFI);
+  return annotateAllFunctions(M, ProfileFileName, LookupBPI, LookupBFI);
 }
index 7d78e8a60d4af6a5e6b6359a2398dc417dad2604..317fae2d88da500d266cdc02f6a32efbc48a13cc 100644 (file)
@@ -1,11 +1,16 @@
 ; RUN: opt < %s -pgo-instr-gen -S | FileCheck %s --check-prefix=GEN --check-prefix=GEN-COMDAT
 ; RUN: opt < %s -mtriple=x86_64-apple-darwin -pgo-instr-gen -S | FileCheck %s --check-prefix=GEN --check-prefix=GEN-DARWIN-LINKONCE
 
+; New PM
 ; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN --check-prefix=GEN-COMDAT
 ; RUN: opt < %s -mtriple=x86_64-apple-darwin -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN --check-prefix=GEN-DARWIN-LINKONCE
 
 ; RUN: llvm-profdata merge %S/Inputs/branch1.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
+
+; New PM
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
+
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 ; GEN-DARWIN-LINKONCE: target triple = "x86_64-apple-darwin"
index a31792a1f41c1df195982bdaf549594e2d2b8c22..f8df54b94d409174ec14407fdbdd08c1cc2452d6 100644 (file)
@@ -2,6 +2,7 @@
 ; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN
 ; RUN: llvm-profdata merge %S/Inputs/branch2.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
index de6893b48d8ce0ca1419bf105994a5334f5fed90..4b2ea6becfec6e0a859671d6cc460ab15d4c17a5 100644 (file)
@@ -2,6 +2,7 @@
 ; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN
 ; RUN: llvm-profdata merge %S/Inputs/criticaledge.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
index 30abe6d35190ed9c802cc598fbc740f0f846c75c..cd33954284f8abd72c17eae901984966cde61a5e 100644 (file)
@@ -1,5 +1,6 @@
 ; RUN: llvm-profdata merge %S/Inputs/diag_FE.proftext -o %t.profdata
 ; RUN: not opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S  2>&1 | FileCheck %s
+; RUN: not opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S  2>&1 | FileCheck %s
 
 ; CHECK: Not an IR level instrumentation profile
 
index a2d0b20620f0bba4feaa7def335164fb57707688..e2b7f8cdcc58e8ade2ae3354f36ab9cf46060a18 100644 (file)
@@ -1,5 +1,6 @@
 ; RUN: llvm-profdata merge %S/Inputs/diag.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S 2>&1 | FileCheck %s
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S 2>&1 | FileCheck %s
 
 ; CHECK: Function control flow change detected (hash mismatch) foo
 
index 2e5ec0444b42dbee0d9b6a83a671f8e57701a237..d49751a62b9bb3434c60c2892d680dcda13e0fed 100644 (file)
@@ -1,5 +1,6 @@
 ; RUN: llvm-profdata merge %S/Inputs/diag.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S 2>&1 | FileCheck %s
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S 2>&1 | FileCheck %s
 
 ; CHECK: No profile data available for function bar
 
index ce7b59b8f69d73fe2421df16c8d7ee22b1493b43..222d9bd098612cd1a868e9f3d625dc6ef8251920 100644 (file)
@@ -1,4 +1,5 @@
 ; RUN: not opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S  2>&1
+; RUN: not opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S  2>&1
 
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
index e2479d72bf6bb1569a589feee0a515231d435c19..6f72a998784b5ba52524ce7534c5c416257764a2 100644 (file)
@@ -1,5 +1,6 @@
 ; RUN: llvm-profdata merge %S/Inputs/indirect_call.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=VP-ANNOTATION
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=VP-ANNOTATION
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
index bd6c063580af6256e0598e5a83ca36f322a126c7..9452cd41b00856a4f16a0d334df00dc836cf2876 100644 (file)
@@ -2,6 +2,7 @@
 ; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN
 ; RUN: llvm-profdata merge %S/Inputs/landingpad.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
index 4f2c17c713df6e8d7bc51b51345124d7bb528307..5d3be183694df6cdafd6f539946411a87d7bd7e5 100644 (file)
@@ -2,6 +2,7 @@
 ; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN
 ; RUN: llvm-profdata merge %S/Inputs/loop1.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
index edf546f685eb5ea68cdd822727dee73e10974b4c..1fad53a90dca19eca35948c2afd1d58c16ba216d 100644 (file)
@@ -2,6 +2,7 @@
 ; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN
 ; RUN: llvm-profdata merge %S/Inputs/loop2.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
index 447d274fa8043f624869caff48933ebacaf3e474..e590e217013a8bd582e614b5559e896ed0a30a22 100644 (file)
@@ -2,6 +2,7 @@
 ; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN
 ; RUN: llvm-profdata merge %S/Inputs/switch.proftext -o %t.profdata
 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
+; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"