[LLVMdev] Accurate (non-local) memory dependence analysis

Ignacio Laguna lagunaperalt1 at llnl.gov
Wed Sep 10 11:27:25 PDT 2014


Hi everyone,

Is there any LLVM pass to get memory dependencies for may- and 
most-alias cases? I tried using (and reading the code of) 
'MemoryDependenceAnalysis' and 'MemDepPrinter', but all I'm able to 
infer are "local" memory dependencies, that is, within the same basic 
block. When the dependence is found to be non-local (e.g., from another 
basic block), the interface doesn't tell me the instruction it depends on.

Here's an example (optimizing with -mem2reg):

int main()
{
	int size = 3;
	double x[size];
	x[0] = 1.0;
	x[1] = 2.0;
	x[2] = 3.0;
	
	if (size == 3)
	{
		// do something
		x[2] = 100;
	}

	x[0] = x[1] + 1.0;
	
	return 0;
}

entry:
   %0 = zext i32 3 to i64
   %1 = call i8* @llvm.stacksave()
   %vla = alloca double, i64 %0, align 16
   %arrayidx = getelementptr inbounds double* %vla, i64 0
   store double 1.000000e+00, double* %arrayidx, align 8
   %arrayidx1 = getelementptr inbounds double* %vla, i64 1
   store double 2.000000e+00, double* %arrayidx1, align 8
   %arrayidx2 = getelementptr inbounds double* %vla, i64 2
   store double 3.000000e+00, double* %arrayidx2, align 8
   %cmp = icmp eq i32 3, 3
   br i1 %cmp, label %if.then, label %if.end

if.then:                            ; preds = %entry
   %arrayidx3 = getelementptr inbounds double* %vla, i64 2
   store double 1.000000e+02, double* %arrayidx3, align 8
   br label %if.end

if.end:                             ; preds = %if.then, %entry
   %arrayidx4 = getelementptr inbounds double* %vla, i64 1
   %2 = load double* %arrayidx4, align 8
   %add = fadd double %2, 1.000000e+00
   %arrayidx5 = getelementptr inbounds double* %vla, i64 0
   store double %add, double* %arrayidx5, align 8
   call void @llvm.stackrestore(i8* %1)
   ret i32 0

I would like to find that the load in instruction %2 (in if.end) may 
depend on the second store instruction in entry, since they access the 
same memory location (and "if.end" post-dominates "entry"). However, 
using the "MemoryDependenceAnalysis" pass, I'm only able to know that 
there is a non-local dependence (the found instruction is always NULL).

I use this code (for non-local dependencies):

MemoryDependenceAnalysis *MDA;
....
SmallVector<NonLocalDepResult, 4> NLDI;
MDA->getNonLocalPointerDependency(loc, isLoad, inst->getParent(), NLDI);
for (SmallVectorImpl<NonLocalDepResult>::const_iterator I = 
NLDI.begin(), E = NLDI.end(); I != E; ++I)
{
   const MemDepResult &depRes = I->getResult();
   if (depRes.getInst())
   {
     // But this instruction is NULL...
   }
}

Is this because this analysis is conservative (only covers must-alias, 
and not may-alias cases)?

Thank you!


-- 
Ignacio Laguna
Center for Applied Scientific Computing (CASC)
Lawrence Livermore National Laboratory



More information about the llvm-dev mailing list