Skip to content

Commit fb38b82

Browse files
committed
StructurizeCFG: Add SkipUniformRegions pass parameter to new PM version
Keep respecting the old cl::opt for now.
1 parent 0bf4c6c commit fb38b82

File tree

5 files changed

+49
-2
lines changed

5 files changed

+49
-2
lines changed

llvm/include/llvm/Transforms/Scalar/StructurizeCFG.h

+9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@
1313

1414
namespace llvm {
1515
struct StructurizeCFGPass : PassInfoMixin<StructurizeCFGPass> {
16+
private:
17+
bool SkipUniformRegions;
18+
19+
public:
20+
StructurizeCFGPass(bool SkipUniformRegions = false);
21+
22+
void printPipeline(raw_ostream &OS,
23+
function_ref<StringRef(StringRef)> MapClassName2PassName);
24+
1625
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
1726
};
1827
} // namespace llvm

llvm/lib/Passes/PassBuilder.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,11 @@ Expected<bool> parseSeparateConstOffsetFromGEPPassOptions(StringRef Params) {
10851085
"SeparateConstOffsetFromGEP");
10861086
}
10871087

1088+
Expected<bool> parseStructurizeCFGPassOptions(StringRef Params) {
1089+
return PassBuilder::parseSinglePassOption(Params, "skip-uniform-regions",
1090+
"StructurizeCFG");
1091+
}
1092+
10881093
Expected<OptimizationLevel>
10891094
parseFunctionSimplificationPipelineOptions(StringRef Params) {
10901095
std::optional<OptimizationLevel> L = parseOptLevel(Params);

llvm/lib/Passes/PassRegistry.def

+6-1
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,6 @@ FUNCTION_PASS("slp-vectorizer", SLPVectorizerPass())
458458
FUNCTION_PASS("slsr", StraightLineStrengthReducePass())
459459
FUNCTION_PASS("stack-protector", StackProtectorPass(TM))
460460
FUNCTION_PASS("strip-gc-relocates", StripGCRelocates())
461-
FUNCTION_PASS("structurizecfg", StructurizeCFGPass())
462461
FUNCTION_PASS("tailcallelim", TailCallElimPass())
463462
FUNCTION_PASS("tlshoist", TLSVariableHoistPass())
464463
FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass())
@@ -586,6 +585,12 @@ FUNCTION_PASS_WITH_PARAMS(
586585
"sroa", "SROAPass",
587586
[](SROAOptions PreserveCFG) { return SROAPass(PreserveCFG); },
588587
parseSROAOptions, "preserve-cfg;modify-cfg")
588+
FUNCTION_PASS_WITH_PARAMS(
589+
"structurizecfg", "StructurizeCFG",
590+
[](bool SkipUniformRegions) {
591+
return StructurizeCFGPass(SkipUniformRegions);
592+
},
593+
parseStructurizeCFGPassOptions, "skip-uniform-regions")
589594
FUNCTION_PASS_WITH_PARAMS(
590595
"win-eh-prepare", "WinEHPreparePass",
591596
[](bool DemoteCatchSwitchPHIOnly) {

llvm/lib/Transforms/Scalar/StructurizeCFG.cpp

+27-1
Original file line numberDiff line numberDiff line change
@@ -1212,20 +1212,46 @@ static void addRegionIntoQueue(Region &R, std::vector<Region *> &Regions) {
12121212
addRegionIntoQueue(*E, Regions);
12131213
}
12141214

1215+
StructurizeCFGPass::StructurizeCFGPass(bool SkipUniformRegions_)
1216+
: SkipUniformRegions(SkipUniformRegions_) {
1217+
if (ForceSkipUniformRegions.getNumOccurrences())
1218+
SkipUniformRegions = ForceSkipUniformRegions.getValue();
1219+
}
1220+
1221+
void StructurizeCFGPass::printPipeline(
1222+
raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
1223+
static_cast<PassInfoMixin<StructurizeCFGPass> *>(this)->printPipeline(
1224+
OS, MapClassName2PassName);
1225+
if (SkipUniformRegions)
1226+
OS << "<skip-uniform-regions>";
1227+
}
1228+
12151229
PreservedAnalyses StructurizeCFGPass::run(Function &F,
12161230
FunctionAnalysisManager &AM) {
12171231

12181232
bool Changed = false;
12191233
DominatorTree *DT = &AM.getResult<DominatorTreeAnalysis>(F);
12201234
auto &RI = AM.getResult<RegionInfoAnalysis>(F);
1235+
1236+
UniformityInfo *UI = nullptr;
1237+
if (SkipUniformRegions)
1238+
UI = &AM.getResult<UniformityInfoAnalysis>(F);
1239+
12211240
std::vector<Region *> Regions;
12221241
addRegionIntoQueue(*RI.getTopLevelRegion(), Regions);
12231242
while (!Regions.empty()) {
12241243
Region *R = Regions.back();
1244+
Regions.pop_back();
1245+
12251246
StructurizeCFG SCFG;
12261247
SCFG.init(R);
1248+
1249+
if (SkipUniformRegions && SCFG.makeUniformRegion(R, *UI)) {
1250+
Changed = true; // May have added metadata.
1251+
continue;
1252+
}
1253+
12271254
Changed |= SCFG.run(R, DT);
1228-
Regions.pop_back();
12291255
}
12301256
if (!Changed)
12311257
return PreservedAnalyses::all();

llvm/test/Transforms/StructurizeCFG/AMDGPU/uniform-regions.ll

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt -mtriple=amdgcn-- -S -o - -structurizecfg -structurizecfg-skip-uniform-regions -structurizecfg-relaxed-uniform-regions < %s | FileCheck %s
3+
; RUN: opt -mtriple=amdgcn-- -S -o - -passes='structurizecfg<skip-uniform-regions>' -structurizecfg-relaxed-uniform-regions < %s | FileCheck %s
4+
; RUN: opt -mtriple=amdgcn-- -S -o - -passes=structurizecfg -structurizecfg-skip-uniform-regions -structurizecfg-relaxed-uniform-regions < %s | FileCheck %s
35

46
define amdgpu_cs void @uniform(i32 inreg %v) {
57
; CHECK-LABEL: @uniform(

0 commit comments

Comments
 (0)