88 lines · c
1// RUN: %clang_cc1 -triple i386-pc-win32 -fms-extensions -emit-llvm -fms-volatile -o - < %s | FileCheck %s2struct 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: @test120 // CHECK: load atomic volatile {{.*}} acquire, align 421 // CHECK: store atomic volatile {{.*}}, {{.*}} release, align 422}23void test2(volatile int *p, volatile int *q) {24 *p = *q;25 // CHECK-LABEL: @test226 // CHECK: load atomic volatile {{.*}} acquire, align 427 // CHECK: store atomic volatile {{.*}}, {{.*}} release, align 428}29void test3(struct foo *p, struct foo *q) {30 p->x = q->x;31 // CHECK-LABEL: @test332 // CHECK: load atomic volatile {{.*}} acquire, align 433 // CHECK: store atomic volatile {{.*}}, {{.*}} release, align 434}35void test4(volatile struct foo *p, volatile struct foo *q) {36 p->x = q->x;37 // CHECK-LABEL: @test438 // CHECK: load atomic volatile {{.*}} acquire, align 439 // CHECK: store atomic volatile {{.*}}, {{.*}} release, align 440}41void test5(volatile struct foo *p, volatile struct foo *q) {42 *p = *q;43 // CHECK-LABEL: @test544 // CHECK: load atomic volatile {{.*}} acquire, align 445 // CHECK: store atomic volatile {{.*}}, {{.*}} release, align 446}47void test6(struct bar *p, struct bar *q) {48 *p = *q;49 // CHECK-LABEL: @test650 // 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: @test756 // CHECK: load atomic volatile {{.*}} acquire, align 457 // CHECK: store atomic volatile {{.*}}, {{.*}} release, align 458}59void test8(volatile double *p, volatile double *q) {60 *p = *q;61 // CHECK-LABEL: @test862 // CHECK: load volatile {{.*}}, align 863 // CHECK: store volatile {{.*}}, {{.*}}, align 864}65void test9(volatile baz *p, baz *q) {66 *p = *q;67 // CHECK-LABEL: @test968 // CHECK: store volatile {{.*}}, {{.*}}, align 869 // CHECK: store volatile {{.*}}, {{.*}}, align 470}71void test10(volatile long long *p, volatile long long *q) {72 *p = *q;73 // CHECK-LABEL: @test1074 // CHECK: load volatile {{.*}}, align 875 // CHECK: store volatile {{.*}}, {{.*}}, align 876}77void test11(volatile float *p, volatile float *q) {78 *p = *q;79 // CHECK-LABEL: @test1180 // CHECK: load atomic volatile {{.*}} acquire, align 481 // CHECK: store atomic volatile {{.*}}, {{.*}} release, align 482}83int test12(struct qux *p) {84 return p->f;85 // CHECK-LABEL: @test1286 // CHECK: load volatile {{.*}}, align 187}88