[LLVMdev] Alias Analysis accuracy
Arnold Schwaighofer
arnold.schwaighofer at gmail.com
Fri Sep 21 15:47:52 PDT 2012
You see the result for running basicaa after mem2reg.
The IR after mem2reg will look like (you can look at it by doing
-mem2reg -basicaa -aa-eval -print-all-alias-modref-info < test.ll
-print-after-all)
define void @_Z3fooPiS_S_(i32* noalias %a, i32* noalias %b, i32*
noalias %c) nounwind {
entry:
%"alloca point" = bitcast i32 0 to i32
br label %bb1
bb: ; preds = %bb1
%0 = sext i32 %i.0 to i64
%1 = getelementptr inbounds i32* %a, i64 %0
%2 = load i32* %1, align 1
%3 = sext i32 %i.0 to i64
%4 = getelementptr inbounds i32* %b, i64 %3
%5 = load i32* %4, align 1
%6 = add nsw i32 %2, %5
%7 = sext i32 %i.0 to i64
%8 = getelementptr inbounds i32* %c, i64 %7
store i32 %6, i32* %8, align 1
%9 = add nsw i32 %i.0, 1
br label %bb1
bb1: ; preds = %bb, %entry
%i.0 = phi i32 [ 0, %entry ], [ %9, %bb ]
%10 = icmp sle i32 %i.0, 9
br i1 %10, label %bb, label %bb2
bb2: ; preds = %bb1
br label %return
return: ; preds = %bb2
ret void
}
The results your are getting are correct.
On Fri, Sep 21, 2012 at 5:22 PM, Welson Sun <welson.sun at gmail.com> wrote:
> Here is the result of running mem2reg then basicaa, it is even worse: (%a
> should be alias to %0, and partial alias to %3)
>
> opt -mem2reg -basicaa -aa-eval -print-all-alias-modref-info < foo.s >
> /dev/null
> Function: foo: 6 pointers, 0 call sites
> NoAlias: i32* %a, i32* %b
> NoAlias: i32* %a, i32* %c
> NoAlias: i32* %b, i32* %c
> PartialAlias: i32* %1, i32* %a
> NoAlias: i32* %1, i32* %b
> NoAlias: i32* %1, i32* %c
> NoAlias: i32* %4, i32* %a
> PartialAlias: i32* %4, i32* %b
> NoAlias: i32* %4, i32* %c
> NoAlias: i32* %1, i32* %4
> NoAlias: i32* %8, i32* %a
> NoAlias: i32* %8, i32* %b
> PartialAlias: i32* %8, i32* %c
> NoAlias: i32* %1, i32* %8
> NoAlias: i32* %4, i32* %8
>
>
> On Fri, Sep 21, 2012 at 3:18 PM, Eli Friedman <eli.friedman at gmail.com>
> wrote:
>>
>> On Fri, Sep 21, 2012 at 3:08 PM, Welson Sun <welson.sun at gmail.com> wrote:
>> > OK, with the restrict type qualifier, it is a little bit better:
>> >
>> > The IR's function signature becomes:
>> > define void @foo(i32* noalias %a, i32* noalias %b, i32* noalias %c)
>> > nounwind
>> > {
>> >
>> > Now the AA result:
>> > Function: foo: 13 pointers, 0 call sites
>> > NoAlias: i32* %a, i32* %b
>> > NoAlias: i32* %a, i32* %c
>> > NoAlias: i32* %b, i32* %c
>> > NoAlias: i32* %a, i32** %a_addr
>> > NoAlias: i32* %b, i32** %a_addr
>> > NoAlias: i32* %c, i32** %a_addr
>> > NoAlias: i32* %a, i32** %b_addr
>> > NoAlias: i32* %b, i32** %b_addr
>> > NoAlias: i32* %c, i32** %b_addr
>> > NoAlias: i32** %a_addr, i32** %b_addr
>> > NoAlias: i32* %a, i32** %c_addr
>> > NoAlias: i32* %b, i32** %c_addr
>> > NoAlias: i32* %c, i32** %c_addr
>> > NoAlias: i32** %a_addr, i32** %c_addr
>> > NoAlias: i32** %b_addr, i32** %c_addr
>> > NoAlias: i32* %a, i32* %i
>> > NoAlias: i32* %b, i32* %i
>> > NoAlias: i32* %c, i32* %i
>> > NoAlias: i32* %i, i32** %a_addr
>> > NoAlias: i32* %i, i32** %b_addr
>> > NoAlias: i32* %i, i32** %c_addr
>> > MayAlias: i32* %0, i32* %a
>> > MayAlias: i32* %0, i32* %b
>> > MayAlias: i32* %0, i32* %c
>> > NoAlias: i32* %0, i32** %a_addr
>> > NoAlias: i32* %0, i32** %b_addr
>> > NoAlias: i32* %0, i32** %c_addr
>> > NoAlias: i32* %0, i32* %i
>> > MayAlias: i32* %3, i32* %a
>> > MayAlias: i32* %3, i32* %b
>> > MayAlias: i32* %3, i32* %c
>> > NoAlias: i32* %3, i32** %a_addr
>> > NoAlias: i32* %3, i32** %b_addr
>> > NoAlias: i32* %3, i32** %c_addr
>> > NoAlias: i32* %3, i32* %i
>> > PartialAlias: i32* %0, i32* %3
>> > MayAlias: i32* %5, i32* %a
>> > MayAlias: i32* %5, i32* %b
>> > MayAlias: i32* %5, i32* %c
>> > NoAlias: i32* %5, i32** %a_addr
>> > NoAlias: i32* %5, i32** %b_addr
>> > NoAlias: i32* %5, i32** %c_addr
>> > NoAlias: i32* %5, i32* %i
>> > MayAlias: i32* %0, i32* %5
>> > MayAlias: i32* %3, i32* %5
>> > MayAlias: i32* %8, i32* %a
>> > MayAlias: i32* %8, i32* %b
>> > MayAlias: i32* %8, i32* %c
>> > NoAlias: i32* %8, i32** %a_addr
>> > NoAlias: i32* %8, i32** %b_addr
>> > NoAlias: i32* %8, i32** %c_addr
>> > NoAlias: i32* %8, i32* %i
>> > MayAlias: i32* %0, i32* %8
>> > MayAlias: i32* %3, i32* %8
>> > PartialAlias: i32* %5, i32* %8
>> > MayAlias: i32* %11, i32* %a
>> > MayAlias: i32* %11, i32* %b
>> > MayAlias: i32* %11, i32* %c
>> > NoAlias: i32* %11, i32** %a_addr
>> > NoAlias: i32* %11, i32** %b_addr
>> > NoAlias: i32* %11, i32** %c_addr
>> > NoAlias: i32* %11, i32* %i
>> > MayAlias: i32* %0, i32* %11
>> > MayAlias: i32* %11, i32* %3
>> > MayAlias: i32* %11, i32* %5
>> > MayAlias: i32* %11, i32* %8
>> > MayAlias: i32* %14, i32* %a
>> > MayAlias: i32* %14, i32* %b
>> > MayAlias: i32* %14, i32* %c
>> > NoAlias: i32* %14, i32** %a_addr
>> > NoAlias: i32* %14, i32** %b_addr
>> > NoAlias: i32* %14, i32** %c_addr
>> > NoAlias: i32* %14, i32* %i
>> > MayAlias: i32* %0, i32* %14
>> > MayAlias: i32* %14, i32* %3
>> > MayAlias: i32* %14, i32* %5
>> > MayAlias: i32* %14, i32* %8
>> > PartialAlias: i32* %11, i32* %14
>> >
>> > a, b and c are no longer alias, as expected. However, they all may alias
>> > to
>> > %0. I guess basicaa doesn't handle data flow analysis?
>>
>> No. Try running mem2reg.
>>
>> -Eli
>
>
>
>
> --
> Welson
>
> Phone: (408) 418-8385
> Email: welson.sun at gmail.com
>
>
>
> _______________________________________________
> 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