about MemoryDependenceAnalysis usage

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

Playdep.tar.gz (1.48 KB)

add -basicaa to your command line :slight_smile:

Thanks for your quick answer.
But it's still the same:
opt -o /dev/null test.ll -S -load ./libPlaydep.so -O3 -basicaa -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
....
      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

intriguiging.
Is your pass a modulepass, or what?

Yes it is.