[llvm] r329267 - allow custom OptBisect classes set to LLVMContext
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 9 16:43:31 PDT 2018
Any thoughts on the layering issues (OptBisect depending on analyses, but
is part of IR, which Analysis depends on)? Can we remove the default
OptBisect behaivor & require callers to set an OptPassGate instead? (& move
OptBisect somewhere up - to Analysis or further up)
On Thu, Apr 5, 2018 at 3:32 AM Fedor Sergeev via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: fedor.sergeev
> Date: Thu Apr 5 03:29:37 2018
> New Revision: 329267
>
> URL: http://llvm.org/viewvc/llvm-project?rev=329267&view=rev
> Log:
> allow custom OptBisect classes set to LLVMContext
>
> This patch introduces a way to set custom OptPassGate instances to
> LLVMContext.
> A new instance field OptBisector and a new method setOptBisect() are added
> to the LLVMContext classes. These changes allow to set a custom OptBisect
> class
> that can make its own decisions on skipping optional passes.
>
> Another important feature of this change is ability to set different
> instances
> of OptPassGate to different LLVMContexts. So the different contexts can be
> used
> independently in several compiling threads of one process.
>
> One unit test is added.
>
> Patch by Yevgeny Rouban.
>
> Reviewers: andrew.w.kaylor, fedor.sergeev, vsk, dberlin, Eugene.Zelenko,
> reames, skatkov
> Reviewed By: andrew.w.kaylor, fedor.sergeev
> Differential Revision: https://reviews.llvm.org/D44464
>
> Modified:
> llvm/trunk/include/llvm/IR/LLVMContext.h
> llvm/trunk/lib/IR/LLVMContext.cpp
> llvm/trunk/lib/IR/LLVMContextImpl.cpp
> llvm/trunk/lib/IR/LLVMContextImpl.h
> llvm/trunk/unittests/IR/LegacyPassManagerTest.cpp
>
> Modified: llvm/trunk/include/llvm/IR/LLVMContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/LLVMContext.h?rev=329267&r1=329266&r2=329267&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/LLVMContext.h (original)
> +++ llvm/trunk/include/llvm/IR/LLVMContext.h Thu Apr 5 03:29:37 2018
> @@ -315,9 +315,16 @@ public:
> return OptionRegistry::instance().template get<ValT, Base, Mem>();
> }
>
> - /// \brief Access the object which manages optimization bisection for
> failure
> - /// analysis.
> - OptPassGate &getOptPassGate();
> + /// \brief Access the object which can disable optional passes and
> individual
> + /// optimizations at compile time.
> + OptPassGate &getOptPassGate() const;
> +
> + /// \brief Set the object which can disable optional passes and
> individual
> + /// optimizations at compile time.
> + ///
> + /// The lifetime of the object must be guaranteed to extend as long as
> the
> + /// LLVMContext is used by compilation.
> + void setOptPassGate(OptPassGate&);
>
> private:
> // Module needs access to the add/removeModule methods.
>
> Modified: llvm/trunk/lib/IR/LLVMContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContext.cpp?rev=329267&r1=329266&r2=329267&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/LLVMContext.cpp (original)
> +++ llvm/trunk/lib/IR/LLVMContext.cpp Thu Apr 5 03:29:37 2018
> @@ -332,10 +332,14 @@ void LLVMContext::setDiscardValueNames(b
> pImpl->DiscardValueNames = Discard;
> }
>
> -OptPassGate &LLVMContext::getOptPassGate() {
> +OptPassGate &LLVMContext::getOptPassGate() const {
> return pImpl->getOptPassGate();
> }
>
> +void LLVMContext::setOptPassGate(OptPassGate& OPG) {
> + pImpl->setOptPassGate(OPG);
> +}
> +
> const DiagnosticHandler *LLVMContext::getDiagHandlerPtr() const {
> return pImpl->DiagHandler.get();
> }
>
> Modified: llvm/trunk/lib/IR/LLVMContextImpl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.cpp?rev=329267&r1=329266&r2=329267&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/LLVMContextImpl.cpp (original)
> +++ llvm/trunk/lib/IR/LLVMContextImpl.cpp Thu Apr 5 03:29:37 2018
> @@ -233,6 +233,12 @@ void LLVMContextImpl::getSyncScopeNames(
> /// enabled in order to enable a consistent bisect count.
> static ManagedStatic<OptBisect> OptBisector;
>
> -OptPassGate &LLVMContextImpl::getOptPassGate() {
> - return *OptBisector;
> +OptPassGate &LLVMContextImpl::getOptPassGate() const {
> + if (!OPG)
> + OPG = &(*OptBisector);
> + return *OPG;
> +}
> +
> +void LLVMContextImpl::setOptPassGate(OptPassGate& OPG) {
> + this->OPG = &OPG;
> }
>
> Modified: llvm/trunk/lib/IR/LLVMContextImpl.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.h?rev=329267&r1=329266&r2=329267&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/LLVMContextImpl.h (original)
> +++ llvm/trunk/lib/IR/LLVMContextImpl.h Thu Apr 5 03:29:37 2018
> @@ -1355,9 +1355,18 @@ public:
> /// Destroy the ConstantArrays if they are not used.
> void dropTriviallyDeadConstantArrays();
>
> - /// \brief Access the object which manages optimization bisection for
> failure
> - /// analysis.
> - OptPassGate &getOptPassGate();
> + mutable OptPassGate *OPG = nullptr;
> +
> + /// \brief Access the object which can disable optional passes and
> individual
> + /// optimizations at compile time.
> + OptPassGate &getOptPassGate() const;
> +
> + /// \brief Set the object which can disable optional passes and
> individual
> + /// optimizations at compile time.
> + ///
> + /// The lifetime of the object must be guaranteed to extend as long as
> the
> + /// LLVMContext is used by compilation.
> + void setOptPassGate(OptPassGate&);
> };
>
> } // end namespace llvm
>
> Modified: llvm/trunk/unittests/IR/LegacyPassManagerTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/LegacyPassManagerTest.cpp?rev=329267&r1=329266&r2=329267&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/IR/LegacyPassManagerTest.cpp (original)
> +++ llvm/trunk/unittests/IR/LegacyPassManagerTest.cpp Thu Apr 5 03:29:37
> 2018
> @@ -26,6 +26,7 @@
> #include "llvm/IR/Instructions.h"
> #include "llvm/IR/LLVMContext.h"
> #include "llvm/IR/Module.h"
> +#include "llvm/IR/OptBisect.h"
> #include "llvm/Pass.h"
> #include "llvm/Support/MathExtras.h"
> #include "llvm/Support/raw_ostream.h"
> @@ -396,6 +397,67 @@ namespace llvm {
> delete M;
> }
>
> + // Skips or runs optional passes.
> + struct CustomOptPassGate : public OptPassGate {
> + bool Skip;
> + CustomOptPassGate(bool Skip) : Skip(Skip) { }
> + bool shouldRunPass(const Pass *P, const Module &U) { return !Skip; }
> + };
> +
> + // Optional module pass.
> + struct ModuleOpt: public ModulePass {
> + char run = 0;
> + static char ID;
> + ModuleOpt() : ModulePass(ID) { }
> + bool runOnModule(Module &M) override {
> + if (!skipModule(M))
> + run++;
> + return false;
> + }
> + };
> + char ModuleOpt::ID=0;
> +
> + TEST(PassManager, CustomOptPassGate) {
> + LLVMContext Context0;
> + LLVMContext Context1;
> + LLVMContext Context2;
> + CustomOptPassGate SkipOptionalPasses(true);
> + CustomOptPassGate RunOptionalPasses(false);
> +
> + Module M0("custom-opt-bisect", Context0);
> + Module M1("custom-opt-bisect", Context1);
> + Module M2("custom-opt-bisect2", Context2);
> + struct ModuleOpt *mOpt0 = new ModuleOpt();
> + struct ModuleOpt *mOpt1 = new ModuleOpt();
> + struct ModuleOpt *mOpt2 = new ModuleOpt();
> +
> + mOpt0->run = mOpt1->run = mOpt2->run = 0;
> +
> + legacy::PassManager Passes0;
> + legacy::PassManager Passes1;
> + legacy::PassManager Passes2;
> +
> + Passes0.add(mOpt0);
> + Passes1.add(mOpt1);
> + Passes2.add(mOpt2);
> +
> + Context1.setOptPassGate(SkipOptionalPasses);
> + Context2.setOptPassGate(RunOptionalPasses);
> +
> + Passes0.run(M0);
> + Passes1.run(M1);
> + Passes2.run(M2);
> +
> + // By default optional passes are run.
> + EXPECT_EQ(1, mOpt0->run);
> +
> + // The first context skips optional passes.
> + EXPECT_EQ(0, mOpt1->run);
> +
> + // The second context runs optional passes.
> + EXPECT_EQ(1, mOpt2->run);
> + }
> +
> Module *makeLLVMModule(LLVMContext &Context) {
> // Module Construction
> Module *mod = new Module("test-mem", Context);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180409/208a9431/attachment.html>
More information about the llvm-commits
mailing list