<div dir="ltr">You need to have a pass to prove those static local's addresses do not escape the function scope (i.e passed to calls, or stored to globals or other escaped memory locations). With that information available, the aliaser can then disambiguate accesses to them from argument pointers. <div><br></div><div>David</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Apr 25, 2015 at 4:32 PM, Xin Tong <span dir="ltr"><<a href="mailto:trent.tong@gmail.com" target="_blank">trent.tong@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi<br>
<br>
I have this program in which fooBuf  can only take on NULL or the<br>
address of local_fooBuf, and fooBuf and local_fooBuf have scope of the<br>
foo function.<br>
<br>
Therefore there is no way for the fooPtr argument to alias with<br>
fooBuf. However, LLVM basicaa and globalsmodref-aa say the 2 pointers<br>
may alias.<br>
<br>
I am thinking whether i should implement a limited form of point-to<br>
alias on the fooBuf pointer in basicaa, i.e. looking at all stores to<br>
it and computing what addresses it can take on and then compare with<br>
fooPtr which can not point to local_fooBuf  as it has a function<br>
scope.<br>
<br>
Also, LLVM global variables do not have seem to have scope<br>
information. where can i get that information ?<br>
<br>
Thanks,<br>
Xin<br>
<br>
int foo(int *fooPtr,int aconst)<br>
{<br>
    int i;<br>
    int sum;<br>
    int *fooOffsetPtr;<br>
    static int init = 1;<br>
    static int *fooBuf = NULL;<br>
    static int local_fooBuf[512*4] = {};<br>
<br>
    if (init == 1) {<br>
        fooBuf = local_fooBuf;<br>
        init = 0;<br>
    }<br>
    fooOffsetPtr = &fooBuf[aconst/2];<br>
#pragma nounroll<br>
    for (i=0;i<aconst;++i) {<br>
        /// fooPtr can not point to the same memory location as fooOffsetPtr.<br>
        fooPtr[i] = i;                                      /// <-------  HERE.<br>
        /// should not this be moved out of the loop. at least, should not<br>
        /// load fooOffsetPtr[0] be moved out of the loop.  /// <-------  HERE.<br>
        sum += fooOffsetPtr[0];<br>
    }<br>
    return sum;<br>
}<br>
<br>
<br>
////////////////////////////////////////// opt -globalsmodref-aa -O3<br>
ptr.ll -S  //////////////////////////////////////////<br>
@foo.init = internal unnamed_addr global i1 false<br>
@foo.fooBuf = internal unnamed_addr global i32* null, align 8<br>
@foo.local_fooBuf = internal global [2048 x i32] zeroinitializer, align 16<br>
<br>
; Function Attrs: nounwind uwtable<br>
define i32 @foo(i32* nocapture %fooPtr, i32 %aconst) #0 {<br>
entry:<br>
  %.b = load i1, i1* @foo.init, align 1<br>
  br i1 %.b, label %entry.if.end_crit_edge, label %if.then<br>
<br>
entry.if.end_crit_edge:                           ; preds = %entry<br>
  %.pre = load i32*, i32** @foo.fooBuf, align 8, !tbaa !1<br>
  br label %if.end<br>
<br>
if.then:                                          ; preds = %entry<br>
  store i32* getelementptr inbounds ([2048 x i32]* @foo.local_fooBuf,<br>
i64 0, i64 0), i32** @foo.fooBuf, align 8, !tbaa !1<br>
  store i1 true, i1* @foo.init, align 1<br>
  br label %if.end<br>
<br>
if.end:                                           ; preds =<br>
%entry.if.end_crit_edge, %if.then<br>
  %0 = phi i32* [ %.pre, %entry.if.end_crit_edge ], [ getelementptr<br>
inbounds ([2048 x i32]* @foo.local_fooBuf, i64 0, i64 0), %if.then ]<br>
  %div = sdiv i32 %aconst, 2<br>
  %idxprom = sext i32 %div to i64<br>
  %arrayidx = getelementptr inbounds i32, i32* %0, i64 %idxprom<br>
  %cmp110 = icmp sgt i32 %aconst, 0<br>
  br i1 %cmp110, label %for.body.preheader, label %for.end, !llvm.loop !5<br>
<br>
for.body.preheader:                               ; preds = %if.end<br>
  br label %for.body<br>
<br>
for.body:                                         ; preds =<br>
%for.body.preheader, %for.body<br>
  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0,<br>
%for.body.preheader ]<br>
  %sum.011 = phi i32 [ %add, %for.body ], [ undef, %for.body.preheader ]<br>
  %arrayidx3 = getelementptr inbounds i32, i32* %fooPtr, i64 %indvars.iv<br>
  %1 = trunc i64 %indvars.iv to i32<br>
  store i32 %1, i32* %arrayidx3, align 4, !tbaa !7<br>
  %2 = load i32, i32* %arrayidx, align 4, !tbaa !7<br>
  %add = add nsw i32 %2, %sum.011<br>
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1<br>
  %lftr.wideiv = trunc i64 %indvars.iv.next to i32<br>
  %exitcond = icmp eq i32 %lftr.wideiv, %aconst<br>
  br i1 %exitcond, label %for.end.loopexit, label %for.body, !llvm.loop !5<br>
<br>
for.end.loopexit:                                 ; preds = %for.body<br>
  %add.lcssa = phi i32 [ %add, %for.body ]<br>
  br label %for.end<br>
<br>
for.end:                                          ; preds =<br>
%for.end.loopexit, %if.end<br>
  %sum.0.lcssa = phi i32 [ undef, %if.end ], [ %add.lcssa, %for.end.loopexit ]<br>
  ret i32 %sum.0.lcssa<br>
}<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div><br></div>