[clang] [llvm] [EntryExitInstrumenter] Move passes out of clang into LLVM default pipelines (PR #92171)

2024-05-30 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 01/15] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGen

[clang] [llvm] [EntryExitInstrumenter] Move passes out of clang into LLVM default pipelines (PR #92171)

2024-05-30 Thread Egor Pasko via cfe-commits


@@ -1030,6 +1036,12 @@ 
PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
   Phase != ThinOrFullLTOPhase::ThinLTOPostLink)
 MPM.addPass(SampleProfileProbePass(TM));
 
+  // Instrument function entry and exit before all inlining.
+  if (!isLTOPostLink(Phase)) {
+MPM.addPass(createModuleToFunctionPassAdaptor(

pasko wrote:

> the check for `Phase != ThinOrFullLTOPhase::FullLTOPostLink` is unnecessary, 
> `buildModuleSimplificationPipeline` isn't called for FullLTO post link

Removed. Indeed there is an assertion for this a few lines prior.

> I'm not sure why you're seeing that behavior if we're only running the 
> post-inline instrumenter once in the codegen pipeline

Apparently I made a mistake when building the reproducer. When checking today I 
saw everything working as expected, i.e. <=1 bare hooks inserted per function 
in the final DSO. Sorry for the noise.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [EntryExitInstrumenter] Move passes out of clang into LLVM default pipelines (PR #92171)

2024-05-30 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 01/16] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGen

[clang] [llvm] [EntryExitInstrumenter] Move passes out of clang into LLVM default pipelines (PR #92171)

2024-05-31 Thread Egor Pasko via cfe-commits

pasko wrote:

> looks like `CodeGen/AMDGPU/llc-pipeline.ll` is failing

Fixed.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-14 Thread Egor Pasko via cfe-commits

https://github.com/pasko created https://github.com/llvm/llvm-project/pull/92171

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and 
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage (but 
skip for ThinLTO post-link).

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm

[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-14 Thread Egor Pasko via cfe-commits

https://github.com/pasko converted_to_draft 
https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-15 Thread Egor Pasko via cfe-commits


@@ -670,9 +670,6 @@ void CodeGenPassBuilder::addIRPasses(
   !Opt.DisablePartialLibcallInlining)
 addPass(PartiallyInlineLibCallsPass());
 
-  // Instrument function entry and exit, e.g. with calls to mcount().
-  addPass(EntryExitInstrumenterPass(/*PostInlining=*/true));

pasko wrote:

Reverted. Thanks for sharing the context about this file!

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-15 Thread Egor Pasko via cfe-commits


@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-15 Thread Egor Pasko via cfe-commits


@@ -135,6 +138,65 @@ static bool runOnFunction(Function &F, bool PostInlining) {
   return Changed;
 }
 
+namespace {
+struct EntryExitInstrumenter : public FunctionPass {
+  static char ID;
+  EntryExitInstrumenter() : FunctionPass(ID) {
+initializeEntryExitInstrumenterPass(*PassRegistry::getPassRegistry());
+  }
+  void getAnalysisUsage(AnalysisUsage &AU) const override {
+AU.addPreserved();
+AU.addPreserved();
+  }
+  bool runOnFunction(Function &F) override { return ::runOnFunction(F, false); 
}
+};
+char EntryExitInstrumenter::ID = 0;
+
+struct PostInlineEntryExitInstrumenter : public FunctionPass {
+  static char ID;
+  PostInlineEntryExitInstrumenter() : FunctionPass(ID) {
+initializePostInlineEntryExitInstrumenterPass(
+*PassRegistry::getPassRegistry());
+  }
+  void getAnalysisUsage(AnalysisUsage &AU) const override {
+AU.addPreserved();
+AU.addPreserved();
+  }
+  bool runOnFunction(Function &F) override { return ::runOnFunction(F, true); }
+};
+char PostInlineEntryExitInstrumenter::ID = 0;
+}
+
+INITIALIZE_PASS_BEGIN(
+EntryExitInstrumenter, "ee-instrument",
+"Instrument function entry/exit with calls to e.g. mcount() (pre 
inlining)",
+false, false)
+INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
+INITIALIZE_PASS_END(
+EntryExitInstrumenter, "ee-instrument",
+"Instrument function entry/exit with calls to e.g. mcount() (pre 
inlining)",
+false, false)
+
+INITIALIZE_PASS_BEGIN(
+PostInlineEntryExitInstrumenter, "post-inline-ee-instrument",
+"Instrument function entry/exit with calls to e.g. mcount() "
+"(post inlining)",
+false, false)
+INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
+INITIALIZE_PASS_END(
+PostInlineEntryExitInstrumenter, "post-inline-ee-instrument",
+"Instrument function entry/exit with calls to e.g. mcount() "
+"(post inlining)",
+false, false)
+
+FunctionPass *llvm::createEntryExitInstrumenterPass() {

pasko wrote:

Removed.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-15 Thread Egor Pasko via cfe-commits

https://github.com/pasko edited https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-15 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 1/2] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGenPa

[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-15 Thread Egor Pasko via cfe-commits

https://github.com/pasko edited https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-15 Thread Egor Pasko via cfe-commits

pasko wrote:

> can you add links to https://reviews.llvm.org/D97608, 
> [rust-lang/rust#92109](https://github.com/rust-lang/rust/issues/92109), #52853

Done (Updated the toplevel comment on the PR) 

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-15 Thread Egor Pasko via cfe-commits

pasko wrote:

@aeubanks Thanks for the first set of comments. I think I addressed them all 
and checked that instrumentation is still WAI in my ThinkLTO example. I did not 
run/update tests yet, this is TBD. Another round of review pre-tests would be 
appreciated.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-16 Thread Egor Pasko via cfe-commits


@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);

pasko wrote:

Removed.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-16 Thread Egor Pasko via cfe-commits


@@ -1028,6 +1029,14 @@ 
PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
   Phase != ThinOrFullLTOPhase::ThinLTOPostLink)
 MPM.addPass(SampleProfileProbePass(TM));
 
+  // Instrument function entry and exit before all inlining.
+  if (Phase != ThinOrFullLTOPhase::ThinLTOPostLink &&
+  Phase != ThinOrFullLTOPhase::FullLTOPostLink &&
+  Phase != ThinOrFullLTOPhase::None) {

pasko wrote:

I was confused by setting None prior to that in 
`buildPerModuleDefaultPipeline`, but it is never called for this assignment to 
happen. Indeed, since None means non-LTO cases, we should instrument with None. 
Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-16 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 1/3] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGenPa

[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-21 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 1/4] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGenPa

[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-21 Thread Egor Pasko via cfe-commits

pasko wrote:

Hello @aeubanks,

I added a couple of new tests as you suggested. I do not have good intuition on 
their coverage. I think I will need to add a few cases, like always_inline or 
slightly more complicated code. Can you please take a look at the general 
structure? Does it roughly match your proposal above?

I would appreciate if you leave comments with specific suggestions if they come 
to your mind immediately.

This is still a WIP, but I thought that this PR would converge faster if I 
publish the current state now. A few trivial changes are still needed to tests, 
and I did not remove Clang tests yet.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-22 Thread Egor Pasko via cfe-commits


@@ -0,0 +1,29 @@
+; RUN: llc -mtriple=x86_64-- -O0 < %s | FileCheck %s
+; RUN: llc -mtriple=x86_64-- -O1 < %s | FileCheck %s
+; RUN: llc -mtriple=x86_64-- -O2 < %s | FileCheck %s
+
+; The codegen should insert post-inlining instrumentation calls and should not
+; insert pre-inlining instrumentation.
+
+; CHECK-NOT:   callq __cyg_profile_func_enter
+
+define void @leaf_function() #0 {
+; CHECK-LABEL: leaf_function:
+; CHECK:   callq __cyg_profile_func_enter_bare
+; CHECK:   movqleaf_function@GOTPCREL(%rip), %rdi

pasko wrote:

Yeah, I was also thinking that the use of a particular relocation makes it more 
brittle. I think it is nice to check that func_exit is used without an argument 
(unlike `__cyg_profile_func_enter_bare`). This can be done with the 
`CHECK-NEXT` on the line that follows. Though I did not notice this kind of 
parameter passing is already checked in 
`llvm/test/Transforms/EntryExitInstrumenter/mcount.ll`, hence now I am not sure 
how much value there is in this check.

I would not probably regret removing the line, but I'd like to try one more 
thing:
```
; CHECK:   {{.*}} %rdi
; CHECK-NEXT:  callq  __cyg_profile_func_exit
```

Will it blend?

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-22 Thread Egor Pasko via cfe-commits


@@ -0,0 +1,31 @@
+; RUN: opt -passes="default" -S < %s | FileCheck %s
+; RUN: opt -passes="thinlto-pre-link" -S < %s | FileCheck %s
+; RUN: opt -passes="thinlto-pre-link,thinlto" -S < %s | FileCheck %s
+
+target triple = "x86_64-unknown-linux"
+
+define void @leaf_function() #0 {

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-22 Thread Egor Pasko via cfe-commits


@@ -0,0 +1,31 @@
+; RUN: opt -passes="default" -S < %s | FileCheck %s
+; RUN: opt -passes="thinlto-pre-link" -S < %s | FileCheck %s
+; RUN: opt -passes="thinlto-pre-link,thinlto" -S < %s | FileCheck %s

pasko wrote:

Ah, good idea! I still went with O2 for lto/thinlto because even at O1 it does 
not inline the alwaysinline leaf, oops.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-22 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 1/6] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGenPa

[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-22 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 1/7] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGenPa

[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-22 Thread Egor Pasko via cfe-commits


@@ -0,0 +1,31 @@
+; RUN: opt -passes="default" -S < %s | FileCheck %s

pasko wrote:

Done, I think, but it is evening, and I might be missing something.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-23 Thread Egor Pasko via cfe-commits


@@ -0,0 +1,29 @@
+; RUN: llc -mtriple=x86_64-- -O0 < %s | FileCheck %s
+; RUN: llc -mtriple=x86_64-- -O1 < %s | FileCheck %s
+; RUN: llc -mtriple=x86_64-- -O2 < %s | FileCheck %s
+
+; The codegen should insert post-inlining instrumentation calls and should not
+; insert pre-inlining instrumentation.
+
+; CHECK-NOT:   callq __cyg_profile_func_enter
+
+define void @leaf_function() #0 {
+; CHECK-LABEL: leaf_function:
+; CHECK:   callq __cyg_profile_func_enter_bare
+; CHECK:   movqleaf_function@GOTPCREL(%rip), %rdi

pasko wrote:

OK, I removed the argument passing check

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-23 Thread Egor Pasko via cfe-commits


@@ -0,0 +1,44 @@
+; RUN: opt -passes="default" -S < %s | FileCheck -check-prefix=PRELTO %s
+; RUN: opt -passes="default" -S < %s | FileCheck -check-prefix=PRELTO %s
+; RUN: opt -passes="thinlto-pre-link,thinlto" -S < %s | FileCheck 
-check-prefix=PRELTO %s
+; RUN: opt -passes="thinlto-pre-link" -S < %s | FileCheck 
-check-prefix=PRELTO %s
+; RUN: opt -passes="thinlto" -S < %s | FileCheck -check-prefix=LTO %s
+; RUN: opt -passes="lto" -S < %s | FileCheck -check-prefix=LTO %s
+
+; Pre-inline instrumentation should be inserted, but not by LTO/ThinLTO passes.
+
+target triple = "x86_64-unknown-linux"
+
+define void @leaf_function() #0 {
+entry:
+  ret void
+; PRELTO-LABEL: entry:
+; PRELTO-NEXT:  %0 ={{( tail)?}} call ptr @llvm.returnaddress(i32 0)

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-23 Thread Egor Pasko via cfe-commits


@@ -0,0 +1,44 @@
+; RUN: opt -passes="default" -S < %s | FileCheck -check-prefix=PRELTO %s

pasko wrote:

Done. Went with INSTRUMENT/NOINSTRUMENT.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-23 Thread Egor Pasko via cfe-commits


@@ -0,0 +1,44 @@
+; RUN: opt -passes="default" -S < %s | FileCheck -check-prefix=PRELTO %s
+; RUN: opt -passes="default" -S < %s | FileCheck -check-prefix=PRELTO %s
+; RUN: opt -passes="thinlto-pre-link,thinlto" -S < %s | FileCheck 
-check-prefix=PRELTO %s

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-23 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 1/9] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGenPa

[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-23 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 1/9] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGenPa

[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-23 Thread Egor Pasko via cfe-commits


@@ -1,41 +0,0 @@
-// REQUIRES: arm-registered-target,aarch64-registered-target
-
-// RUN: %clang -target armv7-unknown-none-eabi -pg -S -emit-llvm -o - %s | 
FileCheck %s -check-prefixes=CHECK,UNSUPPORTED
-// RUN: %clang -target armv7-unknown-none-eabi -pg -meabi gnu -S -emit-llvm -o 
- %s | FileCheck %s --check-prefixes=CHECK,UNSUPPORTED
-// RUN: %clang --target=aarch64-unknown-none-gnu -pg -S -emit-llvm -o - %s | 
FileCheck %s --check-prefixes=CHECK,MCOUNT
-// RUN: %clang -target armv7-unknown-linux-gnueabi -pg -S -emit-llvm -o - %s | 
FileCheck %s -check-prefix CHECK -check-prefix CHECK-ARM-EABI
-// RUN: %clang -target armv7-unknown-linux-gnueabi -meabi gnu -pg -S 
-emit-llvm -o - %s | FileCheck %s -check-prefix CHECK -check-prefix 
CHECK-ARM-EABI-MEABI-GNU
-// RUN: %clang --target=aarch64-unknown-linux -pg -S -emit-llvm -o - %s | 
FileCheck %s --check-prefixes=CHECK,UNDER
-// RUN: %clang -target armv7-unknown-linux-gnueabihf -pg -S -emit-llvm -o - %s 
| FileCheck %s -check-prefix CHECK -check-prefix CHECK-ARM-EABI
-// RUN: %clang -target armv7-unknown-linux-gnueabihf -meabi gnu -pg -S 
-emit-llvm -o - %s | FileCheck %s -check-prefix CHECK -check-prefix 
CHECK-ARM-EABI-MEABI-GNU
-// RUN: %clang -target armv7-unknown-freebsd-gnueabihf -pg -S -emit-llvm -o - 
%s | FileCheck %s --check-prefixes=CHECK,UNDER_UNDER
-// RUN: %clang -target armv7-unknown-freebsd-gnueabihf -meabi gnu -pg -S 
-emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,UNDER_UNDER
-// RUN: %clang --target=aarch64-unknown-freebsd -pg -S -emit-llvm -o - %s | 
FileCheck %s -check-prefix CHECK -check-prefix CHECK-ARM64-EABI-FREEBSD
-// RUN: %clang -target armv7-unknown-openbsd-gnueabihf -pg -S -emit-llvm -o - 
%s | FileCheck %s -check-prefix CHECK -check-prefix UNDER_UNDER
-// RUN: %clang -target armv7-unknown-openbsd-gnueabihf -meabi gnu -pg -S 
-emit-llvm -o - %s | FileCheck %s -check-prefix CHECK -check-prefix UNDER_UNDER
-// RUN: %clang --target=aarch64-unknown-openbsd -pg -S -emit-llvm -o - %s | 
FileCheck %s -check-prefix CHECK -check-prefix UNDER_UNDER
-// RUN: %clang -target armv7-unknown-netbsd-gnueabihf -pg -S -emit-llvm -o - 
%s | FileCheck %s --check-prefixes=CHECK,UNDER_UNDER
-// RUN: %clang -target armv7-unknown-netbsd-gnueabihf -meabi gnu -pg -S 
-emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,UNDER_UNDER
-// RUN: %clang --target=aarch64-unknown-netbsd -pg -S -emit-llvm -o - %s | 
FileCheck %s --check-prefixes=CHECK,UNDER_UNDER
-// RUN: %clang -target armv7-apple-ios -pg -S -emit-llvm -o - %s | FileCheck 
%s --check-prefixes=CHECK,UNSUPPORTED
-// RUN: %clang -target armv7-apple-ios -pg -meabi gnu -S -emit-llvm -o - %s | 
FileCheck %s --check-prefixes=CHECK,UNSUPPORTED
-// RUN: %clang -target arm64-apple-ios -pg -S -emit-llvm -o - %s | FileCheck 
%s --check-prefixes=CHECK,UNSUPPORTED
-// RUN: %clang -target arm64-apple-ios -pg -meabi gnu -S -emit-llvm -o - %s | 
FileCheck %s --check-prefixes=CHECK,UNSUPPORTED
-// RUN: %clang -target armv7-unknown-rtems-gnueabihf -pg -S -emit-llvm -o - %s 
| FileCheck %s --check-prefixes=CHECK,MCOUNT
-// RUN: %clang -target armv7-unknown-rtems-gnueabihf -meabi gnu -pg -S 
-emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,MCOUNT
-// RUN: %clang --target=aarch64-unknown-rtems -pg -S -emit-llvm -o - %s | 
FileCheck %s -check-prefixes=CHECK,MCOUNT
-// RUN: %clang --target=aarch64-unknown-rtems -pg -S -emit-llvm -o - %s | 
FileCheck %s -check-prefixes=CHECK,MCOUNT
-
-int f() {
-  return 0;
-}
-
-// CHECK-LABEL: f
-// TODO: add profiling support for arm-baremetal

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-23 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 01/10] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGen

[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-24 Thread Egor Pasko via cfe-commits


@@ -1,37 +1,27 @@
 // REQUIRES: x86-registered-target
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -finstrument-functions -O0 
-o - -emit-llvm %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -finstrument-functions -O2 
-o - -emit-llvm %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown 
-finstrument-functions-after-inlining -O2 -o - -emit-llvm %s | FileCheck 
-check-prefix=NOINLINE %s
+// RUN: %clang_cc1 -disable-llvm-passes -triple x86_64-unknown-unknown 
-finstrument-functions -O0 -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang_cc1 -disable-llvm-passes -triple x86_64-unknown-unknown 
-finstrument-functions -O2 -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang_cc1 -disable-llvm-passes -triple x86_64-unknown-unknown 
-finstrument-functions-after-inlining -O2 -o - -emit-llvm %s | FileCheck 
-check-prefix=NOINLINE %s
 
 __attribute__((always_inline)) int leaf(int x) {
   return x;
 // CHECK-LABEL: define {{.*}} @leaf

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-24 Thread Egor Pasko via cfe-commits


@@ -1,37 +1,27 @@
 // REQUIRES: x86-registered-target
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -finstrument-functions -O0 
-o - -emit-llvm %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -finstrument-functions -O2 
-o - -emit-llvm %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown 
-finstrument-functions-after-inlining -O2 -o - -emit-llvm %s | FileCheck 
-check-prefix=NOINLINE %s
+// RUN: %clang_cc1 -disable-llvm-passes -triple x86_64-unknown-unknown 
-finstrument-functions -O0 -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang_cc1 -disable-llvm-passes -triple x86_64-unknown-unknown 
-finstrument-functions -O2 -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang_cc1 -disable-llvm-passes -triple x86_64-unknown-unknown 
-finstrument-functions-after-inlining -O2 -o - -emit-llvm %s | FileCheck 
-check-prefix=NOINLINE %s
 
 __attribute__((always_inline)) int leaf(int x) {
   return x;
 // CHECK-LABEL: define {{.*}} @leaf
-// CHECK: call void @__cyg_profile_func_enter
-// CHECK-NOT: cyg_profile
-// CHECK: call void @__cyg_profile_func_exit
 // CHECK-NOT: cyg_profile

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-24 Thread Egor Pasko via cfe-commits


@@ -1,37 +1,27 @@
 // REQUIRES: x86-registered-target
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -finstrument-functions -O0 
-o - -emit-llvm %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -finstrument-functions -O2 
-o - -emit-llvm %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown 
-finstrument-functions-after-inlining -O2 -o - -emit-llvm %s | FileCheck 
-check-prefix=NOINLINE %s
+// RUN: %clang_cc1 -disable-llvm-passes -triple x86_64-unknown-unknown 
-finstrument-functions -O0 -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang_cc1 -disable-llvm-passes -triple x86_64-unknown-unknown 
-finstrument-functions -O2 -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang_cc1 -disable-llvm-passes -triple x86_64-unknown-unknown 
-finstrument-functions-after-inlining -O2 -o - -emit-llvm %s | FileCheck 
-check-prefix=NOINLINE %s
 
 __attribute__((always_inline)) int leaf(int x) {
   return x;
 // CHECK-LABEL: define {{.*}} @leaf
-// CHECK: call void @__cyg_profile_func_enter
-// CHECK-NOT: cyg_profile
-// CHECK: call void @__cyg_profile_func_exit
 // CHECK-NOT: cyg_profile
 // CHECK: ret
 }
 
 int root(int x) {
   return leaf(x);
 // CHECK-LABEL: define {{.*}} @root
-// CHECK: call void @__cyg_profile_func_enter
-// CHECK-NOT: cyg_profile
-
-// Inlined from leaf():
-// CHECK: call void @__cyg_profile_func_enter
-// CHECK-NOT: cyg_profile
-// CHECK: call void @__cyg_profile_func_exit
 // CHECK-NOT: cyg_profile
-
-// CHECK: call void @__cyg_profile_func_exit
 // CHECK: ret
 
 // NOINLINE-LABEL: define {{.*}} @root
-// NOINLINE: call void @__cyg_profile_func_enter
-// NOINLINE-NOT: cyg_profile
-// NOINLINE: call void @__cyg_profile_func_exit
 // NOINLINE-NOT: cyg_profile
 // NOINLINE: ret
 }
+
+// CHECK: attributes #0 = { alwaysinline {{.*}} 
"instrument-function-entry"="__cyg_profile_func_enter" 
"instrument-function-exit"="__cyg_profile_func_exit"
+// CHECK: attributes #1 = { {{.*}} 
"instrument-function-entry"="__cyg_profile_func_enter" 
"instrument-function-exit"="__cyg_profile_func_exit"
+// NOINLINE: attributes #0 = { alwaysinline {{.*}} 
"instrument-function-entry-inlined"="__cyg_profile_func_enter" 
"instrument-function-exit-inlined"="__cyg_profile_func_exit"

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] wip: Move instrumentation passes (PR #92171)

2024-05-24 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 01/11] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGen

[clang] [llvm] Move instrumentation passes (PR #92171)

2024-05-24 Thread Egor Pasko via cfe-commits

https://github.com/pasko edited https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] Move instrumentation passes (PR #92171)

2024-05-24 Thread Egor Pasko via cfe-commits

https://github.com/pasko edited https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] Move instrumentation passes (PR #92171)

2024-05-24 Thread Egor Pasko via cfe-commits

https://github.com/pasko ready_for_review 
https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [EntryExitInstrumenter] Move passes out of clang into LLVM default pipelines (PR #92171)

2024-05-27 Thread Egor Pasko via cfe-commits

https://github.com/pasko edited https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [EntryExitInstrumenter] Move passes out of clang into LLVM default pipelines (PR #92171)

2024-05-27 Thread Egor Pasko via cfe-commits


@@ -1,5 +1,5 @@
 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -debug-info-kind=standalone 
-emit-llvm -o - %s -finstrument-functions | FileCheck %s

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [EntryExitInstrumenter] Move passes out of clang into LLVM default pipelines (PR #92171)

2024-05-27 Thread Egor Pasko via cfe-commits


@@ -1,25 +1,13 @@
 // RUN: %clang_cc1 -pg -triple powerpc-ibm-aix7.2.0.0 -emit-llvm %s -o - | 
FileCheck %s

pasko wrote:

Done.

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [EntryExitInstrumenter] Move passes out of clang into LLVM default pipelines (PR #92171)

2024-05-27 Thread Egor Pasko via cfe-commits

https://github.com/pasko updated https://github.com/llvm/llvm-project/pull/92171

>From df3f8dfc47cd8d7b220ed712dc7c2cab1c563f50 Mon Sep 17 00:00:00 2001
From: Egor Pasko 
Date: Mon, 6 May 2024 19:48:59 +0200
Subject: [PATCH 01/12] wip: Move instrumentation passes

This change is not ready for landing yet.

Move EntryExitInstrumenter(PostInlining=true) to as late as possible and
EntryExitInstrumenter(PostInlining=false) to an early pre-inlining stage
(but skip for ThinLTO post-link).
---
 clang/lib/CodeGen/BackendUtil.cpp | 21 ++-
 llvm/include/llvm/InitializePasses.h  |  2 +
 llvm/include/llvm/LinkAllPasses.h |  2 +
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 -
 llvm/include/llvm/Transforms/Utils.h  |  9 +++
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +
 llvm/lib/Transforms/Scalar/Scalar.cpp |  2 +
 .../Utils/EntryExitInstrumenter.cpp   | 62 +++
 llvm/tools/llc/llc.cpp|  2 +
 llvm/tools/opt/optdriver.cpp  |  2 +
 10 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 22c3f8642ad8e..f6ff605bcef87 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -987,22 +987,6 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
/*DropTypeTests=*/true));
   });
 
-if (CodeGenOpts.InstrumentFunctions ||
-CodeGenOpts.InstrumentFunctionEntryBare ||
-CodeGenOpts.InstrumentFunctionsAfterInlining ||
-CodeGenOpts.InstrumentForProfiling) {
-  PB.registerPipelineStartEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  });
-  PB.registerOptimizerLastEPCallback(
-  [](ModulePassManager &MPM, OptimizationLevel Level) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/true)));
-  });
-}
-
 // Register callbacks to schedule sanitizer passes at the appropriate part
 // of the pipeline.
 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
