[cfe-dev] [LLVMdev] For alias analysis, It's gcc too aggressive or LLVM need to improve?

Daniel Berlin dannyb at google.com
Tue Aug 12 08:55:57 PDT 2014


On Tue, Aug 12, 2014 at 8:55 AM, Daniel Berlin <dannyb at google.com> wrote:

>
>
>
> On Mon, Aug 11, 2014 at 11:44 PM, Kevin Qin <kevinqindev at gmail.com> wrote:
>
>> Hi all,
>>
>> Thanks for you paying time to look at this issue. I'm not an expert for
>> C/C++ language, so I can just post some experiment results from LLVM and
>> GCC.
>>
>> If we make minor changes to the test, gcc may give different results.
>>
>> #include <stdio.h>
>> struct heap {int index; int b;};
>> struct heap **ptr;
>> int aa;
>>
>> int main() {
>>   struct heap element;
>>   struct heap *array[2];
>>   array[0] = (struct heap *)&aa;
>>   array[1] = &element;
>>   ptr = array;
>>   aa = 1;
>>   int i;
>>   for (i =0; i< 2; i++) {
>>     printf("i is %d, aa is %d\n", i, aa);
>>     array[i]->index = 0;  // we replace ptr to array here. so no global
>> lvalue is used.
>>   }
>>   return 0;
>> }
>>
>> Result didn't get changed,
>>
>> $gcc test.c -O0
>> $./a.out
>> i is 0, aa is 1
>> i is 1, aa is 0
>>
>> $gcc test.c -O2
>> $./a.out
>> i is 0, aa is 1
>> i is 1, aa is 1
>>
>> But if we change a bit more, like
>>
>> #include <stdio.h>
>> struct heap {int index; int b;};
>> struct heap **ptr;
>> int aa;
>>
>> int main() {
>>   struct heap element;
>>    struct heap *array[2];
>>   array[0] = (struct heap *)&aa;
>>   array[1] = &element;
>>   //ptr = array; // remove this assignment as well.
>>   aa = 1;
>>   int i;
>>   for (i =0; i< 2; i++) {
>>     printf("i is %d, aa is %d\n", i, aa);
>>     array[i]->index = 0;  // we replace ptr to array here. so no global
>> lvalue is used.
>>   }
>>   return 0;
>> }
>>
>> Result changed to be the same as LLVM.
>>
>> $gcc test.c -O0
>> $./a.out
>> i is 0, aa is 1
>> i is 1, aa is 0
>>
>> $gcc test.c -O2
>> $./a.out
>> i is 0, aa is 1
>> i is 1, aa is 0
>>
>> I don't know why a assignement statment to a unrelated global pointer
>> will affect gcc's aliasing work,
>>
>
> Because it blocks the load elimination/copy propagation.  With that
> pointer assignment there, GCC sees it as a global aliasing the same memory
> location as the array, and that global escapes the function.  Because of
> that, it no longer believes it knows what happens to the memory once the
> printf call happens (since it's really a call to printf_chk, and because of
> the way glibc works, printf is not a readonly functiojn)
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140812/6c62250f/attachment.html>


More information about the cfe-dev mailing list