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