陈晓宇
2012-Aug-29 01:57 UTC
[LLVMdev] How to require ScalarEvolution analysis in a Module pass?
Guys, What I want to do is to hack global opt pass, which needs ScalarEvolution analysis. However opt crashed saying "opt: /home/xchen/llvm/include/llvm/PassAnalysisSupport.h:242: AnalysisType& llvm::Pass::getAnalysisID(const void*, llvm::Function&) [with AnalysisType = llvm::ScalarEvolution]: Assertion `ResultPass && "Unable to find requested analysis info"' failed.". My question is what should I do to require ScalarEvolution analysis in a Module pass??? Steps to reproduce(bc file attached in case you do not have clang installed): 1. Makefile looks like this: all: clang test.c -disable-llvm-optzns -emit-llvm -S llvm-as test.s -o test.bc opt test.bc -loop-unroll -globalopt -loop-unroll -inline -loop-idiom -o out.bc llvm-dis < out.bc > out.ll 2. test.c: #include <stdio.h> int A[100]; static int toBeInlined(int A[100]) { int ans = 0; for (int i=0; i<100; ++i) ans+=A[i]; return ans; } int main() { for (int i=0; i<100; ++i) if (i%3==0) A[i] = i; else A[i] = i+1; int ans = toBeInlined(A); printf("%d\n", ans); return 0; } 3. globalopt: --- GlobalOpt.cpp (revision 162438) +++ GlobalOpt.cpp (working copy) @@ -38,6 +38,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/Analysis/ScalarEvolutionExpander.h" #include <algorithm> using namespace llvm; @@ -63,6 +64,7 @@ struct GlobalOpt : public ModulePass { virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired<TargetLibraryInfo>(); + AU.addRequired<ScalarEvolution>(); } static char ID; // Pass identification, replacement for typeid GlobalOpt() : ModulePass(ID) { @@ -92,6 +94,7 @@ INITIALIZE_PASS_BEGIN(GlobalOpt, "globalopt", "Global Variable Optimizer", false, false) INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo) +INITIALIZE_PASS_DEPENDENCY(ScalarEvolution) INITIALIZE_PASS_END(GlobalOpt, "globalopt", "Global Variable Optimizer", false, false) @@ -2087,6 +2090,7 @@ if (!F->hasName() && !F->isDeclaration()) F->setLinkage(GlobalValue::InternalLinkage); F->removeDeadConstantUsers(); + ScalarEvolution *SE = &getAnalysis<ScalarEvolution>(*F); ------------------------------------> CRASH here: if (F->isDefTriviallyDead()) { F->eraseFromParent(); Changed = true; 4. core dump #0 0x000000386de30265 in raise () from /lib64/libc.so.6 #1 0x000000386de31d10 in abort () from /lib64/libc.so.6 #2 0x000000386de296e6 in __assert_fail () from /lib64/libc.so.6 #3 0x000000000058dbe1 in llvm::Pass::getAnalysisID<llvm::ScalarEvolution> (this=0x10e9ef0, PI=0x10d3120, F ...) at /home/xchen/llvm/include/llvm/PassAnalysisSupport.h:242 #4 0x000000000058dc4c in llvm::Pass::getAnalysis<llvm::ScalarEvolution> (this=0x10e9ef0, F=...) at /home/xchen/llvm/include/llvm/PassAnalysisSupport.h:231 #5 0x0000000000577f60 in (anonymous namespace)::GlobalOpt::OptimizeFunctions (this=0x10e9ef0, M=...) at /home/xchen/llvm/lib/Transforms/IPO/GlobalOpt.cpp:2093 #6 0x00000000005824c5 in (anonymous namespace)::GlobalOpt::runOnModule (this=0x10e9ef0, M=...) at /home/xchen/llvm/lib/Transforms/IPO/GlobalOpt.cpp:3130 #7 0x0000000000a50c69 in llvm::MPPassManager::runOnModule (this=0x10f4120, M=...) at /home/xchen/llvm/lib/VMCore/PassManager.cpp:1572 #8 0x0000000000a520d9 in llvm::PassManagerImpl::run (this=0x10f44a0, M=...) at /home/xchen/llvm/lib/VMCore/PassManager.cpp:1655 #9 0x0000000000a5213b in llvm::PassManager::run (this=0x7fffffffd510, M=...) at /home/xchen/llvm/lib/VMCore/PassManager.cpp:1684 #10 0x0000000000541e77 in main (argc=9, argv=0x7fffffffd778) at /home/xchen/llvm/tools/opt/opt.cpp:745 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120829/ff9f8c5d/attachment.html> -------------- next part -------------- A non-text attachment was scrubbed... Name: test.bc Type: application/octet-stream Size: 1172 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120829/ff9f8c5d/attachment.obj>
Maybe Matching Threads
- [LLVMdev] Function inline pass core dump when removing a function
- [LLVMdev] Fail when building llvm2.9 using MinGW64
- musttail & alwaysinline interaction
- Re: [PATCH 0/2] resize: Split out the command line parsing into Cmdline
- Re: [PATCH 0/2] Add lightweight bindings for PCRE.