1 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fms-extensions -emit-llvm < %s | FileCheck %s
8 // CHECK: {{%.*}} = load i32, ptr @x, align 1
9 // CHECK: store i32 {{%.*}}, ptr @x, align 1
14 // CHECK: %y = alloca i32, align 1
15 // CHECK: {{%.*}} = load i32, ptr %y, align 1
16 // CHECK: store i32 {{%.*}}, ptr %y, align 1
22 // CHECK: %y = alloca i32, align 1
23 // CHECK: store i32 1, ptr %y, align 1
24 __unaligned
int y
= 1;
33 // CHECK: {{%.*}} = load ptr, ptr @p1, align 1
34 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 4
35 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 4
41 // CHECK: {{%.*}} = load ptr, ptr @p2, align 8
42 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1
43 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1
47 int __unaligned
*__unaligned p3
;
49 // CHECK: {{%.*}} = load ptr, ptr @p3, align 1
50 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1
51 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1
59 // CHECK: %lp1 = alloca ptr, align 1
60 // CHECK: {{%.*}} = load ptr, ptr %lp1, align 1
61 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 4
62 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 4
68 // CHECK: %lp2 = alloca ptr, align 8
69 // CHECK: {{%.*}} = load ptr, ptr %lp2, align 8
70 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1
71 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1
77 // CHECK: %lp3 = alloca ptr, align 1
78 // CHECK: {{%.*}} = load ptr, ptr %lp3, align 1
79 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1
80 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1
81 int __unaligned
*__unaligned lp3
;
88 __unaligned
int a
[10];
90 // CHECK: {{%.*}} = load i32, ptr getelementptr inbounds ([10 x i32], ptr @a, i64 0, i64 3), align 1
91 // CHECK: store i32 {{%.*}}, ptr getelementptr inbounds ([10 x i32], ptr @a, i64 0, i64 3), align 1
99 // CHECK: %la = alloca [10 x i32], align 1
100 // CHECK: {{%.*}} = getelementptr inbounds [10 x i32], ptr %la, i64 0, i64 3
101 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1
102 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1
103 __unaligned
int la
[10];
111 typedef __unaligned
int UnalignedInt
;
113 // CHECK: %i = alloca i32, align 1
114 // CHECK: {{%.*}} = load i32, ptr %i, align 1
115 // CHECK: store i32 {{%.*}}, ptr %i, align 1
121 typedef __unaligned Aligned UnalignedInt2
;
123 // CHECK: %i = alloca i32, align 1
124 // CHECK: {{%.*}} = load i32, ptr %i, align 1
125 // CHECK: store i32 {{%.*}}, ptr %i, align 1
130 typedef UnalignedInt UnalignedInt3
;
132 // CHECK: %i = alloca i32, align 1
133 // CHECK: {{%.*}} = load i32, ptr %i, align 1
134 // CHECK: store i32 {{%.*}}, ptr %i, align 1
142 void test16(__unaligned
int c
[10]) {
143 // CHECK: {{%.*}} = alloca ptr, align 8
144 // CHECK: store ptr %c, ptr {{%.*}}, align 8
145 // CHECK: {{%.*}} = load ptr, ptr {{%.*}}, align 8
146 // CHECK: {{%.*}} = getelementptr inbounds i32, ptr {{%.*}}, i64 3
147 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1
148 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1
157 return __alignof__(__unaligned
int);
163 return __alignof__(a
);
168 __unaligned
int a
[10];
169 return __alignof__(a
);
183 // CHECK: {{%.*}} = load i32, ptr getelementptr inbounds nuw (%struct.S1, ptr @s1, i32 0, i32 1), align 1
184 // CHECK: store i32 {{%.*}}, ptr getelementptr inbounds nuw (%struct.S1, ptr @s1, i32 0, i32 1), align 1
189 // CHECK: {{%.*}} = alloca %struct.S1, align 1
190 // CHECK: {{%.*}} = getelementptr inbounds nuw %struct.S1, ptr {{%.*}}, i32 0, i32 1
191 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1
192 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1
198 struct __attribute__((packed
)) S2
{
205 // CHECK: {{%.*}} = load i32, ptr getelementptr inbounds nuw (%struct.S2, ptr @s2, i32 0, i32 1), align 1
206 // CHECK: store i32 {{%.*}}, ptr getelementptr inbounds nuw (%struct.S2, ptr @s2, i32 0, i32 1), align 1
211 // CHECK: {{%.*}} = alloca %struct.S2, align 1
212 // CHECK: {{%.*}} = getelementptr inbounds nuw %struct.S2, ptr {{%.*}}, i32 0, i32 1
213 // CHECK: {{%.*}} = load i32, ptr {{%.*}}, align 1
214 // CHECK: store i32 {{%.*}}, ptr {{%.*}}, align 1