David Gardner
2011-Dec-14 15:09 UTC
[LLVMdev] Adding dependency on MemoryDependenceAnalysis pass to LICM causes opt to get stuck in addPass
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 -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 836 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111214/71b7e1ee/attachment.sig>
Devang Patel
2011-Dec-14 17:50 UTC
[LLVMdev] Adding dependency on MemoryDependenceAnalysis pass to LICM causes opt to get stuck in addPass
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 > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
David Gardner
2011-Dec-15 10:31 UTC
[LLVMdev] Adding dependency on MemoryDependenceAnalysis pass to LICM causes opt to get stuck in addPass
> > 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 -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 836 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111215/7d5f4809/attachment.sig>
Apparently Analagous Threads
- [LLVMdev] Adding dependency on MemoryDependenceAnalysis pass to LICM causes opt to get stuck in addPass
- [LLVMdev] Infinite loop when adding a new analysis pass
- [LLVMdev] about MemoryDependenceAnalysis usage
- [LLVMdev] about MemoryDependenceAnalysis usage
- [LLVMdev] pass utilizing MemoryDependenceAnalysis?