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