1d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// RUN: %clang_cc1 -triple x86_64-unk-unk -emit-llvm -Os -o %t %s 2d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// RUN: FileCheck < %t %s 3d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 4d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarstruct s0 { 5d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int x[2] __attribute__((packed)); 6d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar}; 7d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 8d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarstruct s1 { 9d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int x[2] __attribute__((packed)); 10d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int y; 11d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int z __attribute__((packed)); 12d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar}; 13d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 14d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarstruct s2 { 15d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int x[2] __attribute__((packed)); 16d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int y __attribute__((packed)); 17d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int z __attribute__((packed)); 18d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar}; 19d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 20d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarstruct __attribute__((packed)) s3 { 21d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int x[2]; 22d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int y; 23d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar unsigned int z; 24d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar}; 25d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 26d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align0 = global i32 1 27d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align0 = __alignof(struct s0); 28d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align1 = global i32 4 29d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align1 = __alignof(struct s1); 30d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align2 = global i32 1 31d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align2 = __alignof(struct s2); 32d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align3 = global i32 1 33d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align3 = __alignof(struct s3); 34d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 35d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align0_x = global i32 1 36d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align0_x = __alignof(((struct s0*) 0)->x); 37d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// 3878a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian// CHECK: @align1_x = global i32 1 39d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align1_x = __alignof(((struct s1*) 0)->x); 40d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align2_x = global i32 1 41d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align2_x = __alignof(((struct s2*) 0)->x); 42d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align3_x = global i32 1 43d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align3_x = __alignof(((struct s3*) 0)->x); 44d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 45d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align0_x0 = global i32 4 46d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align0_x0 = __alignof(((struct s0*) 0)->x[0]); 47d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align1_x0 = global i32 4 48d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align1_x0 = __alignof(((struct s1*) 0)->x[0]); 49d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align2_x0 = global i32 4 50d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align2_x0 = __alignof(((struct s2*) 0)->x[0]); 51d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: @align3_x0 = global i32 4 52d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint align3_x0 = __alignof(((struct s3*) 0)->x[0]); 53d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 54d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f0_a 55d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 1 56d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 57d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f0_b 58d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 4 59d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 60d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f0_a(struct s0 *a) { 61d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->x[1]; 62d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 63d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f0_b(struct s0 *a) { 64d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return *(a->x + 1); 65d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 66d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 6778a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian// Note that we are incompatible with GCC on this example. 6878a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian// 69d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f1_a 7078a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian// CHECK: load i32* %{{.*}}, align 1 71d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 72d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f1_b 73d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 4 74d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 75d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 7678a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian// Note that we are incompatible with GCC on this example. 77d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// 78d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f1_c 79d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 4 80d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 81d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f1_d 8278a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian// CHECK: load i32* %{{.*}}, align 1 83d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 84d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f1_a(struct s1 *a) { 85d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->x[1]; 86d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 87d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f1_b(struct s1 *a) { 88d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return *(a->x + 1); 89d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 90d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f1_c(struct s1 *a) { 91d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->y; 92d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 93d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f1_d(struct s1 *a) { 94d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->z; 95d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 96d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 97d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f2_a 98d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 1 99d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 100d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f2_b 101d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 4 102d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 103d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f2_c 104d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 1 105d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 106d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f2_d 107d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 1 108d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 109d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f2_a(struct s2 *a) { 110d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->x[1]; 111d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 112d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f2_b(struct s2 *a) { 113d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return *(a->x + 1); 114d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 115d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f2_c(struct s2 *a) { 116d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->y; 117d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 118d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f2_d(struct s2 *a) { 119d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->z; 120d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 121d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 122d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f3_a 123d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 1 124d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 125d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f3_b 126d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 4 127d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 128d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f3_c 129d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 1 130d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 131d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define i32 @f3_d 132d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load i32* %{{.*}}, align 1 133d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 134d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f3_a(struct s3 *a) { 135d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->x[1]; 136d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 137d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f3_b(struct s3 *a) { 138d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return *(a->x + 1); 139d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 140d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f3_c(struct s3 *a) { 141d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->y; 142d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 143d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarint f3_d(struct s3 *a) { 144d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return a->z; 145d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 146d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar 147d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// Verify we don't claim things are overaligned. 148d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// 149d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: define double @f4 150d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: load double* {{.*}}, align 8 151d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar// CHECK: } 152d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbarextern double g4[5] __attribute__((aligned(16))); 153d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbardouble f4() { 154d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar return g4[1]; 155d553408ff15b38710a1ba0947efbf4c5637018abDaniel Dunbar} 156