Adding dependency on MemoryDependenceAnalysis pass to LICM causes opt to get stuck in addPass

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Adding dependency on MemoryDependenceAnalysis pass to LICM causes opt to get stuck in addPass

David Gardner-8
I'm attempting to add some support for hoisting/sinking of memory-using
intrinsics in loops, and so I want to use MemoryDependenceAnalysis in
LICM, but when I modify getAnalysisUsge to include this :

    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
      AU.setPreservesCFG();
      AU.addRequired<DominatorTree>();
      AU.addRequired<LoopInfo>();
      AU.addRequiredID(LoopSimplifyID);
      AU.addRequired<MemoryDependenceAnalysis>();  // <--- added
      AU.addRequired<AliasAnalysis>();
      AU.addPreserved<AliasAnalysis>();
      AU.addPreserved("scalar-evolution");
      AU.addPreservedID(LoopSimplifyID);
      AU.addRequired<TargetLibraryInfo>();
    }

..add to the initialize pass list:

char LICM::ID = 0;
INITIALIZE_PASS_BEGIN(LICM, "licm", "Loop Invariant Code Motion", false, false)
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis) // <--- added
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
INITIALIZE_PASS_END(LICM, "licm", "Loop Invariant Code Motion", false, false)


..rebuild and then run:

  gdb --args ~/tmp/checkouts/llvm-build/Debug+Asserts/bin/opt -p -debug -debug-pass=Arguments -basicaa -licm -o /dev/null test.bc


Then I can see that opt is getting stuck in lib/VMCore/PassManager.cpp
on the loop at line 672, and just goes round this for as long as I've
left it for (several minutes) :

      // Check other pass managers
      for (SmallVectorImpl<PMDataManager *>::iterator
           I = IndirectPassManagers.begin(),
           E = IndirectPassManagers.end(); I != E; ++I)
        if (Pass *P = (*I)->findAnalysisPass(AID, false))
          return P;



This old post on the list :
http://old.nabble.com/Array-Dependence-Analysis-td16073995.html says
that "Loop passes can use function passes, but not visaversa."
so as far as I can tell this should be OK.

Am I doing something wrong? (perhaps ordering of the addRequired
calls or the initialization macros?)
Is there something else I need to add to allow the memdep pass to be
required by LICM, or is this a bug?



  Many thanks,

    Dave

_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

signature.asc (853 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Adding dependency on MemoryDependenceAnalysis pass to LICM causes opt to get stuck in addPass

Devang Patel

On Dec 14, 2011, at 7:09 AM, David Gardner wrote:

> I'm attempting to add some support for hoisting/sinking of memory-using
> intrinsics in loops, and so I want to use MemoryDependenceAnalysis in
> LICM, but when I modify getAnalysisUsge to include this :
>
>    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
>      AU.setPreservesCFG();
>      AU.addRequired<DominatorTree>();
>      AU.addRequired<LoopInfo>();
>      AU.addRequiredID(LoopSimplifyID);
>      AU.addRequired<MemoryDependenceAnalysis>();  // <--- added
>      AU.addRequired<AliasAnalysis>();
>      AU.addPreserved<AliasAnalysis>();
>      AU.addPreserved("scalar-evolution");
>      AU.addPreservedID(LoopSimplifyID);
>      AU.addRequired<TargetLibraryInfo>();
>    }
>
> ..add to the initialize pass list:
>
> char LICM::ID = 0;
> INITIALIZE_PASS_BEGIN(LICM, "licm", "Loop Invariant Code Motion", false, false)
> INITIALIZE_PASS_DEPENDENCY(DominatorTree)
> INITIALIZE_PASS_DEPENDENCY(LoopInfo)
> INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
> INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
> INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis) // <--- added
> INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
> INITIALIZE_PASS_END(LICM, "licm", "Loop Invariant Code Motion", false, false)
>
>
> ..rebuild and then run:
>
>  gdb --args ~/tmp/checkouts/llvm-build/Debug+Asserts/bin/opt -p -debug -debug-pass=Arguments -basicaa -licm -o /dev/null test.bc
>
>
> Then I can see that opt is getting stuck in lib/VMCore/PassManager.cpp
> on the loop at line 672, and just goes round this for as long as I've
> left it for (several minutes) :
>
>      // Check other pass managers
>      for (SmallVectorImpl<PMDataManager *>::iterator
>           I = IndirectPassManagers.begin(),
>           E = IndirectPassManagers.end(); I != E; ++I)
>        if (Pass *P = (*I)->findAnalysisPass(AID, false))
>          return P;
>

