1// RUN: %clang_cc1 -triple i386-pc-win32 -fms-extensions -emit-llvm -fms-volatile -o - < %s | FileCheck %s 2struct foo { 3 volatile int x; 4}; 5struct bar { 6 int x; 7}; 8typedef _Complex float __declspec(align(8)) baz; 9 10#pragma pack(push) 11#pragma pack(1) 12struct qux { 13 volatile int f; 14}; 15#pragma pack(pop) 16 17void 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} 23void 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} 29void 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} 35void 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} 41void 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} 47void 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} 53void 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} 59void test8(volatile double *p, volatile double *q) { 60 *p = *q; 61 // CHECK-LABEL: @test8 62 // CHECK: load volatile {{.*}} 63 // CHECK: store volatile {{.*}}, {{.*}} 64} 65void test9(volatile baz *p, baz *q) { 66 *p = *q; 67 // CHECK-LABEL: @test9 68 // CHECK: store volatile {{.*}}, {{.*}} 69 // CHECK: store volatile {{.*}}, {{.*}} 70} 71void 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} 77void 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} 83int test12(struct qux *p) { 84 return p->f; 85 // CHECK-LABEL: @test12 86 // CHECK: load volatile {{.*}} 87} 88