[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
- Previous message: [llvm-dev] Aliasing rules difference between GCC and Clang
- Next message: [llvm-dev] Aliasing rules difference between GCC and Clang
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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"}
- Previous message: [llvm-dev] Aliasing rules difference between GCC and Clang
- Next message: [llvm-dev] Aliasing rules difference between GCC and Clang
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]