[llvm-dev] Aliasing rules difference between GCC and Clang (original) (raw)

Jonas Paulsson via llvm-dev llvm-dev at lists.llvm.org
Tue Jan 29 04:19:46 PST 2019


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