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

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