Skip to content

Commit

Permalink
StructurizeCFG: Add SkipUniformRegions pass parameter to new PM versi…
Browse files Browse the repository at this point in the history
…on (#102812)

Keep respecting the old cl::opt for now.
  • Loading branch information
arsenm authored Aug 12, 2024
1 parent 05b75e0 commit f86da4c
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 2 deletions.
9 changes: 9 additions & 0 deletions llvm/include/llvm/Transforms/Scalar/StructurizeCFG.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
7 changes: 6 additions & 1 deletion llvm/lib/Passes/PassRegistry.def
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down Expand Up @@ -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) {
Expand Down
28 changes: 27 additions & 1 deletion llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Transforms/StructurizeCFG/AMDGPU/uniform-regions.ll
Original file line number Diff line number Diff line change
@@ -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(
Expand Down

0 comments on commit f86da4c

Please sign in to comment.