13a163318526e7bfaa6012b411934728e2954047eManman Ren// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -disable-llvm-optzns %s -emit-llvm -o - | FileCheck %s 23a163318526e7bfaa6012b411934728e2954047eManman Ren// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -struct-path-tbaa -disable-llvm-optzns %s -emit-llvm -o - | FileCheck %s -check-prefix=PATH 3b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// Test TBAA metadata generated by front-end. 4b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 5c80e0314cd2e1c5e6021aeac155b8a181a27e2e1Manman Rentypedef unsigned char uint8_t; 6c80e0314cd2e1c5e6021aeac155b8a181a27e2e1Manman Rentypedef unsigned short uint16_t; 7c80e0314cd2e1c5e6021aeac155b8a181a27e2e1Manman Rentypedef unsigned int uint32_t; 8c80e0314cd2e1c5e6021aeac155b8a181a27e2e1Manman Rentypedef unsigned long long uint64_t; 9b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct 10b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{ 11b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint16_t f16; 12b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint32_t f32; 13b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint16_t f16_2; 14b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint32_t f32_2; 15b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructA; 16b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct 17b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{ 18b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint16_t f16; 19b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren StructA a; 20b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint32_t f32; 21b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructB; 22b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct 23b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{ 24b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint16_t f16; 25b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren StructB b; 26b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint32_t f32; 27b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructC; 28b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct 29b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{ 30b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint16_t f16; 31b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren StructB b; 32b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint32_t f32; 33b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint8_t f8; 34b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructD; 35b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 36b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct 37b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{ 38b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint16_t f16; 39b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint32_t f32; 40b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructS; 41b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Rentypedef struct 42b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren{ 43b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint16_t f16; 44b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren uint32_t f32; 45b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} StructS2; 46b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 47b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g(uint32_t *s, StructA *A, uint64_t count) { 48b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 49eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32:!.*]] 50eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 51b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 52ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32:!.*]] 53ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32:!.*]] 54b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren *s = 1; 55b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren A->f32 = 4; 56b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return *s; 57b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 58b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 59b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g2(uint32_t *s, StructA *A, uint64_t count) { 60b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 61eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 62eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_i16:!.*]] 63b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 64ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 65ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_A_f16:!.*]] 66b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren *s = 1; 67b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren A->f16 = 4; 68b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return *s; 69b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 70b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 71b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g3(StructA *A, StructB *B, uint64_t count) { 72b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 73eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 74eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 75b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 76ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 77ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32:!.*]] 78b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren A->f32 = 1; 79b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren B->a.f32 = 4; 80b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return A->f32; 81b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 82b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 83b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g4(StructA *A, StructB *B, uint64_t count) { 84b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 85eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 86eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_i16]] 87b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 88ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 89ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_B_a_f16:!.*]] 90b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren A->f32 = 1; 91b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren B->a.f16 = 4; 92b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return A->f32; 93b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 94b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 95b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g5(StructA *A, StructB *B, uint64_t count) { 96b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 97eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 98eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 99b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 100ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 101ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_f32:!.*]] 102b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren A->f32 = 1; 103b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren B->f32 = 4; 104b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return A->f32; 105b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 106b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 107b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g6(StructA *A, StructB *B, uint64_t count) { 108b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 109eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 110eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 111b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 112ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 113ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32_2:!.*]] 114b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren A->f32 = 1; 115b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren B->a.f32_2 = 4; 116b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return A->f32; 117b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 118b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 119b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g7(StructA *A, StructS *S, uint64_t count) { 120b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 121eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 122eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 123b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 124ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 125ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32:!.*]] 126b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren A->f32 = 1; 127b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren S->f32 = 4; 128b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return A->f32; 129b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 130b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 131b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g8(StructA *A, StructS *S, uint64_t count) { 132b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 133eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 134eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_i16]] 135b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 136ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 137ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_S_f16:!.*]] 138b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren A->f32 = 1; 139b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren S->f16 = 4; 140b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return A->f32; 141b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 142b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 143b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g9(StructS *S, StructS2 *S2, uint64_t count) { 144b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 145eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 146eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 147b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 148ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32]] 149ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_S2_f32:!.*]] 150b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren S->f32 = 1; 151b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren S2->f32 = 4; 152b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return S->f32; 153b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 154b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 155b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g10(StructS *S, StructS2 *S2, uint64_t count) { 156b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 157eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 158eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_i16]] 159b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 160ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32]] 161ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa [[TAG_S2_f16:!.*]] 162b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren S->f32 = 1; 163b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren S2->f16 = 4; 164b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return S->f32; 165b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 166b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 167b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g11(StructC *C, StructD *D, uint64_t count) { 168b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 169eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 170eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 171b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 172ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_C_b_a_f32:!.*]] 173ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_D_b_a_f32:!.*]] 174b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren C->b.a.f32 = 1; 175b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren D->b.a.f32 = 4; 176b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return C->b.a.f32; 177b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 178b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 179b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Renuint32_t g12(StructC *C, StructD *D, uint64_t count) { 180b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// CHECK: define i32 @{{.*}}( 181eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 182eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 183b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// TODO: differentiate the two accesses. 184b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren// PATH: define i32 @{{.*}}( 185ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32]] 186ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32]] 187b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren StructB *b1 = &(C->b); 188b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren StructB *b2 = &(D->b); 189b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren // b1, b2 have different context. 190b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren b1->a.f32 = 1; 191b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren b2->a.f32 = 4; 192b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren return b1->a.f32; 193b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren} 194b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 195c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// Make sure that zero-length bitfield works. 196c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren#define ATTR __attribute__ ((ms_struct)) 197c7f2bfb4a2dcda757619356a28cb633711a6548cManman Renstruct five { 198c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren char a; 199c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren int :0; /* ignored; prior field is not a bitfield. */ 200c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren char b; 201c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren char c; 202c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren} ATTR; 203c7f2bfb4a2dcda757619356a28cb633711a6548cManman Renchar g13(struct five *a, struct five *b) { 204c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren return a->b; 205c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// CHECK: define signext i8 @{{.*}}( 206eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: load i8* %{{.*}}, align 1, !tbaa [[TAG_char:!.*]] 207c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: define signext i8 @{{.*}}( 208c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: load i8* %{{.*}}, align 1, !tbaa [[TAG_five_b:!.*]] 209c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren} 210c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren 211c7f2bfb4a2dcda757619356a28cb633711a6548cManman Renstruct six { 212c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren char a; 213c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren int :0; 214c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren char b; 215c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren char c; 216c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren}; 217c7f2bfb4a2dcda757619356a28cb633711a6548cManman Renchar g14(struct six *a, struct six *b) { 218c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// CHECK: define signext i8 @{{.*}}( 219eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: load i8* %{{.*}}, align 1, !tbaa [[TAG_char]] 220c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: define signext i8 @{{.*}}( 221c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: load i8* %{{.*}}, align 1, !tbaa [[TAG_six_b:!.*]] 222c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren return a->b; 223c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren} 224c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren 225eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: [[TAG_char]] = metadata !{metadata !"omnipotent char", metadata [[TAG_cxx_tbaa:!.*]]} 226eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: [[TAG_cxx_tbaa]] = metadata !{metadata !"Simple C/C++ TBAA"} 227eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: [[TAG_i32]] = metadata !{metadata !"int", metadata [[TAG_char]]} 228eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// CHECK: [[TAG_i16]] = metadata !{metadata !"short", metadata [[TAG_char]]} 229b3cced996830b37a7bcf7ebca4ce4476f46abe24Manman Ren 230eb54d423d2e550324446c9d15fa2b2a92843cab5Richard Smith// PATH: [[TYPE_CHAR:!.*]] = metadata !{metadata !"omnipotent char", metadata 231ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_i32]] = metadata !{metadata [[TYPE_INT:!.*]], metadata [[TYPE_INT]], i64 0} 23250be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_INT]] = metadata !{metadata !"int", metadata [[TYPE_CHAR]] 233ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_A_f32]] = metadata !{metadata [[TYPE_A:!.*]], metadata [[TYPE_INT]], i64 4} 23450be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_A]] = metadata !{metadata !"_ZTS7StructA", metadata [[TYPE_SHORT:!.*]], i64 0, metadata [[TYPE_INT]], i64 4, metadata [[TYPE_SHORT]], i64 8, metadata [[TYPE_INT]], i64 12} 23550be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_SHORT:!.*]] = metadata !{metadata !"short", metadata [[TYPE_CHAR]] 236ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_A_f16]] = metadata !{metadata [[TYPE_A]], metadata [[TYPE_SHORT]], i64 0} 237ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_B_a_f32]] = metadata !{metadata [[TYPE_B:!.*]], metadata [[TYPE_INT]], i64 8} 23850be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_B]] = metadata !{metadata !"_ZTS7StructB", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_A]], i64 4, metadata [[TYPE_INT]], i64 20} 239ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_B_a_f16]] = metadata !{metadata [[TYPE_B]], metadata [[TYPE_SHORT]], i64 4} 240ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_B_f32]] = metadata !{metadata [[TYPE_B]], metadata [[TYPE_INT]], i64 20} 241ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_B_a_f32_2]] = metadata !{metadata [[TYPE_B]], metadata [[TYPE_INT]], i64 16} 242ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_S_f32]] = metadata !{metadata [[TYPE_S:!.*]], metadata [[TYPE_INT]], i64 4} 24350be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_S]] = metadata !{metadata !"_ZTS7StructS", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_INT]], i64 4} 244ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_S_f16]] = metadata !{metadata [[TYPE_S]], metadata [[TYPE_SHORT]], i64 0} 245ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_S2_f32]] = metadata !{metadata [[TYPE_S2:!.*]], metadata [[TYPE_INT]], i64 4} 24650be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_S2]] = metadata !{metadata !"_ZTS8StructS2", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_INT]], i64 4} 247ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_S2_f16]] = metadata !{metadata [[TYPE_S2]], metadata [[TYPE_SHORT]], i64 0} 248ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_C_b_a_f32]] = metadata !{metadata [[TYPE_C:!.*]], metadata [[TYPE_INT]], i64 12} 24950be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_C]] = metadata !{metadata !"_ZTS7StructC", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_B]], i64 4, metadata [[TYPE_INT]], i64 28} 250ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren// PATH: [[TAG_D_b_a_f32]] = metadata !{metadata [[TYPE_D:!.*]], metadata [[TYPE_INT]], i64 12} 25150be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_D]] = metadata !{metadata !"_ZTS7StructD", metadata [[TYPE_SHORT]], i64 0, metadata [[TYPE_B]], i64 4, metadata [[TYPE_INT]], i64 28, metadata [[TYPE_CHAR]], i64 32} 252c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: [[TAG_five_b]] = metadata !{metadata [[TYPE_five:!.*]], metadata [[TYPE_CHAR]], i64 1} 253cd06f26835033e879a9278941f4f6e6a4086976dEli Friedman// PATH: [[TYPE_five]] = metadata !{metadata !"_ZTS4five", metadata [[TYPE_CHAR]], i64 0, metadata [[TYPE_INT]], i64 1, metadata [[TYPE_CHAR]], i64 1, metadata [[TYPE_CHAR]], i64 2} 254c7f2bfb4a2dcda757619356a28cb633711a6548cManman Ren// PATH: [[TAG_six_b]] = metadata !{metadata [[TYPE_six:!.*]], metadata [[TYPE_CHAR]], i64 4} 25550be9041fcca4d77c09f120e720d75be703b6ea0Manman Ren// PATH: [[TYPE_six]] = metadata !{metadata !"_ZTS3six", metadata [[TYPE_CHAR]], i64 0, metadata [[TYPE_INT]], i64 4, metadata [[TYPE_CHAR]], i64 4, metadata [[TYPE_CHAR]], i64 5} 256