1 // RUN: %clang_cc1 -triple i386-pc-win32 -fms-extensions -emit-llvm -fms-volatile -o - < %s | FileCheck %s
2 struct foo {
3   volatile int x;
4 };
5 struct bar {
6   int x;
7 };
8 typedef _Complex float __declspec(align(8)) baz;
9 
10 #pragma pack(push)
11 #pragma pack(1)
12 struct qux {
13    volatile int f;
14 };
15 #pragma pack(pop)
16 
17 void test1(struct foo *p, struct foo *q) {
18   *p = *q;
19   // CHECK-LABEL: @test1
20   // CHECK: load atomic volatile {{.*}} acquire
21   // CHECK: store atomic volatile {{.*}}, {{.*}} release
22 }
23 void test2(volatile int *p, volatile int *q) {
24   *p = *q;
25   // CHECK-LABEL: @test2
26   // CHECK: load atomic volatile {{.*}} acquire
27   // CHECK: store atomic volatile {{.*}}, {{.*}} release
28 }
29 void test3(struct foo *p, struct foo *q) {
30   p->x = q->x;
31   // CHECK-LABEL: @test3
32   // CHECK: load atomic volatile {{.*}} acquire
33   // CHECK: store atomic volatile {{.*}}, {{.*}} release
34 }
35 void test4(volatile struct foo *p, volatile struct foo *q) {
36   p->x = q->x;
37   // CHECK-LABEL: @test4
38   // CHECK: load atomic volatile {{.*}} acquire
39   // CHECK: store atomic volatile {{.*}}, {{.*}} release
40 }
41 void test5(volatile struct foo *p, volatile struct foo *q) {
42   *p = *q;
43   // CHECK-LABEL: @test5
44   // CHECK: load atomic volatile {{.*}} acquire
45   // CHECK: store atomic volatile {{.*}}, {{.*}} release
46 }
47 void test6(struct bar *p, struct bar *q) {
48   *p = *q;
49   // CHECK-LABEL: @test6
50   // CHECK-NOT: load atomic volatile {{.*}}
51   // CHECK-NOT: store atomic volatile {{.*}}, {{.*}}
52 }
53 void test7(volatile struct bar *p, volatile struct bar *q) {
54   *p = *q;
55   // CHECK-LABEL: @test7
56   // CHECK: load atomic volatile {{.*}} acquire
57   // CHECK: store atomic volatile {{.*}}, {{.*}} release
58 }
59 void test8(volatile double *p, volatile double *q) {
60   *p = *q;
61   // CHECK-LABEL: @test8
62   // CHECK: load volatile {{.*}}
63   // CHECK: store volatile {{.*}}, {{.*}}
64 }
65 void test9(volatile baz *p, baz *q) {
66   *p = *q;
67   // CHECK-LABEL: @test9
68   // CHECK: store volatile {{.*}}, {{.*}}
69   // CHECK: store volatile {{.*}}, {{.*}}
70 }
71 void test10(volatile long long *p, volatile long long *q) {
72   *p = *q;
73   // CHECK-LABEL: @test10
74   // CHECK: load volatile {{.*}}
75   // CHECK: store volatile {{.*}}, {{.*}}
76 }
77 void test11(volatile float *p, volatile float *q) {
78   *p = *q;
79   // CHECK-LABEL: @test11
80   // CHECK: load atomic volatile {{.*}} acquire
81   // CHECK: store atomic volatile {{.*}}, {{.*}} release
82 }
83 int test12(struct qux *p) {
84   return p->f;
85   // CHECK-LABEL: @test12
86   // CHECK: load volatile {{.*}}
87 }
88