[PATCH] More precise aliasing for char arrays

suyog sarda sardask01 at gmail.com
Thu Jun 26 04:53:21 PDT 2014


This might be similar to bug 16236.

See discussion related to same in below link :

http://comments.gmane.org/gmane.comp.compilers.llvm.cvs/183071


-- 
With regards,
Suyog Sarda


On Thu, Jun 26, 2014 at 4:40 PM, Richard Smith <richard at metafoo.co.uk>
wrote:

> On Wed, Jun 25, 2014 at 7:34 PM, Arthur O'Dwyer <arthur.j.odwyer at gmail.com
> > wrote:
>
>> On Wed, Jun 25, 2014 at 3:26 PM, Sanjin Sijaric <ssijaric at codeaurora.org>
>> wrote:
>> >
>> >>     int *p;
>> >>     typedef struct {
>> >>       char a;
>> >>       char b[100];
>> >>       char c;
>> >>     } S;
>> >>
>> >>     S x;
>> >>
>> >>     void func1 (char d) {
>> >>       for (int i = 0; i < 100; i++) {
>> >>         x.b[i] += 1;
>> >>         d = *p;
>> >>         x.a += d;
>> >>       }
>> >>     }
>> >>
>> >> It seems like you want the compiler to hoist the read of `*p` above
>> the write to `x.b[i]`.
>> >> But that isn't generally possible, is it? because the caller might
>> have executed
>> >>
>> >>    p = &x.b[3];
>> >>
>> >> before the call to func1.
>> >
>> > Here, "p" is a pointer to int, whereas b is a char array.  Wouldn't "p
>> = &x.b[3];" break ansi aliasing rules?
>>
>> I was under the impression that that was the entire point of "omnipotent
>> char"!
>>
>
> I think that's backwards from the intent: if you swap over 'int' and
> 'char' in the example, we cannot do the reordering, because p could point
> to (some byte of) one of the ints.
>
> With the test as-is, we *can* reorder the *p load (and even move it out of
> the loop):
>   -- *p cannot alias x.b[i], because if 'x.b[i] += 1' has defined
> behavior, then x is an object of type S and x.b is an object of type
> char[100] and 0 <= i < 100, and therefore there is no int object aliased by
> that store
>   -- *p cannot alias x.a, because if 'x.a += d' has defined behavior, then
> x is an object of type S, so a store to S::a cannot alias any int object.
>
> I think this kind of analysis should probably be covered by
> -fstruct-path-tbaa, not enabled by default, though. (I'm a little surprised
> that -fstruct-path-tbaa doesn't get this right today...)
>
> See lines 106-108 in the very file you're changing:
>>
>> 00106     // Character types are special and can alias anything.
>> 00107     // In C++, this technically only includes "char" and "unsigned
>> char",
>> 00108     // and not "signed char". In C, it includes all three. For now,
>> 00109     // the risk of exploiting this detail in C++ seems likely to
>> outweigh
>> 00110     // the benefit.
>>
>> Source: http://clang.llvm.org/doxygen/CodeGenTBAA_8cpp_source.html
>>
>> -Arthur
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140626/14858ea1/attachment.html>


More information about the cfe-commits mailing list