[PATCH] D28452: [PM] Move the LoopPassManager to the transforms library.

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 9 13:35:21 PST 2017


Makes sense to me.

Chandler Carruth via Phabricator <reviews at reviews.llvm.org> writes:
> chandlerc created this revision.
> chandlerc added reviewers: mehdi_amini, mkuper, sanjoy, bogner, mzolotukhin.
> chandlerc added a subscriber: llvm-commits.
> Herald added subscribers: mgorny, mcrosier.
>
> While the loop PM uses an analysis to form the IR units, the current
> plan is to have the PM itself establish and enforce both loop simplified
> form and LCSSA. This would be a layering violation in the analysis
> library.
>
> Fundamentally, the idea behind the loop PM is to *transform* loops in
> addition to running passes over them, so it really seemed like the most
> natural place to sink this was into the transforms library.
>
>
> https://reviews.llvm.org/D28452
>
> Files:
>   include/llvm/Analysis/IVUsers.h
>   include/llvm/Analysis/LoopAccessAnalysis.h
>   include/llvm/Analysis/LoopPassManager.h
>   include/llvm/Passes/PassBuilder.h
>   include/llvm/Transforms/Scalar/IndVarSimplify.h
>   include/llvm/Transforms/Scalar/LICM.h
>   include/llvm/Transforms/Scalar/LoopDeletion.h
>   include/llvm/Transforms/Scalar/LoopIdiomRecognize.h
>   include/llvm/Transforms/Scalar/LoopInstSimplify.h
>   include/llvm/Transforms/Scalar/LoopPassManager.h
>   include/llvm/Transforms/Scalar/LoopRotation.h
>   include/llvm/Transforms/Scalar/LoopSimplifyCFG.h
>   include/llvm/Transforms/Scalar/LoopStrengthReduce.h
>   include/llvm/Transforms/Scalar/LoopUnrollPass.h
>   include/llvm/Transforms/Vectorize/LoopVectorize.h
>   lib/Analysis/CMakeLists.txt
>   lib/Analysis/IVUsers.cpp
>   lib/Analysis/LoopAccessAnalysis.cpp
>   lib/Analysis/LoopPass.cpp
>   lib/Analysis/LoopPassManager.cpp
>   lib/LTO/LTOBackend.cpp
>   lib/Passes/PassBuilder.cpp
>   lib/Transforms/Scalar/CMakeLists.txt
>   lib/Transforms/Scalar/IndVarSimplify.cpp
>   lib/Transforms/Scalar/LICM.cpp
>   lib/Transforms/Scalar/LoopDeletion.cpp
>   lib/Transforms/Scalar/LoopDistribute.cpp
>   lib/Transforms/Scalar/LoopIdiomRecognize.cpp
>   lib/Transforms/Scalar/LoopInstSimplify.cpp
>   lib/Transforms/Scalar/LoopPassManager.cpp
>   lib/Transforms/Scalar/LoopRotation.cpp
>   lib/Transforms/Scalar/LoopSimplifyCFG.cpp
>   lib/Transforms/Scalar/LoopSink.cpp
>   lib/Transforms/Scalar/LoopStrengthReduce.cpp
>   lib/Transforms/Scalar/LoopUnrollPass.cpp
>   tools/opt/NewPMDriver.cpp
>   unittests/Analysis/CMakeLists.txt
>   unittests/Analysis/LoopPassManagerTest.cpp
>   unittests/Transforms/CMakeLists.txt
>   unittests/Transforms/Scalar/CMakeLists.txt
>   unittests/Transforms/Scalar/LoopPassManagerTest.cpp
>
> Index: unittests/Transforms/Scalar/LoopPassManagerTest.cpp
> ===================================================================
> --- unittests/Transforms/Scalar/LoopPassManagerTest.cpp
> +++ unittests/Transforms/Scalar/LoopPassManagerTest.cpp
> @@ -7,9 +7,9 @@
>  //
>  //===----------------------------------------------------------------------===//
>  
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/AliasAnalysis.h"
>  #include "llvm/Analysis/AssumptionCache.h"
> -#include "llvm/Analysis/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/Analysis/TargetLibraryInfo.h"
>  #include "llvm/Analysis/TargetTransformInfo.h"
> Index: unittests/Transforms/Scalar/CMakeLists.txt
> ===================================================================
> --- /dev/null
> +++ unittests/Transforms/Scalar/CMakeLists.txt
> @@ -0,0 +1,12 @@
> +set(LLVM_LINK_COMPONENTS
> +  Analysis
> +  AsmParser
> +  Core
> +  Support
> +  ScalarOpts
> +  TransformUtils
> +  )
> +
> +add_llvm_unittest(ScalarTests
> +  LoopPassManagerTest.cpp
> +  )
> Index: unittests/Transforms/CMakeLists.txt
> ===================================================================
> --- unittests/Transforms/CMakeLists.txt
> +++ unittests/Transforms/CMakeLists.txt
> @@ -1,2 +1,3 @@
>  add_subdirectory(IPO)
> +add_subdirectory(Scalar)
>  add_subdirectory(Utils)
> Index: unittests/Analysis/CMakeLists.txt
> ===================================================================
> --- unittests/Analysis/CMakeLists.txt
> +++ unittests/Analysis/CMakeLists.txt
> @@ -13,7 +13,6 @@
>    CFGTest.cpp
>    CGSCCPassManagerTest.cpp
>    LazyCallGraphTest.cpp
> -  LoopPassManagerTest.cpp
>    MemoryBuiltinsTest.cpp
>    ScalarEvolutionTest.cpp
>    TBAATest.cpp
> Index: tools/opt/NewPMDriver.cpp
> ===================================================================
> --- tools/opt/NewPMDriver.cpp
> +++ tools/opt/NewPMDriver.cpp
> @@ -17,7 +17,7 @@
>  #include "llvm/ADT/StringRef.h"
>  #include "llvm/Analysis/AliasAnalysis.h"
>  #include "llvm/Analysis/CGSCCPassManager.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Bitcode/BitcodeWriterPass.h"
>  #include "llvm/IR/Dominators.h"
>  #include "llvm/IR/IRPrintingPasses.h"
> Index: lib/Transforms/Scalar/LoopUnrollPass.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopUnrollPass.cpp
> +++ lib/Transforms/Scalar/LoopUnrollPass.cpp
> @@ -19,7 +19,7 @@
>  #include "llvm/Analysis/GlobalsModRef.h"
>  #include "llvm/Analysis/InstructionSimplify.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/LoopUnrollAnalyzer.h"
>  #include "llvm/Analysis/OptimizationDiagnosticInfo.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
> Index: lib/Transforms/Scalar/LoopStrengthReduce.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopStrengthReduce.cpp
> +++ lib/Transforms/Scalar/LoopStrengthReduce.cpp
> @@ -68,7 +68,7 @@
>  #include "llvm/Analysis/IVUsers.h"
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/Analysis/ScalarEvolutionExpander.h"
>  #include "llvm/Analysis/ScalarEvolutionExpressions.h"
> Index: lib/Transforms/Scalar/LoopSink.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopSink.cpp
> +++ lib/Transforms/Scalar/LoopSink.cpp
> @@ -38,7 +38,7 @@
>  #include "llvm/Analysis/Loads.h"
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
>  #include "llvm/IR/Dominators.h"
> Index: lib/Transforms/Scalar/LoopSimplifyCFG.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopSimplifyCFG.cpp
> +++ lib/Transforms/Scalar/LoopSimplifyCFG.cpp
> @@ -24,7 +24,7 @@
>  #include "llvm/Analysis/GlobalsModRef.h"
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
>  #include "llvm/Analysis/TargetTransformInfo.h"
> Index: lib/Transforms/Scalar/LoopRotation.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopRotation.cpp
> +++ lib/Transforms/Scalar/LoopRotation.cpp
> @@ -20,7 +20,7 @@
>  #include "llvm/Analysis/InstructionSimplify.h"
>  #include "llvm/Analysis/GlobalsModRef.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
>  #include "llvm/Analysis/TargetTransformInfo.h"
> Index: lib/Transforms/Scalar/LoopPassManager.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopPassManager.cpp
> +++ lib/Transforms/Scalar/LoopPassManager.cpp
> @@ -7,7 +7,7 @@
>  //
>  //===----------------------------------------------------------------------===//
>  
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/BasicAliasAnalysis.h"
>  #include "llvm/Analysis/GlobalsModRef.h"
>  #include "llvm/Analysis/LoopInfo.h"
> Index: lib/Transforms/Scalar/LoopInstSimplify.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopInstSimplify.cpp
> +++ lib/Transforms/Scalar/LoopInstSimplify.cpp
> @@ -18,7 +18,7 @@
>  #include "llvm/Analysis/InstructionSimplify.h"
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/Analysis/TargetLibraryInfo.h"
>  #include "llvm/IR/DataLayout.h"
> Index: lib/Transforms/Scalar/LoopIdiomRecognize.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopIdiomRecognize.cpp
> +++ lib/Transforms/Scalar/LoopIdiomRecognize.cpp
> @@ -46,7 +46,7 @@
>  #include "llvm/Analysis/GlobalsModRef.h"
>  #include "llvm/Analysis/LoopAccessAnalysis.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
>  #include "llvm/Analysis/ScalarEvolutionExpander.h"
>  #include "llvm/Analysis/ScalarEvolutionExpressions.h"
> Index: lib/Transforms/Scalar/LoopDistribute.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopDistribute.cpp
> +++ lib/Transforms/Scalar/LoopDistribute.cpp
> @@ -31,7 +31,7 @@
>  #include "llvm/Analysis/GlobalsModRef.h"
>  #include "llvm/Analysis/LoopAccessAnalysis.h"
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/OptimizationDiagnosticInfo.h"
>  #include "llvm/IR/DiagnosticInfo.h"
>  #include "llvm/IR/Dominators.h"
> Index: lib/Transforms/Scalar/LoopDeletion.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopDeletion.cpp
> +++ lib/Transforms/Scalar/LoopDeletion.cpp
> @@ -19,7 +19,7 @@
>  #include "llvm/ADT/Statistic.h"
>  #include "llvm/Analysis/GlobalsModRef.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/Dominators.h"
>  #include "llvm/Transforms/Scalar.h"
>  #include "llvm/Transforms/Utils/LoopUtils.h"
> Index: lib/Transforms/Scalar/LICM.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LICM.cpp
> +++ lib/Transforms/Scalar/LICM.cpp
> @@ -41,7 +41,7 @@
>  #include "llvm/Analysis/Loads.h"
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/MemoryBuiltins.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
> Index: lib/Transforms/Scalar/IndVarSimplify.cpp
> ===================================================================
> --- lib/Transforms/Scalar/IndVarSimplify.cpp
> +++ lib/Transforms/Scalar/IndVarSimplify.cpp
> @@ -31,7 +31,7 @@
>  #include "llvm/Analysis/GlobalsModRef.h"
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolutionExpander.h"
>  #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
>  #include "llvm/Analysis/TargetLibraryInfo.h"
> Index: lib/Transforms/Scalar/CMakeLists.txt
> ===================================================================
> --- lib/Transforms/Scalar/CMakeLists.txt
> +++ lib/Transforms/Scalar/CMakeLists.txt
> @@ -26,6 +26,7 @@
>    LoopInstSimplify.cpp
>    LoopInterchange.cpp
>    LoopLoadElimination.cpp
> +  LoopPassManager.cpp
>    LoopRerollPass.cpp
>    LoopRotation.cpp
>    LoopSimplifyCFG.cpp
> Index: lib/Passes/PassBuilder.cpp
> ===================================================================
> --- lib/Passes/PassBuilder.cpp
> +++ lib/Passes/PassBuilder.cpp
> @@ -38,7 +38,6 @@
>  #include "llvm/Analysis/LazyValueInfo.h"
>  #include "llvm/Analysis/LoopAccessAnalysis.h"
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
>  #include "llvm/Analysis/MemoryDependenceAnalysis.h"
>  #include "llvm/Analysis/ModuleSummaryAnalysis.h"
>  #include "llvm/Analysis/OptimizationDiagnosticInfo.h"
> @@ -103,6 +102,7 @@
>  #include "llvm/Transforms/Scalar/LoopDistribute.h"
>  #include "llvm/Transforms/Scalar/LoopIdiomRecognize.h"
>  #include "llvm/Transforms/Scalar/LoopInstSimplify.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Transforms/Scalar/LoopRotation.h"
>  #include "llvm/Transforms/Scalar/LoopSimplifyCFG.h"
>  #include "llvm/Transforms/Scalar/LoopStrengthReduce.h"
> Index: lib/LTO/LTOBackend.cpp
> ===================================================================
> --- lib/LTO/LTOBackend.cpp
> +++ lib/LTO/LTOBackend.cpp
> @@ -17,7 +17,7 @@
>  #include "llvm/LTO/LTOBackend.h"
>  #include "llvm/Analysis/AliasAnalysis.h"
>  #include "llvm/Analysis/CGSCCPassManager.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/TargetLibraryInfo.h"
>  #include "llvm/Analysis/TargetTransformInfo.h"
>  #include "llvm/Bitcode/BitcodeReader.h"
> Index: lib/Analysis/LoopPass.cpp
> ===================================================================
> --- lib/Analysis/LoopPass.cpp
> +++ lib/Analysis/LoopPass.cpp
> @@ -14,7 +14,7 @@
>  //===----------------------------------------------------------------------===//
>  
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/Dominators.h"
>  #include "llvm/IR/IRPrintingPasses.h"
>  #include "llvm/IR/LLVMContext.h"
> Index: lib/Analysis/LoopAccessAnalysis.cpp
> ===================================================================
> --- lib/Analysis/LoopAccessAnalysis.cpp
> +++ lib/Analysis/LoopAccessAnalysis.cpp
> @@ -27,7 +27,7 @@
>  #include "llvm/Analysis/AliasSetTracker.h"
>  #include "llvm/Analysis/LoopAccessAnalysis.h"
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/MemoryLocation.h"
>  #include "llvm/Analysis/OptimizationDiagnosticInfo.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
> Index: lib/Analysis/IVUsers.cpp
> ===================================================================
> --- lib/Analysis/IVUsers.cpp
> +++ lib/Analysis/IVUsers.cpp
> @@ -17,7 +17,7 @@
>  #include "llvm/Analysis/AssumptionCache.h"
>  #include "llvm/Analysis/CodeMetrics.h"
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolutionExpressions.h"
>  #include "llvm/Analysis/ValueTracking.h"
>  #include "llvm/IR/Constants.h"
> Index: lib/Analysis/CMakeLists.txt
> ===================================================================
> --- lib/Analysis/CMakeLists.txt
> +++ lib/Analysis/CMakeLists.txt
> @@ -47,7 +47,6 @@
>    LoopUnrollAnalyzer.cpp
>    LoopInfo.cpp
>    LoopPass.cpp
> -  LoopPassManager.cpp
>    MemDepPrinter.cpp
>    MemDerefPrinter.cpp
>    MemoryBuiltins.cpp
> Index: include/llvm/Transforms/Vectorize/LoopVectorize.h
> ===================================================================
> --- include/llvm/Transforms/Vectorize/LoopVectorize.h
> +++ include/llvm/Transforms/Vectorize/LoopVectorize.h
> @@ -57,7 +57,7 @@
>  #include "llvm/Analysis/DemandedBits.h"
>  #include "llvm/Analysis/LoopAccessAnalysis.h"
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/OptimizationDiagnosticInfo.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/Analysis/TargetTransformInfo.h"
> Index: include/llvm/Transforms/Scalar/LoopUnrollPass.h
> ===================================================================
> --- include/llvm/Transforms/Scalar/LoopUnrollPass.h
> +++ include/llvm/Transforms/Scalar/LoopUnrollPass.h
> @@ -11,7 +11,7 @@
>  #define LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
>  
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/PassManager.h"
>  
>  namespace llvm {
> Index: include/llvm/Transforms/Scalar/LoopStrengthReduce.h
> ===================================================================
> --- include/llvm/Transforms/Scalar/LoopStrengthReduce.h
> +++ include/llvm/Transforms/Scalar/LoopStrengthReduce.h
> @@ -23,7 +23,7 @@
>  #define LLVM_TRANSFORMS_SCALAR_LOOPSTRENGTHREDUCE_H
>  
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/PassManager.h"
>  
>  namespace llvm {
> Index: include/llvm/Transforms/Scalar/LoopSimplifyCFG.h
> ===================================================================
> --- include/llvm/Transforms/Scalar/LoopSimplifyCFG.h
> +++ include/llvm/Transforms/Scalar/LoopSimplifyCFG.h
> @@ -18,7 +18,7 @@
>  #define LLVM_TRANSFORMS_SCALAR_LOOPSIMPLIFYCFG_H
>  
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/PassManager.h"
>  
>  namespace llvm {
> Index: include/llvm/Transforms/Scalar/LoopRotation.h
> ===================================================================
> --- include/llvm/Transforms/Scalar/LoopRotation.h
> +++ include/llvm/Transforms/Scalar/LoopRotation.h
> @@ -15,7 +15,7 @@
>  #define LLVM_TRANSFORMS_SCALAR_LOOPROTATION_H
>  
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/PassManager.h"
>  
>  namespace llvm {
> Index: include/llvm/Analysis/LoopPassManager.h
> ===================================================================
> --- /dev/null
> +++ include/llvm/Analysis/LoopPassManager.h
> @@ -1,472 +0,0 @@
> -//===- LoopPassManager.h - Loop pass management -----------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -/// \file
> -///
> -/// This header provides classes for managing a pipeline of passes over loops
> -/// in LLVM IR.
> -///
> -/// The primary loop pass pipeline is managed in a very particular way to
> -/// provide a set of core guarantees:
> -/// 1) Loops are, where possible, in simplified form.
> -/// 2) Loops are *always* in LCSSA form.
> -/// 3) A collection of Loop-specific analysis results are available:
> -///    - LoopInfo
> -///    - DominatorTree
> -///    - ScalarEvolution
> -///    - AAManager
> -/// 4) All loop passes preserve #1 (where possible), #2, and #3.
> -/// 5) Loop passes run over each loop in the loop nest from the innermost to
> -///    the outermost. Specifically, all inner loops are processed before
> -///    passes run over outer loops. When running the pipeline across an inner
> -///    loop creates new inner loops, those are added and processed in this
> -///    order as well.
> -///
> -/// This process is designed to facilitate transformations which simplify,
> -/// reduce, and remove loops. For passes which are more oriented towards
> -/// optimizing loops, especially optimizing loop *nests* instead of single
> -/// loops in isolation, this framework is less interesting.
> -///
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef LLVM_ANALYSIS_LOOPPASSMANAGER_H
> -#define LLVM_ANALYSIS_LOOPPASSMANAGER_H
> -
> -#include "llvm/ADT/PostOrderIterator.h"
> -#include "llvm/ADT/PriorityWorklist.h"
> -#include "llvm/ADT/STLExtras.h"
> -#include "llvm/Analysis/AliasAnalysis.h"
> -#include "llvm/Analysis/BasicAliasAnalysis.h"
> -#include "llvm/Analysis/GlobalsModRef.h"
> -#include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/ScalarEvolution.h"
> -#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
> -#include "llvm/Analysis/TargetLibraryInfo.h"
> -#include "llvm/Analysis/TargetTransformInfo.h"
> -#include "llvm/IR/Dominators.h"
> -#include "llvm/IR/PassManager.h"
> -
> -namespace llvm {
> -
> -// Forward declarations of a update tracking and analysis result tracking
> -// structures used in the API of loop passes that work within this
> -// infrastructure.
> -class LPMUpdateResult;
> -struct LPMAnalysisResults;
> -
> -/// Extern template declaration for the analysis set for this IR unit.
> -extern template class AllAnalysesOn<Loop>;
> -
> -extern template class AnalysisManager<Loop, LPMAnalysisResults &>;
> -/// \brief The loop analysis manager.
> -///
> -/// See the documentation for the AnalysisManager template for detail
> -/// documentation. This typedef serves as a convenient way to refer to this
> -/// construct in the adaptors and proxies used to integrate this into the larger
> -/// pass manager infrastructure.
> -typedef AnalysisManager<Loop, LPMAnalysisResults &> LoopAnalysisManager;
> -
> -// Explicit specialization and instantiation declarations for the pass manager.
> -// See the comments on the definition of the specialization for details on how
> -// it differs from the primary template.
> -template <>
> -PreservedAnalyses
> -PassManager<Loop, LoopAnalysisManager, LPMAnalysisResults &,
> -            LPMUpdateResult &>::run(Loop &InitialL, LoopAnalysisManager &AM,
> -                                    LPMAnalysisResults &AnalysisResults,
> -                                    LPMUpdateResult &UR);
> -extern template class PassManager<Loop, LoopAnalysisManager,
> -                                  LPMAnalysisResults &, LPMUpdateResult &>;
> -
> -/// \brief The Loop pass manager.
> -///
> -/// See the documentation for the PassManager template for details. It runs
> -/// a sequence of Loop passes over each Loop that the manager is run over. This
> -/// typedef serves as a convenient way to refer to this construct.
> -typedef PassManager<Loop, LoopAnalysisManager, LPMAnalysisResults &,
> -                    LPMUpdateResult &>
> -    LoopPassManager;
> -
> -/// A partial specialization of the require analysis template pass to correctly
> -/// forward the necessary extra parameters from a transformation's run method
> -/// to the AnalysisManager's getResult.
> -template <typename AnalysisT>
> -struct RequireAnalysisPass<AnalysisT, Loop, LoopAnalysisManager,
> -                           LPMAnalysisResults &, LPMUpdateResult &>
> -    : PassInfoMixin<
> -          RequireAnalysisPass<AnalysisT, Loop, LoopAnalysisManager,
> -                              LPMAnalysisResults &, LPMUpdateResult &>> {
> -  PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,
> -                        LPMAnalysisResults &AR, LPMUpdateResult &) {
> -    (void)AM.template getResult<AnalysisT>(L, AR);
> -    return PreservedAnalyses::all();
> -  }
> -};
> -
> -/// An alias template to easily name a require analysis loop pass.
> -template <typename AnalysisT>
> -using RequireAnalysisLoopPass =
> -    RequireAnalysisPass<AnalysisT, Loop, LoopAnalysisManager,
> -                        LPMAnalysisResults &, LPMUpdateResult &>;
> -
> -/// A proxy from a \c LoopAnalysisManager to a \c Function.
> -typedef InnerAnalysisManagerProxy<LoopAnalysisManager, Function>
> -    LoopAnalysisManagerFunctionProxy;
> -
> -/// A specialized result for the \c LoopAnalysisManagerFunctionProxy which
> -/// retains a \c LoopInfo reference.
> -///
> -/// This allows it to collect loop objects for which analysis results may be
> -/// cached in the \c LoopAnalysisManager.
> -template <> class LoopAnalysisManagerFunctionProxy::Result {
> -public:
> -  explicit Result(LoopAnalysisManager &InnerAM, LoopInfo &LI)
> -      : InnerAM(&InnerAM), LI(&LI) {}
> -  Result(Result &&Arg) : InnerAM(std::move(Arg.InnerAM)), LI(Arg.LI) {
> -    // We have to null out the analysis manager in the moved-from state
> -    // because we are taking ownership of the responsibilty to clear the
> -    // analysis state.
> -    Arg.InnerAM = nullptr;
> -  }
> -  Result &operator=(Result &&RHS) {
> -    InnerAM = RHS.InnerAM;
> -    LI = RHS.LI;
> -    // We have to null out the analysis manager in the moved-from state
> -    // because we are taking ownership of the responsibilty to clear the
> -    // analysis state.
> -    RHS.InnerAM = nullptr;
> -    return *this;
> -  }
> -  ~Result() {
> -    // InnerAM is cleared in a moved from state where there is nothing to do.
> -    if (!InnerAM)
> -      return;
> -
> -    // Clear out the analysis manager if we're being destroyed -- it means we
> -    // didn't even see an invalidate call when we got invalidated.
> -    InnerAM->clear();
> -  }
> -
> -  /// Accessor for the analysis manager.
> -  LoopAnalysisManager &getManager() { return *InnerAM; }
> -
> -  /// Handler for invalidation of the proxy for a particular function.
> -  ///
> -  /// If the proxy, \c LoopInfo, and associated analyses are preserved, this
> -  /// will merely forward the invalidation event to any cached loop analysis
> -  /// results for loops within this function.
> -  ///
> -  /// If the necessary loop infrastructure is not preserved, this will forcibly
> -  /// clear all of the cached analysis results that are keyed on the \c
> -  /// LoopInfo for this function.
> -  bool invalidate(Function &F, const PreservedAnalyses &PA,
> -                  FunctionAnalysisManager::Invalidator &Inv);
> -
> -private:
> -  LoopAnalysisManager *InnerAM;
> -  LoopInfo *LI;
> -};
> -
> -/// Provide a specialized run method for the \c LoopAnalysisManagerFunctionProxy
> -/// so it can pass the \c LoopInfo to the result.
> -template <>
> -LoopAnalysisManagerFunctionProxy::Result
> -LoopAnalysisManagerFunctionProxy::run(Function &F, FunctionAnalysisManager &AM);
> -
> -// Ensure the \c LoopAnalysisManagerFunctionProxy is provided as an extern
> -// template.
> -extern template class InnerAnalysisManagerProxy<LoopAnalysisManager, Function>;
> -
> -extern template class OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop,
> -                                                LPMAnalysisResults &>;
> -/// A proxy from a \c FunctionAnalysisManager to a \c Loop.
> -typedef OuterAnalysisManagerProxy<FunctionAnalysisManager, Loop,
> -                                  LPMAnalysisResults &>
> -    FunctionAnalysisManagerLoopProxy;
> -
> -/// Returns the minimum set of Analyses that all loop passes must preserve.
> -PreservedAnalyses getLoopPassPreservedAnalyses();
> -
> -namespace internal {
> -/// Helper to implement appending of loops onto a worklist.
> -///
> -/// We want to process loops in postorder, but the worklist is a LIFO data
> -/// structure, so we append to it in *reverse* postorder.
> -///
> -/// For trees, a preorder traversal is a viable reverse postorder, so we
> -/// actually append using a preorder walk algorithm.
> -template <typename RangeT>
> -inline void appendLoopsToWorklist(RangeT &&Loops,
> -                                  SmallPriorityWorklist<Loop *, 4> &Worklist) {
> -  // We use an internal worklist to build up the preorder traversal without
> -  // recursion.
> -  SmallVector<Loop *, 4> PreOrderLoops, PreOrderWorklist;
> -
> -  // We walk the initial sequence of loops in reverse because we generally want
> -  // to visit defs before uses and the worklist is LIFO.
> -  for (Loop *RootL : reverse(Loops)) {
> -    assert(PreOrderLoops.empty() && "Must start with an empty preorder walk.");
> -    assert(PreOrderWorklist.empty() &&
> -           "Must start with an empty preorder walk worklist.");
> -    PreOrderWorklist.push_back(RootL);
> -    do {
> -      Loop *L = PreOrderWorklist.pop_back_val();
> -      PreOrderWorklist.append(L->begin(), L->end());
> -      PreOrderLoops.push_back(L);
> -    } while (!PreOrderWorklist.empty());
> -
> -    Worklist.insert(std::move(PreOrderLoops));
> -    PreOrderLoops.clear();
> -  }
> -}
> -}
> -
> -/// The adaptor from a function pass to a loop pass directly computes a set of
> -/// analyses that are especially useful to loop passes and makes them available
> -/// in the API. Loop passes are also expected to update all of these so that
> -/// they remain correct across the entire loop pipeline.
> -struct LPMAnalysisResults {
> -  AAResults &AA;
> -  AssumptionCache &AC;
> -  DominatorTree &DT;
> -  LoopInfo &LI;
> -  ScalarEvolution &SE;
> -  TargetLibraryInfo &TLI;
> -  TargetTransformInfo &TTI;
> -};
> -
> -template <typename LoopPassT> class FunctionToLoopPassAdaptor;
> -
> -/// This class provides an interface for updating the loop pass manager based
> -/// on mutations to the loop nest.
> -///
> -/// A reference to an instance of this class is passed as an argument to each
> -/// Loop pass, and Loop passes should use it to update LPM infrastructure if
> -/// they modify the loop nest structure.
> -class LPMUpdateResult {
> -public:
> -  /// This can be queried by loop passes which run other loop passes (like pass
> -  /// managers) to know whether the loop needs to be skipped due to updates to
> -  /// the loop nest.
> -  ///
> -  /// If this returns true, the loop object may have been deleted, so passes
> -  /// should take care not to touch the object.
> -  bool skipCurrentLoop() const { return SkipCurrentLoop; }
> -
> -  /// Loop passes should use this method to indicate they have deleted a loop
> -  /// from the nest.
> -  ///
> -  /// Note that this loop must either be the current loop or a subloop of the
> -  /// current loop. This routine must be called prior to removing the loop from
> -  /// the loop nest.
> -  ///
> -  /// If this is called for the current loop, in addition to clearing any
> -  /// state, this routine will mark that the current loop should be skipped by
> -  /// the rest of the pass management infrastructure.
> -  void markLoopAsDeleted(Loop &L) {
> -    LAM.clear(L);
> -    assert(CurrentL->contains(&L) && "Cannot delete a loop outside of the "
> -                                     "subloop tree currently being processed.");
> -    if (&L == CurrentL)
> -      SkipCurrentLoop = true;
> -  }
> -
> -  /// Loop passes should use this method to indicate they have added new child
> -  /// loops of the current loop.
> -  ///
> -  /// \p NewChildLoops must contain only the immediate children. Any nested
> -  /// loops within them will be visited in postorder as usual for the loop pass
> -  /// manager.
> -  void addChildLoops(ArrayRef<Loop *> NewChildLoops) {
> -    // Insert ourselves back into the worklist first, as this loop should be
> -    // revisited after all the children have been processed.
> -    Worklist.insert(CurrentL);
> -
> -#ifndef NDEBUG
> -    for (Loop *NewL : NewChildLoops)
> -      assert(NewL->getParentLoop() == CurrentL && "All of the new loops must "
> -                                                  "be immediate children of "
> -                                                  "the current loop!");
> -#endif
> -
> -    internal::appendLoopsToWorklist(NewChildLoops, Worklist);
> -
> -    // Also skip further processing of the current loop--it will be revisited
> -    // after all of its newly added children are accounted for.
> -    SkipCurrentLoop = true;
> -  }
> -
> -  /// Loop passes should use this method to indicate they have added new
> -  /// sibling loops to the current loop.
> -  ///
> -  /// \p NewSibLoops must only contain the immediate sibling loops. Any nested
> -  /// loops within them will be visited in postorder as usual for the loop pass
> -  /// manager.
> -  void addSiblingLoops(ArrayRef<Loop *> NewSibLoops) {
> -#ifndef NDEBUG
> -    for (Loop *NewL : NewSibLoops)
> -      assert(NewL->getParentLoop() == ParentL &&
> -             "All of the new loops must be siblings of the current loop!");
> -#endif
> -
> -    internal::appendLoopsToWorklist(NewSibLoops, Worklist);
> -
> -    // No need to skip the current loop or revisit it, as sibling loops
> -    // shouldn't impact anything.
> -  }
> -
> -private:
> -  template <typename LoopPassT> friend class llvm::FunctionToLoopPassAdaptor;
> -
> -  /// The \c FunctionToLoopPassAdaptor's worklist of loops to process.
> -  SmallPriorityWorklist<Loop *, 4> &Worklist;
> -
> -  /// The analysis manager for use in the current loop nest.
> -  LoopAnalysisManager &LAM;
> -
> -  Loop *CurrentL;
> -  bool SkipCurrentLoop;
> -
> -#ifndef NDEBUG
> -  // In debug builds we also track the parent loop to implement asserts even in
> -  // the face of loop deletion.
> -  Loop *ParentL;
> -#endif
> -
> -  LPMUpdateResult(SmallPriorityWorklist<Loop *, 4> &Worklist,
> -                  LoopAnalysisManager &LAM)
> -      : Worklist(Worklist), LAM(LAM) {}
> -};
> -
> -/// \brief Adaptor that maps from a function to its loops.
> -///
> -/// Designed to allow composition of a LoopPass(Manager) and a
> -/// FunctionPassManager. Note that if this pass is constructed with a \c
> -/// FunctionAnalysisManager it will run the \c LoopAnalysisManagerFunctionProxy
> -/// analysis prior to running the loop passes over the function to enable a \c
> -/// LoopAnalysisManager to be used within this run safely.
> -template <typename LoopPassT>
> -class FunctionToLoopPassAdaptor
> -    : public PassInfoMixin<FunctionToLoopPassAdaptor<LoopPassT>> {
> -public:
> -  explicit FunctionToLoopPassAdaptor(LoopPassT Pass)
> -      : Pass(std::move(Pass)) {}
> -
> -  /// \brief Runs the loop passes across every loop in the function.
> -  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) {
> -    // Setup the loop analysis manager from its proxy.
> -    LoopAnalysisManager &LAM =
> -        AM.getResult<LoopAnalysisManagerFunctionProxy>(F).getManager();
> -    // Get the loop structure for this function
> -    LoopInfo &LI = AM.getResult<LoopAnalysis>(F);
> -
> -    // If there are no loops, there is nothing to do here.
> -    if (LI.empty())
> -      return PreservedAnalyses::all();
> -
> -    // Get the analysis results needed by loop passes.
> -    LPMAnalysisResults LAR = {AM.getResult<AAManager>(F),
> -                              AM.getResult<AssumptionAnalysis>(F),
> -                              AM.getResult<DominatorTreeAnalysis>(F),
> -                              AM.getResult<LoopAnalysis>(F),
> -                              AM.getResult<ScalarEvolutionAnalysis>(F),
> -                              AM.getResult<TargetLibraryAnalysis>(F),
> -                              AM.getResult<TargetIRAnalysis>(F)};
> -
> -    PreservedAnalyses PA = PreservedAnalyses::all();
> -
> -    // A postorder worklist of loops to process.
> -    SmallPriorityWorklist<Loop *, 4> Worklist;
> -
> -    // Register the worklist and loop analysis manager so that loop passes can
> -    // update them when they mutate the loop nest structure.
> -    LPMUpdateResult UR(Worklist, LAM);
> -
> -    // Add the loop nests in the reverse order of LoopInfo. For some reason,
> -    // they are stored in RPO w.r.t. the control flow graph in LoopInfo. For
> -    // the purpose of unrolling, loop deletion, and LICM, we largely want to
> -    // work forward across the CFG so that we visit defs before uses and can
> -    // propagate simplifications from one loop nest into the next.
> -    // FIXME: Consider changing the order in LoopInfo.
> -    internal::appendLoopsToWorklist(reverse(LI), Worklist);
> -
> -    do {
> -      Loop *L = Worklist.pop_back_val();
> -
> -      // Reset the update structure for this loop.
> -      UR.CurrentL = L;
> -      UR.SkipCurrentLoop = false;
> -#ifndef NDEBUG
> -      UR.ParentL = L->getParentLoop();
> -#endif
> -
> -      PreservedAnalyses PassPA = Pass.run(*L, LAM, LAR, UR);
> -      // FIXME: We should verify the set of analyses relevant to Loop passes
> -      // are preserved.
> -
> -      // If the loop hasn't been deleted, we need to handle invalidation here.
> -      if (!UR.skipCurrentLoop())
> -        // We know that the loop pass couldn't have invalidated any other
> -        // loop's analyses (that's the contract of a loop pass), so directly
> -        // handle the loop analysis manager's invalidation here.
> -        LAM.invalidate(*L, PassPA);
> -
> -      // Then intersect the preserved set so that invalidation of module
> -      // analyses will eventually occur when the module pass completes.
> -      PA.intersect(std::move(PassPA));
> -    } while (!Worklist.empty());
> -
> -    // By definition we preserve the proxy. We also preserve all analyses on
> -    // Loops. This precludes *any* invalidation of loop analyses by the proxy,
> -    // but that's OK because we've taken care to invalidate analyses in the
> -    // loop analysis manager incrementally above.
> -    PA.preserveSet<AllAnalysesOn<Loop>>();
> -    PA.preserve<LoopAnalysisManagerFunctionProxy>();
> -    // We also preserve the set of analyses queried up-front and preserved
> -    // throughout the run. This avoids each individual loop pass having to mark
> -    // this.
> -    PA.preserve<AssumptionAnalysis>();
> -    PA.preserve<DominatorTreeAnalysis>();
> -    PA.preserve<LoopAnalysis>();
> -    PA.preserve<ScalarEvolutionAnalysis>();
> -    // FIXME: What we really want to do here is preserve an AA category, but
> -    // that concept doesn't exist yet.
> -    PA.preserve<AAManager>();
> -    PA.preserve<BasicAA>();
> -    PA.preserve<GlobalsAA>();
> -    PA.preserve<SCEVAA>();
> -    return PA;
> -  }
> -
> -private:
> -  LoopPassT Pass;
> -};
> -
> -/// \brief A function to deduce a loop pass type and wrap it in the templated
> -/// adaptor.
> -template <typename LoopPassT>
> -FunctionToLoopPassAdaptor<LoopPassT>
> -createFunctionToLoopPassAdaptor(LoopPassT Pass) {
> -  return FunctionToLoopPassAdaptor<LoopPassT>(std::move(Pass));
> -}
> -
> -/// \brief Pass for printing a loop's contents as textual IR.
> -class PrintLoopPass : public PassInfoMixin<PrintLoopPass> {
> -  raw_ostream &OS;
> -  std::string Banner;
> -
> -public:
> -  PrintLoopPass();
> -  PrintLoopPass(raw_ostream &OS, const std::string &Banner = "");
> -
> -  PreservedAnalyses run(Loop &L, LoopAnalysisManager &, LPMAnalysisResults &,
> -                        LPMUpdateResult &);
> -};
> -}
> -
> -#endif // LLVM_ANALYSIS_LOOPPASSMANAGER_H
> Index: include/llvm/Transforms/Scalar/LoopInstSimplify.h
> ===================================================================
> --- include/llvm/Transforms/Scalar/LoopInstSimplify.h
> +++ include/llvm/Transforms/Scalar/LoopInstSimplify.h
> @@ -15,7 +15,7 @@
>  #define LLVM_TRANSFORMS_SCALAR_LOOPINSTSIMPLIFY_H
>  
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/PassManager.h"
>  
>  namespace llvm {
> Index: include/llvm/Transforms/Scalar/LoopIdiomRecognize.h
> ===================================================================
> --- include/llvm/Transforms/Scalar/LoopIdiomRecognize.h
> +++ include/llvm/Transforms/Scalar/LoopIdiomRecognize.h
> @@ -17,7 +17,7 @@
>  #define LLVM_TRANSFORMS_SCALAR_LOOPIDIOMRECOGNIZE_H
>  
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/PassManager.h"
>  
>  namespace llvm {
> Index: include/llvm/Transforms/Scalar/LoopDeletion.h
> ===================================================================
> --- include/llvm/Transforms/Scalar/LoopDeletion.h
> +++ include/llvm/Transforms/Scalar/LoopDeletion.h
> @@ -15,7 +15,7 @@
>  #define LLVM_TRANSFORMS_SCALAR_LOOPDELETION_H
>  
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolution.h"
>  #include "llvm/IR/PassManager.h"
>  
> Index: include/llvm/Transforms/Scalar/LICM.h
> ===================================================================
> --- include/llvm/Transforms/Scalar/LICM.h
> +++ include/llvm/Transforms/Scalar/LICM.h
> @@ -34,7 +34,7 @@
>  #define LLVM_TRANSFORMS_SCALAR_LICM_H
>  
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/PassManager.h"
>  
>  namespace llvm {
> Index: include/llvm/Transforms/Scalar/IndVarSimplify.h
> ===================================================================
> --- include/llvm/Transforms/Scalar/IndVarSimplify.h
> +++ include/llvm/Transforms/Scalar/IndVarSimplify.h
> @@ -16,7 +16,7 @@
>  #define LLVM_TRANSFORMS_SCALAR_INDVARSIMPLIFY_H
>  
>  #include "llvm/Analysis/LoopInfo.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/PassManager.h"
>  
>  namespace llvm {
> Index: include/llvm/Passes/PassBuilder.h
> ===================================================================
> --- include/llvm/Passes/PassBuilder.h
> +++ include/llvm/Passes/PassBuilder.h
> @@ -18,7 +18,7 @@
>  
>  #include "llvm/ADT/Optional.h"
>  #include "llvm/Analysis/CGSCCPassManager.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/IR/PassManager.h"
>  #include <vector>
>  
> Index: include/llvm/Analysis/LoopAccessAnalysis.h
> ===================================================================
> --- include/llvm/Analysis/LoopAccessAnalysis.h
> +++ include/llvm/Analysis/LoopAccessAnalysis.h
> @@ -20,7 +20,7 @@
>  #include "llvm/ADT/SetVector.h"
>  #include "llvm/Analysis/AliasAnalysis.h"
>  #include "llvm/Analysis/AliasSetTracker.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolutionExpressions.h"
>  #include "llvm/IR/DiagnosticInfo.h"
>  #include "llvm/IR/ValueHandle.h"
> Index: include/llvm/Analysis/IVUsers.h
> ===================================================================
> --- include/llvm/Analysis/IVUsers.h
> +++ include/llvm/Analysis/IVUsers.h
> @@ -16,7 +16,7 @@
>  #define LLVM_ANALYSIS_IVUSERS_H
>  
>  #include "llvm/Analysis/LoopPass.h"
> -#include "llvm/Analysis/LoopPassManager.h"
> +#include "llvm/Transforms/Scalar/LoopPassManager.h"
>  #include "llvm/Analysis/ScalarEvolutionNormalization.h"
>  #include "llvm/IR/ValueHandle.h"
>  


More information about the llvm-commits mailing list