@@ -299,47 +299,25 @@ FunctionPass *llvm::createLegacyDivergenceAnalysisPass() {
299
299
return new LegacyDivergenceAnalysis ();
300
300
}
301
301
302
- void LegacyDivergenceAnalysis::getAnalysisUsage (AnalysisUsage &AU) const {
303
- AU.addRequiredTransitive <DominatorTreeWrapperPass>();
304
- AU.addRequiredTransitive <PostDominatorTreeWrapperPass>();
305
- AU.addRequiredTransitive <LoopInfoWrapperPass>();
306
- AU.setPreservesAll ();
307
- }
308
-
309
- bool LegacyDivergenceAnalysis::shouldUseGPUDivergenceAnalysis (
310
- const Function &F, const TargetTransformInfo &TTI) const {
302
+ bool LegacyDivergenceAnalysisImpl::shouldUseGPUDivergenceAnalysis (
303
+ const Function &F, const TargetTransformInfo &TTI, const LoopInfo &LI) {
311
304
if (!(UseGPUDA || TTI.useGPUDivergenceAnalysis ()))
312
305
return false ;
313
306
314
307
// GPUDivergenceAnalysis requires a reducible CFG.
315
- auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo ();
316
308
using RPOTraversal = ReversePostOrderTraversal<const Function *>;
317
309
RPOTraversal FuncRPOT (&F);
318
310
return !containsIrreducibleCFG<const BasicBlock *, const RPOTraversal,
319
311
const LoopInfo>(FuncRPOT, LI);
320
312
}
321
313
322
- bool LegacyDivergenceAnalysis::runOnFunction (Function &F) {
323
- auto *TTIWP = getAnalysisIfAvailable<TargetTransformInfoWrapperPass>();
324
- if (TTIWP == nullptr )
325
- return false ;
326
-
327
- TargetTransformInfo &TTI = TTIWP->getTTI (F);
328
- // Fast path: if the target does not have branch divergence, we do not mark
329
- // any branch as divergent.
330
- if (!TTI.hasBranchDivergence ())
331
- return false ;
332
-
333
- DivergentValues.clear ();
334
- DivergentUses.clear ();
335
- gpuDA = nullptr ;
336
-
337
- auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree ();
338
- auto &PDT = getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree ();
339
-
340
- if (shouldUseGPUDivergenceAnalysis (F, TTI)) {
314
+ void LegacyDivergenceAnalysisImpl::run (Function &F,
315
+ llvm::TargetTransformInfo &TTI,
316
+ llvm::DominatorTree &DT,
317
+ llvm::PostDominatorTree &PDT,
318
+ const llvm::LoopInfo &LI) {
319
+ if (shouldUseGPUDivergenceAnalysis (F, TTI, LI)) {
341
320
// run the new GPU divergence analysis
342
- auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo ();
343
321
gpuDA = std::make_unique<DivergenceInfo>(F, DT, PDT, LI, TTI,
344
322
/* KnownReducible = */ true );
345
323
@@ -349,29 +327,24 @@ bool LegacyDivergenceAnalysis::runOnFunction(Function &F) {
349
327
DP.populateWithSourcesOfDivergence ();
350
328
DP.propagate ();
351
329
}
352
-
353
- LLVM_DEBUG (dbgs () << " \n After divergence analysis on " << F.getName ()
354
- << " :\n " ;
355
- print (dbgs (), F.getParent ()));
356
-
357
- return false ;
358
330
}
359
331
360
- bool LegacyDivergenceAnalysis ::isDivergent (const Value *V) const {
332
+ bool LegacyDivergenceAnalysisImpl ::isDivergent (const Value *V) const {
361
333
if (gpuDA) {
362
334
return gpuDA->isDivergent (*V);
363
335
}
364
336
return DivergentValues.count (V);
365
337
}
366
338
367
- bool LegacyDivergenceAnalysis ::isDivergentUse (const Use *U) const {
339
+ bool LegacyDivergenceAnalysisImpl ::isDivergentUse (const Use *U) const {
368
340
if (gpuDA) {
369
341
return gpuDA->isDivergentUse (*U);
370
342
}
371
343
return DivergentValues.count (U->get ()) || DivergentUses.count (U);
372
344
}
373
345
374
- void LegacyDivergenceAnalysis::print (raw_ostream &OS, const Module *) const {
346
+ void LegacyDivergenceAnalysisImpl::print (raw_ostream &OS,
347
+ const Module *) const {
375
348
if ((!gpuDA || !gpuDA->hasDivergence ()) && DivergentValues.empty ())
376
349
return ;
377
350
@@ -407,3 +380,56 @@ void LegacyDivergenceAnalysis::print(raw_ostream &OS, const Module *) const {
407
380
}
408
381
OS << " \n " ;
409
382
}
383
+
384
+ void LegacyDivergenceAnalysis::getAnalysisUsage (AnalysisUsage &AU) const {
385
+ AU.addRequiredTransitive <DominatorTreeWrapperPass>();
386
+ AU.addRequiredTransitive <PostDominatorTreeWrapperPass>();
387
+ AU.addRequiredTransitive <LoopInfoWrapperPass>();
388
+ AU.setPreservesAll ();
389
+ }
390
+
391
+ bool LegacyDivergenceAnalysis::runOnFunction (Function &F) {
392
+ auto *TTIWP = getAnalysisIfAvailable<TargetTransformInfoWrapperPass>();
393
+ if (TTIWP == nullptr )
394
+ return false ;
395
+
396
+ TargetTransformInfo &TTI = TTIWP->getTTI (F);
397
+ // Fast path: if the target does not have branch divergence, we do not mark
398
+ // any branch as divergent.
399
+ if (!TTI.hasBranchDivergence ())
400
+ return false ;
401
+
402
+ DivergentValues.clear ();
403
+ DivergentUses.clear ();
404
+ gpuDA = nullptr ;
405
+
406
+ auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree ();
407
+ auto &PDT = getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree ();
408
+ auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo ();
409
+ LegacyDivergenceAnalysisImpl::run (F, TTI, DT, PDT, LI);
410
+ LLVM_DEBUG (dbgs () << " \n After divergence analysis on " << F.getName ()
411
+ << " :\n " ;
412
+ LegacyDivergenceAnalysisImpl::print (dbgs (), F.getParent ()));
413
+
414
+ return false ;
415
+ }
416
+
417
+ PreservedAnalyses
418
+ LegacyDivergenceAnalysisPass::run (Function &F, FunctionAnalysisManager &AM) {
419
+ auto &TTI = AM.getResult <TargetIRAnalysis>(F);
420
+ if (!TTI.hasBranchDivergence ())
421
+ return PreservedAnalyses::all ();
422
+
423
+ DivergentValues.clear ();
424
+ DivergentUses.clear ();
425
+ gpuDA = nullptr ;
426
+
427
+ auto &DT = AM.getResult <DominatorTreeAnalysis>(F);
428
+ auto &PDT = AM.getResult <PostDominatorTreeAnalysis>(F);
429
+ auto &LI = AM.getResult <LoopAnalysis>(F);
430
+ LegacyDivergenceAnalysisImpl::run (F, TTI, DT, PDT, LI);
431
+ LLVM_DEBUG (dbgs () << " \n After divergence analysis on " << F.getName ()
432
+ << " :\n " ;
433
+ LegacyDivergenceAnalysisImpl::print (dbgs (), F.getParent ()));
434
+ return PreservedAnalyses::all ();
435
+ }
0 commit comments