[llvm] 9e66206 - [Passes] Generalize ShouldRunExtraVectorPasses to allow re-use (NFCI). (#118323)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 4 08:55:11 PST 2024
Author: Florian Hahn
Date: 2024-12-04T16:55:06Z
New Revision: 9e662066388318dbce65514c98aa5c9d70d7d264
URL: https://github.com/llvm/llvm-project/commit/9e662066388318dbce65514c98aa5c9d70d7d264
DIFF: https://github.com/llvm/llvm-project/commit/9e662066388318dbce65514c98aa5c9d70d7d264.diff
LOG: [Passes] Generalize ShouldRunExtraVectorPasses to allow re-use (NFCI). (#118323)
Generalize ShouldRunExtraVectorPasses to ShouldRunExtraPasses, to allow
re-use for other transformations.
PR: https://github.com/llvm/llvm-project/pull/118323
Added:
llvm/include/llvm/Transforms/Utils/ExtraPassManager.h
Modified:
llvm/include/llvm/Transforms/Scalar/SimpleLoopUnswitch.h
llvm/include/llvm/Transforms/Vectorize/LoopVectorize.h
llvm/lib/Passes/PassBuilder.cpp
llvm/lib/Passes/PassBuilderPipelines.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/Scalar/SimpleLoopUnswitch.h b/llvm/include/llvm/Transforms/Scalar/SimpleLoopUnswitch.h
index a40b0a2a9ab72f..0cc49e4755257d 100644
--- a/llvm/include/llvm/Transforms/Scalar/SimpleLoopUnswitch.h
+++ b/llvm/include/llvm/Transforms/Scalar/SimpleLoopUnswitch.h
@@ -13,6 +13,7 @@
#include "llvm/Analysis/LoopAnalysisManager.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Transforms/Scalar/LoopPassManager.h"
+#include "llvm/Transforms/Utils/ExtraPassManager.h"
namespace llvm {
@@ -21,40 +22,6 @@ class Loop;
class StringRef;
class raw_ostream;
-struct ShouldRunExtraSimpleLoopUnswitch
- : public AnalysisInfoMixin<ShouldRunExtraSimpleLoopUnswitch> {
- static AnalysisKey Key;
- struct Result {
- bool invalidate(Loop &L, const PreservedAnalyses &PA,
- LoopAnalysisManager::Invalidator &) {
- // Check whether the analysis has been explicitly invalidated. Otherwise,
- // it remains preserved.
- auto PAC = PA.getChecker<ShouldRunExtraSimpleLoopUnswitch>();
- return !PAC.preservedWhenStateless();
- }
- };
-
- Result run(Loop &L, LoopAnalysisManager &AM,
- LoopStandardAnalysisResults &AR) {
- return Result();
- }
-
- static bool isRequired() { return true; }
-};
-
-struct ExtraSimpleLoopUnswitchPassManager : public LoopPassManager {
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,
- LoopStandardAnalysisResults &AR, LPMUpdater &U) {
- auto PA = PreservedAnalyses::all();
- if (AM.getCachedResult<ShouldRunExtraSimpleLoopUnswitch>(L))
- PA.intersect(LoopPassManager::run(L, AM, AR, U));
- PA.abandon<ShouldRunExtraSimpleLoopUnswitch>();
- return PA;
- }
-
- static bool isRequired() { return true; }
-};
-
/// This pass transforms loops that contain branches or switches on loop-
/// invariant conditions to have multiple loops. For example, it turns the left
/// into the right code:
@@ -113,6 +80,14 @@ class SimpleLoopUnswitchPass : public PassInfoMixin<SimpleLoopUnswitchPass> {
function_ref<StringRef(StringRef)> MapClassName2PassName);
};
+/// A marker analysis to determine if SimpleLoopUnswitch should run again on a
+/// given loop.
+struct ShouldRunExtraSimpleLoopUnswitch
+ : public ShouldRunExtraPasses<ShouldRunExtraSimpleLoopUnswitch>,
+ public AnalysisInfoMixin<ShouldRunExtraSimpleLoopUnswitch> {
+ static AnalysisKey Key;
+};
+
} // end namespace llvm
#endif // LLVM_TRANSFORMS_SCALAR_SIMPLELOOPUNSWITCH_H
diff --git a/llvm/include/llvm/Transforms/Utils/ExtraPassManager.h b/llvm/include/llvm/Transforms/Utils/ExtraPassManager.h
new file mode 100644
index 00000000000000..7ea50a5584dde0
--- /dev/null
+++ b/llvm/include/llvm/Transforms/Utils/ExtraPassManager.h
@@ -0,0 +1,85 @@
+//===- ExtraFunctionPassManager.h - Run Optimizations on Demand -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+/// \file
+///
+/// This file provides a pass manager that only runs its passes if the
+/// provided marker analysis has been preserved, together with a class to
+/// define such a marker analysis.
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TRANSFORMS_UTILS_EXTRAPASSMANAGER_H
+#define LLVM_TRANSFORMS_UTILS_EXTRAPASSMANAGER_H
+
+#include "llvm/IR/PassManager.h"
+#include "llvm/Transforms/Scalar/LoopPassManager.h"
+
+namespace llvm {
+
+/// A marker analysis to determine if extra passes should be run on demand.
+/// Passes requesting extra transformations to run need to request and preserve
+/// this analysis.
+template <typename MarkerTy> struct ShouldRunExtraPasses {
+ struct Result {
+ bool invalidate(Function &F, const PreservedAnalyses &PA,
+ FunctionAnalysisManager::Invalidator &) {
+ // Check whether the analysis has been explicitly invalidated. Otherwise,
+ // it remains preserved.
+ auto PAC = PA.getChecker<MarkerTy>();
+ return !PAC.preservedWhenStateless();
+ }
+
+ bool invalidate(Loop &L, const PreservedAnalyses &PA,
+ LoopAnalysisManager::Invalidator &) {
+ // Check whether the analysis has been explicitly invalidated. Otherwise,
+ // it remains preserved.
+ auto PAC = PA.getChecker<MarkerTy>();
+ return !PAC.preservedWhenStateless();
+ }
+ };
+
+ Result run(Function &F, FunctionAnalysisManager &FAM) { return Result(); }
+
+ Result run(Loop &L, LoopAnalysisManager &AM,
+ LoopStandardAnalysisResults &AR) {
+ return Result();
+ }
+};
+
+/// A pass manager to run a set of extra function passes if the
+/// ShouldRunExtraPasses marker analysis is present. This allows passes to
+/// request additional transformations on demand. An example is extra
+/// simplifications after loop-vectorization, if runtime checks have been added.
+template <typename MarkerTy>
+struct ExtraFunctionPassManager : public FunctionPassManager {
+ PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) {
+ auto PA = PreservedAnalyses::all();
+ if (AM.getCachedResult<MarkerTy>(F))
+ PA.intersect(FunctionPassManager::run(F, AM));
+ PA.abandon<MarkerTy>();
+ return PA;
+ }
+};
+
+/// A pass manager to run a set of extra loop passes if the MarkerTy analysis is
+/// present. This allows passes to request additional transformations on demand.
+/// An example is doing additional runs of SimpleLoopUnswitch.
+template <typename MarkerTy>
+struct ExtraLoopPassManager : public LoopPassManager {
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,
+ LoopStandardAnalysisResults &AR, LPMUpdater &U) {
+ auto PA = PreservedAnalyses::all();
+ if (AM.getCachedResult<MarkerTy>(L))
+ PA.intersect(LoopPassManager::run(L, AM, AR, U));
+ PA.abandon<MarkerTy>();
+ return PA;
+ }
+};
+
+} // namespace llvm
+
+#endif // LLVM_TRANSFORMS_UTILS_EXTRAPASSMANAGER_H
diff --git a/llvm/include/llvm/Transforms/Vectorize/LoopVectorize.h b/llvm/include/llvm/Transforms/Vectorize/LoopVectorize.h
index 24b6354662955e..02935d0943f766 100644
--- a/llvm/include/llvm/Transforms/Vectorize/LoopVectorize.h
+++ b/llvm/include/llvm/Transforms/Vectorize/LoopVectorize.h
@@ -58,6 +58,7 @@
#include "llvm/IR/PassManager.h"
#include "llvm/Support/CommandLine.h"
+#include "llvm/Transforms/Utils/ExtraPassManager.h"
#include <functional>
namespace llvm {
@@ -80,38 +81,6 @@ class TargetTransformInfo;
extern cl::opt<bool> EnableLoopInterleaving;
extern cl::opt<bool> EnableLoopVectorization;
-/// A marker to determine if extra passes after loop vectorization should be
-/// run.
-struct ShouldRunExtraVectorPasses
- : public AnalysisInfoMixin<ShouldRunExtraVectorPasses> {
- static AnalysisKey Key;
- struct Result {
- bool invalidate(Function &F, const PreservedAnalyses &PA,
- FunctionAnalysisManager::Invalidator &) {
- // Check whether the analysis has been explicitly invalidated. Otherwise,
- // it remains preserved.
- auto PAC = PA.getChecker<ShouldRunExtraVectorPasses>();
- return !PAC.preservedWhenStateless();
- }
- };
-
- Result run(Function &F, FunctionAnalysisManager &FAM) { return Result(); }
-};
-
-/// A pass manager to run a set of extra function simplification passes after
-/// vectorization, if requested. LoopVectorize caches the
-/// ShouldRunExtraVectorPasses analysis to request extra simplifications, if
-/// they could be beneficial.
-struct ExtraVectorPassManager : public FunctionPassManager {
- PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) {
- auto PA = PreservedAnalyses::all();
- if (AM.getCachedResult<ShouldRunExtraVectorPasses>(F))
- PA.intersect(FunctionPassManager::run(F, AM));
- PA.abandon<ShouldRunExtraVectorPasses>();
- return PA;
- }
-};
-
struct LoopVectorizeOptions {
/// If false, consider all loops for interleaving.
/// If true, only loops that explicitly request interleaving are considered.
@@ -201,6 +170,13 @@ void reportVectorizationFailure(const StringRef DebugMsg,
const StringRef OREMsg, const StringRef ORETag,
OptimizationRemarkEmitter *ORE, Loop *TheLoop, Instruction *I = nullptr);
+/// A marker analysis to determine if extra passes should be run after loop
+/// vectorization.
+struct ShouldRunExtraVectorPasses
+ : public ShouldRunExtraPasses<ShouldRunExtraVectorPasses>,
+ public AnalysisInfoMixin<ShouldRunExtraVectorPasses> {
+ static AnalysisKey Key;
+};
} // end namespace llvm
#endif // LLVM_TRANSFORMS_VECTORIZE_LOOPVECTORIZE_H
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index cc9f59727c6040..77dea7d06d0900 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -311,6 +311,7 @@
#include "llvm/Transforms/Utils/DXILUpgrade.h"
#include "llvm/Transforms/Utils/Debugify.h"
#include "llvm/Transforms/Utils/EntryExitInstrumenter.h"
+#include "llvm/Transforms/Utils/ExtraPassManager.h"
#include "llvm/Transforms/Utils/FixIrreducible.h"
#include "llvm/Transforms/Utils/HelloWorld.h"
#include "llvm/Transforms/Utils/IRNormalizer.h"
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 5a7c327de95870..d737ea5ab070a9 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -134,6 +134,7 @@
#include "llvm/Transforms/Utils/CanonicalizeAliases.h"
#include "llvm/Transforms/Utils/CountVisits.h"
#include "llvm/Transforms/Utils/EntryExitInstrumenter.h"
+#include "llvm/Transforms/Utils/ExtraPassManager.h"
#include "llvm/Transforms/Utils/InjectTLIMappings.h"
#include "llvm/Transforms/Utils/LibCallsShrinkWrap.h"
#include "llvm/Transforms/Utils/Mem2Reg.h"
@@ -660,7 +661,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
LPM2.addPass(IndVarSimplifyPass());
{
- ExtraSimpleLoopUnswitchPassManager ExtraPasses;
+ ExtraLoopPassManager<ShouldRunExtraSimpleLoopUnswitch> ExtraPasses;
ExtraPasses.addPass(SimpleLoopUnswitchPass(/* NonTrivial */ Level ==
OptimizationLevel::O3));
LPM2.addPass(std::move(ExtraPasses));
@@ -1307,7 +1308,7 @@ void PassBuilder::addVectorPasses(OptimizationLevel Level,
FPM.addPass(InstCombinePass());
if (Level.getSpeedupLevel() > 1 && ExtraVectorizerPasses) {
- ExtraVectorPassManager ExtraPasses;
+ ExtraFunctionPassManager<ShouldRunExtraVectorPasses> ExtraPasses;
// At higher optimization levels, try to clean up any runtime overlap and
// alignment checks inserted by the vectorizer. We want to track correlated
// runtime checks for two inner loops in the same outer loop, fold any
More information about the llvm-commits
mailing list