[llvm-dev] Aliasing rules difference between GCC and Clang

Ivan Kosarev via llvm-dev llvm-dev at lists.llvm.org
Wed Jan 30 06:35:53 PST 2019


Ah, you are right. Apologies, I was under impression that the patch 
enabling the support for member arrays is already there, but apparently 
it's not. OK, I'm going to re-visit things and see how much work it is, 
and then will eventually put the changes on review. Will let you know. 
Thanks and sorry for the confusion.


On 29/01/2019 14:19, Jonas Paulsson wrote:
> CAUTION: This email originated from outside of the organization. Do 
> not click links or open attachments unless you recognize the sender 
> and know the content is safe.  If you suspect potential phishing or 
> spam email, report it to ReportSpam at accesssoftek.com
>
> Hi Ivan,
>
>>
>> I see. In that case I think you could just give the new TBAA a try by
>> adding the cc1's  -new-struct-path-tbaa option and seeing if it does
>> what you need.
>
> Unfortunately, it seems that the type DAG does not get any new
> base-nodes for the struct types. The only difference I can see is that
> there seems to be a size-field in the TBAA nodes as well now. So it
> seems that the two struct types still are may-alias...
>
> I supposed I need to pass -new-struct-path-tbaa to all the -cc1
> invocations, so I first ran clang with -save-temps -v, and then reran
> all of them while adding the option as well. Did I do something wrong or
> miss anything?
>
> /Jonas
>
> Program:
>
> typedef struct {
>    double c[3][3];
> } MATRIX_TY;
>
> typedef struct {
>    double c[3];
> } VECTOR_TY;
>
> double e = 0.0;
> MATRIX_TY *s;
> VECTOR_TY *v;
> int g = 0;
> void h() {
>    int i = e;
>    s->c[0][i] = g;
>    v->c[0] = g;
>    g = e;
> }
>
> Current/normal type DAG:
>
> !2 = !{!3, !3, i64 0}
> !3 = !{!"double", !4, i64 0}
> !4 = !{!"omnipotent char", !5, i64 0}
> !5 = !{!"Simple C/C++ TBAA"}
> !6 = !{!7, !7, i64 0}
> !7 = !{!"int", !4, i64 0}
> !8 = !{!9, !9, i64 0}
> !9 = !{!"any pointer", !4, i64 0}
>
> Extended/size aware type DAG (with -new-struct-path-tbaa):
>
> !2 = !{!3, !3, i64 0, i64 8}
> !3 = !{!4, i64 8, !"double"}
> !4 = !{!5, i64 1, !"omnipotent char"}
> !5 = !{!"Simple C/C++ TBAA"}
> !6 = !{!7, !7, i64 0, i64 4}
> !7 = !{!4, i64 4, !"int"}
> !8 = !{!9, !9, i64 0, i64 8}
> !9 = !{!4, i64 8, !"any pointer"}
>
>



More information about the llvm-dev mailing list