Do you see a repeated pattern of pass sequence the pass manager is trying to handle ? P->getPassName() is handy.
-
Devang

> This old post on the list :
> http://old.nabble.com/Array-Dependence-Analysis-td16073995.html says
> that "Loop passes can use function passes, but not visaversa."
> so as far as I can tell this should be OK.
>
> Am I doing something wrong? (perhaps ordering of the addRequired
> calls or the initialization macros?)
> Is there something else I need to add to allow the memdep pass to be
> required by LICM, or is this a bug?
>
>
>
>  Many thanks,
>
>    Dave
> _______________________________________________
> LLVM Developers mailing list
> [hidden email]         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Reply | Threaded
Open this post in threaded view
|

Re: Adding dependency on MemoryDependenceAnalysis pass to LICM causes opt to get stuck in addPass

David Gardner-8
> > Then I can see that opt is getting stuck in lib/VMCore/PassManager.cpp

> > on the loop at line 672, and just goes round this for as long as I've
> > left it for (several minutes) :
> >
> >      // Check other pass managers
> >      for (SmallVectorImpl<PMDataManager *>::iterator
> >           I = IndirectPassManagers.begin(),
> >           E = IndirectPassManagers.end(); I != E; ++I)
> >        if (Pass *P = (*I)->findAnalysisPass(AID, false))
> >          return P;
> >
>
> Do you see a repeated pattern of pass sequence the pass manager is trying to handle ? P->getPassName() is handy.
I do (looking from llvm::PMTopLevelManager::schedulePass with gdb) :

Breakpoint 1, llvm::PMTopLevelManager::schedulePass (this=0x1310930, P=0x1310510)
    at /home/daveg/tmp/checkouts/llvm/lib/VMCore/PassManager.cpp:609
609       P->preparePassManager(activeStack);
(gdb) display P->getPassName ()
[trimmed output for just pass names]
1: P->getPassName () = 0xf0ba95 "Target Library Information"
1: P->getPassName () = 0xf0b6cd "Target Data Layout"
1: P->getPassName () = 0xef3872 "Basic Alias Analysis (stateless AA
1: P->getPassName () = 0xefffe4 "No Alias Analysis (always returns 'may'
1: P->getPassName () = 0xf35a3a "Print module to stderr"
1: P->getPassName () = 0xed58b0 "Loop Invariant Code Motion"
1: P->getPassName () = 0xf00c95 "Dominator Tree Construction"
1: P->getPassName () = 0xefc441 "Natural Loop Information"
1: P->getPassName () = 0xeeb838 "Canonicalize natural loops"
1: P->getPassName () = 0xefc6e2 "Loop Pass Manager"
1: P->getPassName () = 0xefff64 "Memory Dependence Analysis"
1: P->getPassName () = 0xeeb838 "Canonicalize natural loops"
1: P->getPassName () = 0xefc6e2 "Loop Pass Manager"
1: P->getPassName () = 0xefff64 "Memory Dependence Analysis"

(repeats those 3 from then on)


Removing the `AU.addRequiredID(LoopSimplifyID);' call from the LICM
getAnalysisUsage function allows this to work in this case but I expect
this is required by the pass in general.




        Cheers,

                Dave

_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

signature.asc (853 bytes) Download Attachment