https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/102812
Keep respecting the old cl::opt for now. >From fb38b82ebd02b5763bd0ddb9cbc4b9f318651871 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Sun, 11 Aug 2024 16:36:39 +0400 Subject: [PATCH] StructurizeCFG: Add SkipUniformRegions pass parameter to new PM version Keep respecting the old cl::opt for now. --- .../llvm/Transforms/Scalar/StructurizeCFG.h | 9 ++++++ llvm/lib/Passes/PassBuilder.cpp | 5 ++++ llvm/lib/Passes/PassRegistry.def | 7 ++++- llvm/lib/Transforms/Scalar/StructurizeCFG.cpp | 28 ++++++++++++++++++- .../StructurizeCFG/AMDGPU/uniform-regions.ll | 2 ++ 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/Transforms/Scalar/StructurizeCFG.h b/llvm/include/llvm/Transforms/Scalar/StructurizeCFG.h index 50d41acd529e76..f68067d9354583 100644 --- a/llvm/include/llvm/Transforms/Scalar/StructurizeCFG.h +++ b/llvm/include/llvm/Transforms/Scalar/StructurizeCFG.h @@ -13,6 +13,15 @@ namespace llvm { struct StructurizeCFGPass : PassInfoMixin<StructurizeCFGPass> { +private: + bool SkipUniformRegions; + +public: + StructurizeCFGPass(bool SkipUniformRegions = false); + + void printPipeline(raw_ostream &OS, + function_ref<StringRef(StringRef)> MapClassName2PassName); + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; } // namespace llvm diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 7bc1c870ce5191..46f43f3de4705c 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -1085,6 +1085,11 @@ Expected<bool> parseSeparateConstOffsetFromGEPPassOptions(StringRef Params) { "SeparateConstOffsetFromGEP"); } +Expected<bool> parseStructurizeCFGPassOptions(StringRef Params) { + return PassBuilder::parseSinglePassOption(Params, "skip-uniform-regions", + "StructurizeCFG"); +} + Expected<OptimizationLevel> parseFunctionSimplificationPipelineOptions(StringRef Params) { std::optional<OptimizationLevel> L = parseOptLevel(Params); diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 95842d15a35bf6..0cec9fbd7cd05e 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -458,7 +458,6 @@ FUNCTION_PASS("slp-vectorizer", SLPVectorizerPass()) FUNCTION_PASS("slsr", StraightLineStrengthReducePass()) FUNCTION_PASS("stack-protector", StackProtectorPass(TM)) FUNCTION_PASS("strip-gc-relocates", StripGCRelocates()) -FUNCTION_PASS("structurizecfg", StructurizeCFGPass()) FUNCTION_PASS("tailcallelim", TailCallElimPass()) FUNCTION_PASS("tlshoist", TLSVariableHoistPass()) FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass()) @@ -586,6 +585,12 @@ FUNCTION_PASS_WITH_PARAMS( "sroa", "SROAPass", [](SROAOptions PreserveCFG) { return SROAPass(PreserveCFG); }, parseSROAOptions, "preserve-cfg;modify-cfg") +FUNCTION_PASS_WITH_PARAMS( + "structurizecfg", "StructurizeCFG", + [](bool SkipUniformRegions) { + return StructurizeCFGPass(SkipUniformRegions); + }, + parseStructurizeCFGPassOptions, "skip-uniform-regions") FUNCTION_PASS_WITH_PARAMS( "win-eh-prepare", "WinEHPreparePass", [](bool DemoteCatchSwitchPHIOnly) { diff --git a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp index 9c711ec183821f..a6ed58ac9d47f2 100644 --- a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp +++ b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp @@ -1212,20 +1212,46 @@ static void addRegionIntoQueue(Region &R, std::vector<Region *> &Regions) { addRegionIntoQueue(*E, Regions); } +StructurizeCFGPass::StructurizeCFGPass(bool SkipUniformRegions_) + : SkipUniformRegions(SkipUniformRegions_) { + if (ForceSkipUniformRegions.getNumOccurrences()) + SkipUniformRegions = ForceSkipUniformRegions.getValue(); +} + +void StructurizeCFGPass::printPipeline( + raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) { + static_cast<PassInfoMixin<StructurizeCFGPass> *>(this)->printPipeline( + OS, MapClassName2PassName); + if (SkipUniformRegions) + OS << "<skip-uniform-regions>"; +} + PreservedAnalyses StructurizeCFGPass::run(Function &F, FunctionAnalysisManager &AM) { bool Changed = false; DominatorTree *DT = &AM.getResult<DominatorTreeAnalysis>(F); auto &RI = AM.getResult<RegionInfoAnalysis>(F); + + UniformityInfo *UI = nullptr; + if (SkipUniformRegions) + UI = &AM.getResult<UniformityInfoAnalysis>(F); + std::vector<Region *> Regions; addRegionIntoQueue(*RI.getTopLevelRegion(), Regions); while (!Regions.empty()) { Region *R = Regions.back(); + Regions.pop_back(); + StructurizeCFG SCFG; SCFG.init(R); + + if (SkipUniformRegions && SCFG.makeUniformRegion(R, *UI)) { + Changed = true; // May have added metadata. + continue; + } + Changed |= SCFG.run(R, DT); - Regions.pop_back(); } if (!Changed) return PreservedAnalyses::all(); diff --git a/llvm/test/Transforms/StructurizeCFG/AMDGPU/uniform-regions.ll b/llvm/test/Transforms/StructurizeCFG/AMDGPU/uniform-regions.ll index ae73eedd4f502b..34c73ab8fd74f3 100644 --- a/llvm/test/Transforms/StructurizeCFG/AMDGPU/uniform-regions.ll +++ b/llvm/test/Transforms/StructurizeCFG/AMDGPU/uniform-regions.ll @@ -1,5 +1,7 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -mtriple=amdgcn-- -S -o - -structurizecfg -structurizecfg-skip-uniform-regions -structurizecfg-relaxed-uniform-regions < %s | FileCheck %s +; RUN: opt -mtriple=amdgcn-- -S -o - -passes='structurizecfg<skip-uniform-regions>' -structurizecfg-relaxed-uniform-regions < %s | FileCheck %s +; RUN: opt -mtriple=amdgcn-- -S -o - -passes=structurizecfg -structurizecfg-skip-uniform-regions -structurizecfg-relaxed-uniform-regions < %s | FileCheck %s define amdgpu_cs void @uniform(i32 inreg %v) { ; CHECK-LABEL: @uniform( _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits