@@ -1212,20 +1212,46 @@ static void addRegionIntoQueue(Region &R, std::vector<Region *> &Regions) {
1212
1212
addRegionIntoQueue (*E, Regions);
1213
1213
}
1214
1214
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
+
1215
1229
PreservedAnalyses StructurizeCFGPass::run (Function &F,
1216
1230
FunctionAnalysisManager &AM) {
1217
1231
1218
1232
bool Changed = false ;
1219
1233
DominatorTree *DT = &AM.getResult <DominatorTreeAnalysis>(F);
1220
1234
auto &RI = AM.getResult <RegionInfoAnalysis>(F);
1235
+
1236
+ UniformityInfo *UI = nullptr ;
1237
+ if (SkipUniformRegions)
1238
+ UI = &AM.getResult <UniformityInfoAnalysis>(F);
1239
+
1221
1240
std::vector<Region *> Regions;
1222
1241
addRegionIntoQueue (*RI.getTopLevelRegion (), Regions);
1223
1242
while (!Regions.empty ()) {
1224
1243
Region *R = Regions.back ();
1244
+ Regions.pop_back ();
1245
+
1225
1246
StructurizeCFG SCFG;
1226
1247
SCFG.init (R);
1248
+
1249
+ if (SkipUniformRegions && SCFG.makeUniformRegion (R, *UI)) {
1250
+ Changed = true ; // May have added metadata.
1251
+ continue ;
1252
+ }
1253
+
1227
1254
Changed |= SCFG.run (R, DT);
1228
- Regions.pop_back ();
1229
1255
}
1230
1256
if (!Changed)
1231
1257
return PreservedAnalyses::all ();
0 commit comments