@@ -1016,6 +1000,11 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
 if (!IsThinLTOPostLink) {
   addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
   addKCFIPass(TargetTriple, LangOpts, PB);
+  PB.registerPipelineStartEPCallback(
+  [](ModulePassManager &MPM, OptimizationLevel Level) {
+MPM.addPass(createModuleToFunctionPassAdaptor(
+EntryExitInstrumenterPass(/*PostInlining=*/false)));
+  });
 }
 
 if (std::optional Options =
diff --git a/llvm/include/llvm/InitializePasses.h 
b/llvm/include/llvm/InitializePasses.h
index 9ba75d491c1c9..e970706e8202d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -101,6 +101,7 @@ void initializeEarlyMachineLICMPass(PassRegistry&);
 void initializeEarlyTailDuplicatePass(PassRegistry&);
 void initializeEdgeBundlesPass(PassRegistry&);
 void initializeEHContGuardCatchretPass(PassRegistry &);
+void initializeEntryExitInstrumenterPass(PassRegistry&);
 void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry&);
 void initializeExpandLargeDivRemLegacyPassPass(PassRegistry&);
 void initializeExpandMemCmpLegacyPassPass(PassRegistry &);
@@ -230,6 +231,7 @@ void 
initializePostDomOnlyViewerWrapperPassPass(PassRegistry &);
 void initializePostDomPrinterWrapperPassPass(PassRegistry &);
 void initializePostDomViewerWrapperPassPass(PassRegistry &);
 void initializePostDominatorTreeWrapperPassPass(PassRegistry&);
