[LLVMdev] Question about Alias Analysis

Ben Chambers bjchambers at gmail.com
Tue Jun 26 21:17:08 PDT 2007


Thanks, that's a lot more like the output I was expecting.  But, I'm
now wondering if I'm doing something wrong because the output confuses
me.

When run on the program:

int main() {
  int a = 5;
  int* b = &a;
  int* c = &a;
  return *b;
}

I would expect to see either b may alias c or b must alias c.  But, it
doesn't even appear in the list.  Furthermore, I would expect to see
**b (may/must) alias *c, but it instead says that this isn't true.  Am
I not running the right passes (I used -basicaa -anders-aa) or am I
misreading things.

Results:

Function: main: 6 pointers, 0 call sites
  NoAlias:  i32* %retval, i32* %tmp
  NoAlias:  i32* %a, i32* %tmp
  NoAlias:  i32* %a, i32* %retval
  NoAlias:  i32** %b, i32* %tmp
  NoAlias:  i32** %b, i32* %retval
  NoAlias:  i32** %b, i32* %a
  NoAlias:  i32** %c, i32* %tmp
  NoAlias:  i32** %c, i32* %retval
  NoAlias:  i32** %c, i32* %a
  NoAlias:  i32** %c, i32** %b
  NoAlias:  i32* %tmp1, i32* %tmp
  NoAlias:  i32* %tmp1, i32* %retval
  MayAlias: i32* %tmp1, i32* %a
  NoAlias:  i32* %tmp1, i32** %b
  NoAlias:  i32* %tmp1, i32** %c
===== Alias Analysis Evaluator Report =====
  15 Total Alias Queries Performed
  14 no alias responses (93.3%)
  1 may alias responses (6.6%)
  0 must alias responses (0.0%)
  Alias Analysis Evaluator Pointer Alias Summary: 93%/6%/0%
  Alias Analysis Mod/Ref Evaluator Summary: no mod/ref!

On 6/26/07, Chris Lattner <sabre at nondot.org> wrote:
> On Mon, 25 Jun 2007, Ben Chambers wrote:
> > I guess what confuses me is that it doesn't seem like it was able to
> > figure out that *b = a.  Am I looking at this wrong?  Is there a more
> > accurate way of getting the alias information out of the pass?
>
> The answer is to not look at the alias sets.  I'd suggest looking at the
> raw results of alias queries.  To do this, use the -aa-eval pass with the
> -print-all-alias-modref-info option.  The alias set builder uses
> unification to build the sets, so it will give you less precise
> information than the raw queries do.
>
> -Chris
>
> > Thanks,
> > Ben Chambers
> >
> > Output:
> > AliasSet[0x601e70,2] may  alias, Mod/Ref   Pointers: (i32* %a, 4),
> > (i32* %tmp1, 4)
> > AliasSet[0x601ea0,1] must alias, Mod/Ref   Pointers: (i32** %b, 4)
> > AliasSet[0x601f10,1] must alias, Mod/Ref   Pointers: (i32* %tmp, 4)
> > AliasSet[0x601f60,1] must alias, Mod/Ref   Pointers: (i32* %retval, 4)
> >
> > Input:
> >
> > int main() {
> > int a = 5;
> > int* b = &a;
> > return *b;
> > }
> >
> > Assembly:
> >
> > define i32 @main() {
> > entry:
> > %retval = alloca i32, align 4   ; <i32*> [#uses=2]
> > %tmp = alloca i32, align 4    ; <i32*> [#uses=2]
> > %a = alloca i32, align 4    ; <i32*> [#uses=2]
> > %b = alloca i32*, align 4   ; <i32**> [#uses=2]
> > "alloca point" = bitcast i32 0 to i32   ; <i32> [#uses=0]
> > store i32 5, i32* %a
> > store i32* %a, i32** %b
> > %tmp1 = load i32** %b   ; <i32*> [#uses=1]
> > %tmp2 = load i32* %tmp1   ; <i32> [#uses=1]
> > store i32 %tmp2, i32* %tmp
> > %tmp3 = load i32* %tmp    ; <i32> [#uses=1]
> > store i32 %tmp3, i32* %retval
> > br label %return
> >
> > return:   ; preds = %entry
> > %retval4 = load i32* %retval    ; <i32> [#uses=1]
> > ret i32 %retval4
> > }
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >
>
> -Chris
>
> --
> http://nondot.org/sabre/
> http://llvm.org/
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



More information about the llvm-dev mailing list