sample-code for alias-analysis

Hi,

i need a sample-code, for which the llvm alias-analysis finds a must-aliases.
I have tried codes like followings. In all cases, i see just may-aliases when i use “opt -aa-eval -print-all-alias-modref-info foo.bc”:

Regards
Raad

1 ==========================================
void foo() {
int i = 2;
int& r = i;
}

2 ===========================================
void foo(){
int gi;
int *gip1 = &gi;
int *gip2 = &gi;
}

3 ==========================================
void foo (double * fa){
int fi, fj;
fi = 0;
fj = 2;
if (! fa)
fj = fj + 4;
fa[fi] = fa[fi + fj];
}

RAAD B wrote:

Hi,

i need a sample-code, for which the llvm alias-analysis finds a *must-aliases*.
I have tried codes like followings. In all cases, i see just *may-aliases* when i use "opt -aa-eval -print-all-alias-modref-info foo.bc":

Your examples are all .c files. What did your .ll look like? Here's the problem:

$ llvm-g++ -O0 ex1.c -S -o - -emit-llvm
define void @_Z3foov() nounwind {
entry:
         %r = alloca i32* ; <i32**> [#uses=1]
         %i = alloca i32 ; <i32*> [#uses=2]
         %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
         store i32 2, i32* %i, align 4
         store i32* %i, i32** %r, align 4
         br label %return

return: ; preds = %entry
         ret void
}

Obviously %r and %i don't alias: they're two separate heap allocations. What you really want to do is run through some optimizations like mem2reg and friends. But on that same example, it'll produce this:

$ llvm-g++ -O2 ex1.c -S -o - -emit-llvm
define void @_Z3foov() nounwind readnone {
entry:
         ret void
}

The must-alias result is really hard to produce from a .c file because it inherently means that one pointer is *exactly* equal to the other in the sense that you could replace one with the other. One of them would wind up being deleted.

You can cook up a .ll example easily enough, or I suppose you could fiddle with .c examples piped through select optimizations to produce an example that works for you.

Nick