Hi, I try to use MemoryDependenceAnalysis in a pass to analyse a simple function: void fct (int *restrict*restrict M, int *restrict*restrict L) { S1: M[1][1] = 1; S2: L[2][2] = 2; } When I iterate over MemoryDependenceAnalysis on the S2 statement, I get the load instruction for the first depth of the array, that’s ok. But I get also the load and store for the S1 statement. I assume the restrict keywoard help the alias analysis to found that pointers don’t alias. The prototype of this function in llvm-ir is: define void @fct(i32** noalias %M, i32** noalias %L) #0 { …. Did this noalias attribute say that both pointer of i32** didn’t alias? Also, when I check wich AliasAnalysis pass is called with —debug-pass=Structure, I see that Memory Dependence Analysis use No Alias Analysis, even if I use -O3 before calling my pass. Can we specify which AlisAnalysis we want to use inside the pass (in getAnalysisUsage method, or somewhere else)? Regards, Willy
I play a bit more with MemoryDependenceAnalysis by wrapping my pass, and call explicitely BasicAliasAnalysis. Its still using No Alias Analysis. How can I let MemoryDependenceAnalysis use BasicAliasAnalysis? Please, find attached my pass. I call my pass like this: "opt -o /dev/null -S test.ll -load libPlaydep.so -O3 -playdep --debug-pass=Structure" And the output: opt -o /dev/null test.ll -S -load ./libPlaydep.so -O3 -playdep --debug-pass=Structure Pass Arguments: -targetlibinfo -datalayout -notti -basictti -x86tti -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost -inline -functionattrs -argpromotion -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-idiom -loop-deletion -function_tti -loop-unroll -memdep -mldst-motion -domtree -memdep -gvn -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simplify -lcssa -branch-prob -block-freq -scalar-evolution -loop-vectorize -instcombine -scalar-evolution -slp-vectorizer -simplifycfg -domtree -instcombine -loops -loop-simplify -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-assumptions -strip-dead-prototypes -globaldce -constmerge -playdep -verify -verify-di -print-module Target Library Information Data Layout No target information Target independent code generator's TTI X86 Target Transform Info No Alias Analysis (always returns 'may' alias) Type-Based Alias Analysis Scoped NoAlias Alias Analysis Assumption Cache Tracker Basic Alias Analysis (stateless AA impl) ModulePass Manager Debug Info Verifier Interprocedural Sparse Conditional Constant Propagation Global Variable Optimizer ..... FunctionPass Manager Module Verifier Debug Info Verifier Print module to stderr Pass Arguments: -no-aa -assumption-cache-tracker -targetlibinfo -basicaa No Alias Analysis (always returns 'may' alias) Assumption Cache Tracker Target Library Information Basic Alias Analysis (stateless AA impl) ModulePass Manager Unnamed pass: implement Pass::getPassName() Unnamed pass: implement Pass::getPassName() Pass Arguments: -assumption-cache-tracker -no-aa -memdep Assumption Cache Tracker No Alias Analysis (always returns 'may' alias) FunctionPass Manager Memory Dependence Analysis function fct for this instruction: store i32 2, i32* %6, align 4, !tbaa !5 deps are: %5 = load i32** %4, align 8, !tbaa !1 store i32 1, i32* %3, align 4, !tbaa !5 %2 = load i32** %1, align 8, !tbaa !1 Cheers, Willy On 09/05/2015 16:06, Willy WOLFF wrote:> Hi, > > I try to use MemoryDependenceAnalysis in a pass to analyse a simple function: > > void fct (int *restrict*restrict M, int *restrict*restrict L) { > S1: M[1][1] = 1; > S2: L[2][2] = 2; > } > > When I iterate over MemoryDependenceAnalysis on the S2 statement, I get the load instruction for the first depth of the array, that’s ok. But I get also the load and store for the S1 statement. > I assume the restrict keywoard help the alias analysis to found that pointers don’t alias. > The prototype of this function in llvm-ir is: > define void @fct(i32** noalias %M, i32** noalias %L) #0 { …. > > Did this noalias attribute say that both pointer of i32** didn’t alias? > > Also, when I check wich AliasAnalysis pass is called with —debug-pass=Structure, I see that Memory Dependence Analysis use No Alias Analysis, even if I use -O3 before calling my pass. Can we specify which AlisAnalysis we want to use inside the pass (in getAnalysisUsage method, or somewhere else)? > > Regards, > Willy >-------------- next part -------------- A non-text attachment was scrubbed... Name: Playdep.tar.gz Type: application/gzip Size: 1520 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150511/537eba67/attachment.bin>
add -basicaa to your command line :) On Mon, May 11, 2015 at 7:15 AM, Willy WOLFF <willy.mh.wolff at gmail.com> wrote:> I play a bit more with MemoryDependenceAnalysis by wrapping my pass, and > call explicitely BasicAliasAnalysis. Its still using No Alias Analysis. > > How can I let MemoryDependenceAnalysis use BasicAliasAnalysis? > > Please, find attached my pass. > > I call my pass like this: "opt -o /dev/null -S test.ll -load libPlaydep.so > -O3 -playdep --debug-pass=Structure" > And the output: > > opt -o /dev/null test.ll -S -load ./libPlaydep.so -O3 -playdep > --debug-pass=Structure > Pass Arguments: -targetlibinfo -datalayout -notti -basictti -x86tti -no-aa > -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -verify-di -ipsccp > -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg > -prune-eh -inline-cost -inline -functionattrs -argpromotion -sroa -domtree > -early-cse -lazy-value-info -jump-threading -correlated-propagation > -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate > -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -loop-unswitch > -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-idiom > -loop-deletion -function_tti -loop-unroll -memdep -mldst-motion -domtree > -memdep -gvn -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value-info > -jump-threading -correlated-propagation -domtree -memdep -dse -adce > -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simplify > -lcssa -branch-prob -block-freq -scalar-evolution -loop-vectorize > -instcombine -scalar-evolution -slp-vectorizer -simplifycfg -domtree > -instcombine -loops -loop-simplify -lcssa -scalar-evolution -function_tti > -loop-unroll -alignment-from-assumptions -strip-dead-prototypes -globaldce > -constmerge -playdep -verify -verify-di -print-module > Target Library Information > Data Layout > No target information > Target independent code generator's TTI > X86 Target Transform Info > No Alias Analysis (always returns 'may' alias) > Type-Based Alias Analysis > Scoped NoAlias Alias Analysis > Assumption Cache Tracker > Basic Alias Analysis (stateless AA impl) > ModulePass Manager > Debug Info Verifier > Interprocedural Sparse Conditional Constant Propagation > Global Variable Optimizer > ..... > FunctionPass Manager > Module Verifier > Debug Info Verifier > Print module to stderr > Pass Arguments: -no-aa -assumption-cache-tracker -targetlibinfo -basicaa > No Alias Analysis (always returns 'may' alias) > Assumption Cache Tracker > Target Library Information > Basic Alias Analysis (stateless AA impl) > ModulePass Manager > Unnamed pass: implement Pass::getPassName() > Unnamed pass: implement Pass::getPassName() > Pass Arguments: -assumption-cache-tracker -no-aa -memdep > Assumption Cache Tracker > No Alias Analysis (always returns 'may' alias) > FunctionPass Manager > Memory Dependence Analysis > function fct > for this instruction: store i32 2, i32* %6, align 4, !tbaa !5 > deps are: > %5 = load i32** %4, align 8, !tbaa !1 > store i32 1, i32* %3, align 4, !tbaa !5 > %2 = load i32** %1, align 8, !tbaa !1 > > > Cheers, > Willy > > > On 09/05/2015 16:06, Willy WOLFF wrote: >> >> Hi, >> >> I try to use MemoryDependenceAnalysis in a pass to analyse a simple >> function: >> >> void fct (int *restrict*restrict M, int *restrict*restrict L) { >> S1: M[1][1] = 1; >> S2: L[2][2] = 2; >> } >> >> When I iterate over MemoryDependenceAnalysis on the S2 statement, I get >> the load instruction for the first depth of the array, that’s ok. But I get >> also the load and store for the S1 statement. >> I assume the restrict keywoard help the alias analysis to found that >> pointers don’t alias. >> The prototype of this function in llvm-ir is: >> define void @fct(i32** noalias %M, i32** noalias %L) #0 { …. >> >> Did this noalias attribute say that both pointer of i32** didn’t alias? >> >> Also, when I check wich AliasAnalysis pass is called with >> —debug-pass=Structure, I see that Memory Dependence Analysis use No Alias >> Analysis, even if I use -O3 before calling my pass. Can we specify which >> AlisAnalysis we want to use inside the pass (in getAnalysisUsage method, or >> somewhere else)? >> >> Regards, >> Willy >> > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >