[LLVMbugs] [Bug 11331] New: alias analysis problem in LICM

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Nov 7 22:00:03 PST 2011


             Bug #: 11331
           Summary: alias analysis problem in LICM
           Product: new-bugs
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: ggan at codeaurora.org
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

I met an alias analysis problem in LICM phase. I am using the following piece
of code to present this problem. You can compile it after removing the heading
line numbers. The compilation flag is "-O3 -funroll-loops"

     1 int size;
     2 int ** AAA;
     3 void * xalloc(int);
     5 void foo(void)
     6 {
     7   int i;
     8   AAA = (int**) xalloc(size * sizeof(int*));
    10   for (i=0; i<size; i++)
    11     AAA[i] = 0;
    12 }

This code tries to initialize an array of pointers. The array is allocated from
heap. "AAA" points to the beginning of the array and it is a global variable.

I got the following IR dump after LICM:

   82 *** IR Dump After Loop Invariant Code Motion ***
   83 for.body:                       ; preds = %for.body.lr.ph, %for.body
   84   %i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
   85   %4 = load i32*** @AAA, align 4, !tbaa !3
   86   %arrayidx = getelementptr inbounds i32** %4, i32 %i.02
   87   store i32* null, i32** %arrayidx, align 4, !tbaa !3
   88   %inc = add nsw i32 %i.02, 1
   89   %cmp = icmp slt i32 %inc, %3
   90   br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge

I was expecting that line 85, i.e. "%4 = load i32*** @AAA", could be treated as
loop invariant code and be moved out of the loop body. However, it didn't. The
reason is that, LLVM thinks pointer "@AAA" would alias pointer "&AAA[i]". I
found GCC can move this load out of the loop body.

Then I went to read the current LLVM (v2.9) alias analysis code, i.e. BasicAA
and TBAA. I found that TBAA does not differentiate pointers. Any pointer will
given the same tbaa meta-data named "any pointer". After reading the TBAA code,
I believe that it is very difficult to solve my problem in the current TBAA
alias analysis framework. I'm expecting a better implementation of the alias
analysis algorithm in LLVM.

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list