[LLVMdev] "Best" alias analysis algorithm

Vladimir Prus ghost at cs.msu.su
Mon Apr 25 05:09:42 PDT 2005

On Monday 25 April 2005 14:43, Vladimir Prus wrote:

> The 'i' variable is never modified in the program, however, all analyses
> except for -globalsmodref-aa report that the
>     	%tmp.3 = call int %_Z3bari( int %p )		; <int> [#uses=1]
> instruction can modify 'i'. I'm somewhat surprised, because it looks like
> -globalsmodref-aa is the simplest algorithm. So, why the order algorithms
> report possible modification?
> In fact, if I add
>    %j = external global int		;
> which is not used *anywhere*, most algorithms report that %j is modified by
> the call. Am I missing something, or -globalsmodref-aa is the only alias
> analysis that properly handles globals?

Things are actually worse. If I declare two global variables, and modify the 
called function so that it changes just one variable, then alias analysis 
(with --globalsmodref-aa) reports that the call instruction can write to both 
global variables.

The C++ program is at

The LLVM bytecode is at

And the output from my code is 

The code itself is in

The GlobalsModRef::getModRefInfo has this logic:

    // If we are asking for mod/ref info of a direct call with a pointer to a
    // global we are tracking, return information if we have it.
    if (GlobalValue *GV = const_cast<GlobalValue*>(getUnderlyingObject(P)))
       if (GV->hasInternalLinkage())

So, no information is produced for external variables, the function calls 
Aliasanalysis::getModRefInfo, which sees that called function may write to 
memory, and returns true for all global variables.

Anything I can do about it? What I what is minimally accurate information 
about all global variables a function may modify. "Modifies them all" is 
clearly not even minimally accurate.

- Volodya

More information about the llvm-dev mailing list