+void initializePostInlineEntryExitInstrumenterPass(PassRegistry&);
 void initializePostMachineSchedulerPass(PassRegistry&);
 void initializePostRAHazardRecognizerPass(PassRegistry&);
 void initializePostRAMachineSinkingPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h 
b/llvm/include/llvm/LinkAllPasses.h
index 30e7c22f31460..b432040b052a9 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -113,6 +113,8 @@ namespace {
   (void)llvm::createTLSVariableHoistPass();
   (void) llvm::createConstantHoistingPass();
   (void)llvm::createCodeGenPrepareLegacyPass();
+  (void) llvm::createEntryExitInstrumenterPass();
+  (void) llvm::createPostInlineEntryExitInstrumenterPass();
   (void) llvm::createEarlyCSEPass();
   (void) llvm::createGVNPass();
   (void) llvm::createPostDomTree();
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h 
b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 2e94a19502131..b34f6e82fb7be 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -670,9 +670,6 @@ void CodeGen

[clang] [llvm] [EntryExitInstrumenter] Move passes out of clang into LLVM default pipelines (PR #92171)

2024-05-27 Thread Egor Pasko via cfe-commits


@@ -1030,6 +1036,12 @@ 
PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
   Phase != ThinOrFullLTOPhase::ThinLTOPostLink)
 MPM.addPass(SampleProfileProbePass(TM));
 
+  // Instrument function entry and exit before all inlining.
+  if (!isLTOPostLink(Phase)) {
+MPM.addPass(createModuleToFunctionPassAdaptor(

pasko wrote:

I tried this, and all non-pipeline tests pass. Though in my local FDO+ThinLTO 
reproducer I saw this causes `__cyg_profile_func_enter_bare` to be inserted 
multiple times per toplevel function.

This behaviour surprised me. The bare instrumentation does not move with the 
change. Is removing the module to function pass adaptor making something easier 
to inline later on?

I'd like to investigate, but I am afraid I'll need some clues :)

The change:
```
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp 
b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 3a7634f90c07..cae340a19fb6 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -397,11 +397,6 @@ static bool isLTOPreLink(ThinOrFullLTOPhase Phase) {
  Phase == ThinOrFullLTOPhase::FullLTOPreLink;
 }
 
-static bool isLTOPostLink(ThinOrFullLTOPhase Phase) {
-  return Phase == ThinOrFullLTOPhase::ThinLTOPostLink ||
- Phase == ThinOrFullLTOPhase::FullLTOPostLink;
-}
-
 // TODO: Investigate the cost/benefit of tail call elimination on debugging.
 FunctionPassManager
 PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
@@ -1039,12 +1034,6 @@ 
PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
   Phase != ThinOrFullLTOPhase::ThinLTOPostLink)
 MPM.addPass(SampleProfileProbePass(TM));
 
-  // Instrument function entry and exit before all inlining.
-  if (!isLTOPostLink(Phase)) {
-MPM.addPass(createModuleToFunctionPassAdaptor(
-EntryExitInstrumenterPass(/*PostInlining=*/false)));
-  }
-
   bool HasSampleProfile = PGOOpt && (PGOOpt->Action == PGOOptions::SampleUse);
 
   // In ThinLTO mode, when flattened profile is used, all the available
@@ -1081,6 +1070,9 @@ 
PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
 MPM.addPass(CoroEarlyPass());
 
 FunctionPassManager EarlyFPM;
+if (Phase != ThinOrFullLTOPhase::FullLTOPostLink) {
+  EarlyFPM.addPass(EntryExitInstrumenterPass(/*PostInlining=*/false));
+}
 // Lower llvm.expect to metadata before attempting transforms.
 // Compare/branch metadata may alter the behavior of passes like
 // SimplifyCFG.
```

https://github.com/llvm/llvm-project/pull/92171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits