[LLVMdev] alias analysis on llvm internal globals
Daniel Berlin
dberlin at dberlin.org
Sat Apr 25 20:11:07 PDT 2015
On Sat, Apr 25, 2015 at 4:32 PM, Xin Tong <trent.tong at gmail.com> wrote:
> Hi
>
> I have this program in which fooBuf can only take on NULL or the
> address of local_fooBuf, and fooBuf and local_fooBuf have scope of the
> foo function.
>
> Therefore there is no way for the fooPtr argument to alias with
> fooBuf. However, LLVM basicaa and globalsmodref-aa say the 2 pointers
> may alias.
>
> I am thinking whether i should implement a limited form of point-to
> alias on the fooBuf pointer in basicaa, i.e. looking at all stores to
> it and computing what addresses it can take on and then compare with
> fooPtr which can not point to local_fooBuf as it has a function
> scope.
You don't want to do this in basicaa, you want to make a new pass that oes this.
Additionally, your real problem here is that it needs loop recurrence info.
Basically what you are trying to reproduce is SCEVAA
>
> Also, LLVM global variables do not have seem to have scope
> information. where can i get that information ?
>
> Thanks,
> Xin
>
> int foo(int *fooPtr,int aconst)
> {
> int i;
> int sum;
> int *fooOffsetPtr;
> static int init = 1;
> static int *fooBuf = NULL;
> static int local_fooBuf[512*4] = {};
>
> if (init == 1) {
> fooBuf = local_fooBuf;
> init = 0;
> }
> fooOffsetPtr = &fooBuf[aconst/2];
> #pragma nounroll
> for (i=0;i<aconst;++i) {
> /// fooPtr can not point to the same memory location as fooOffsetPtr.
> fooPtr[i] = i; /// <------- HERE.
> /// should not this be moved out of the loop. at least, should not
> /// load fooOffsetPtr[0] be moved out of the loop. /// <------- HERE.
> sum += fooOffsetPtr[0];
> }
> return sum;
> }
>
>
> ////////////////////////////////////////// opt -globalsmodref-aa -O3
> ptr.ll -S //////////////////////////////////////////
> @foo.init = internal unnamed_addr global i1 false
> @foo.fooBuf = internal unnamed_addr global i32* null, align 8
> @foo.local_fooBuf = internal global [2048 x i32] zeroinitializer, align 16
>
> ; Function Attrs: nounwind uwtable
> define i32 @foo(i32* nocapture %fooPtr, i32 %aconst) #0 {
> entry:
> %.b = load i1, i1* @foo.init, align 1
> br i1 %.b, label %entry.if.end_crit_edge, label %if.then
>
> entry.if.end_crit_edge: ; preds = %entry
> %.pre = load i32*, i32** @foo.fooBuf, align 8, !tbaa !1
> br label %if.end
>
> if.then: ; preds = %entry
> store i32* getelementptr inbounds ([2048 x i32]* @foo.local_fooBuf,
> i64 0, i64 0), i32** @foo.fooBuf, align 8, !tbaa !1
> store i1 true, i1* @foo.init, align 1
> br label %if.end
>
> if.end: ; preds =
> %entry.if.end_crit_edge, %if.then
> %0 = phi i32* [ %.pre, %entry.if.end_crit_edge ], [ getelementptr
> inbounds ([2048 x i32]* @foo.local_fooBuf, i64 0, i64 0), %if.then ]
> %div = sdiv i32 %aconst, 2
> %idxprom = sext i32 %div to i64
> %arrayidx = getelementptr inbounds i32, i32* %0, i64 %idxprom
> %cmp110 = icmp sgt i32 %aconst, 0
> br i1 %cmp110, label %for.body.preheader, label %for.end, !llvm.loop !5
>
> for.body.preheader: ; preds = %if.end
> br label %for.body
>
> for.body: ; preds =
> %for.body.preheader, %for.body
> %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0,
> %for.body.preheader ]
> %sum.011 = phi i32 [ %add, %for.body ], [ undef, %for.body.preheader ]
> %arrayidx3 = getelementptr inbounds i32, i32* %fooPtr, i64 %indvars.iv
> %1 = trunc i64 %indvars.iv to i32
> store i32 %1, i32* %arrayidx3, align 4, !tbaa !7
> %2 = load i32, i32* %arrayidx, align 4, !tbaa !7
> %add = add nsw i32 %2, %sum.011
> %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
> %lftr.wideiv = trunc i64 %indvars.iv.next to i32
> %exitcond = icmp eq i32 %lftr.wideiv, %aconst
> br i1 %exitcond, label %for.end.loopexit, label %for.body, !llvm.loop !5
>
> for.end.loopexit: ; preds = %for.body
> %add.lcssa = phi i32 [ %add, %for.body ]
> br label %for.end
>
> for.end: ; preds =
> %for.end.loopexit, %if.end
> %sum.0.lcssa = phi i32 [ undef, %if.end ], [ %add.lcssa, %for.end.loopexit ]
> ret i32 %sum.0.lcssa
> }
> _______________________________________________
> 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