[LLVMdev] MemoryDependenceAnalysis reports dependencies between NoAlias pointers

Félix Cloutier felixcca at yahoo.ca
Thu May 21 11:37:32 PDT 2015


Hi all,

I have a custom alias analysis pass that enforces that pointers from different address spaces do not alias, and I'm using MemoryDependenceAnalysis to, well, figure out dependence analysis.

The AA pass is extremely simple, it only checks the address space of pointers, returns NoAlias if they're different, and delegates otherwise. It is the last alias analysis pass added to my PassManager (basically, after BasicAA only). As far as I can check with breakpoints and logging, it appears to work as intended. MemoryDependenceAnalysis often appears in the call stack when my alias method is called, and it does return NoAlias appropriately.

However, in another custom module pass that I have, I'm observing that MemDep reports dependences between loads and stores of pointers to different address spaces, despite my AA pass. For instance, an AA request against these parameters returns NoAlias:

  %7 = inttoptr i64 %4 to i64 addrspace(1)*
  %9 = getelementptr inbounds %struct.mystruct, %struct.mystruct* %0, i64 0, i32 7, i32 0

But then, memdep suggests that there is a clobber dependency between these two instructions:

  %10 = load i64, i64* %9, align 8
  store i64 %6, i64 addrspace(1)* %7, align 8

I would expect that since the locations cannot alias, the load cannot depend on the store. When used from my module pass, MemoryDependenceAnalysis never ends up calling my AA pass, but I would imagine that this is because GVN or some other pass already did all the queries that I do and that they are cached.

Am I missing something?

Félix



More information about the llvm-dev mailing list