[llvm] c005518 - [LoopNest] Allow empty basic blocks without loops

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 5 08:11:36 PST 2021



> On Jan 5, 2021, at 15:10, Whitney Tsang via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> 
> Author: Whitney Tsang
> Date: 2021-01-05T15:09:38Z
> New Revision: c00551893674d6d61e9e5d68412e2b8621f617b8
> 
> URL: https://github.com/llvm/llvm-project/commit/c00551893674d6d61e9e5d68412e2b8621f617b8
> DIFF: https://github.com/llvm/llvm-project/commit/c00551893674d6d61e9e5d68412e2b8621f617b8.diff
> 
> LOG: [LoopNest] Allow empty basic blocks without loops
> 
> Allow loop nests with empty basic blocks without loops in different
> levels as perfect.
> 
> Reviewers: Meinersbur
> 
> Differential Revision: https://reviews.llvm.org/D93665
> 
> Added: 
> 
> 
> Modified: 
>    llvm/include/llvm/Analysis/LoopNestAnalysis.h
>    llvm/lib/Analysis/LoopNestAnalysis.cpp
>    llvm/test/Analysis/LoopNestAnalysis/perfectnest.ll
> 
> Removed: 
> 
> 
> 
> ################################################################################
> diff  --git a/llvm/include/llvm/Analysis/LoopNestAnalysis.h b/llvm/include/llvm/Analysis/LoopNestAnalysis.h
> index 4d77d735819f..f65ff493574c 100644
> --- a/llvm/include/llvm/Analysis/LoopNestAnalysis.h
> +++ b/llvm/include/llvm/Analysis/LoopNestAnalysis.h
> @@ -59,6 +59,12 @@ class LoopNest {
>   /// getMaxPerfectDepth(Loop_i) would return 2.
>   static unsigned getMaxPerfectDepth(const Loop &Root, ScalarEvolution &SE);
> 
> +  /// Recursivelly traverse all empty 'single successor' basic blocks of \p From
> +  /// (if there are any). Return the last basic block found or \p End if it was
> +  /// reached during the search.
> +  static const BasicBlock &skipEmptyBlockUntil(const BasicBlock *From,
> +                                               const BasicBlock *End);
> +
>   /// Return the outermost loop in the loop nest.
>   Loop &getOutermostLoop() const { return *Loops.front(); }
> 
> @@ -128,6 +134,12 @@ class LoopNest {
>                         [](const Loop *L) { return L->isLoopSimplifyForm(); });
>   }
> 
> +  /// Return true if all loops in the loop nest are in rotated form.
> +  bool areAllLoopsRotatedForm() const {
> +    return std::all_of(Loops.begin(), Loops.end(),
> +                       [](const Loop *L) { return L->isRotatedForm(); });
> +  }
> +

Can this just use the all_of version which takes an iterator range from STLExtras.h? (Same as the areAllLoopsSimpliftForm just above). 

Also, this seems to be missing an include for the definition of either std::all_of or STLExtras.h, which could cause issues for builds with C++ modules.


More information about the llvm-commits mailing list