llvm-project/clang/test/CodeGen/ms-volatile.c
David Majnemer fc80b6e5d8 [MSVC Compat] Don't provide /volatile:ms semantics to types > pointer
Volatile loads of type wider than a pointer get split by MSVC because
the base x86 ISA doesn't provide loads which are wider than pointer
width.  LLVM assumes that it can emit an cmpxchg8b but this is
problematic if the memory is in a CONST memory segment.

Instead, provide behavior compatible with MSVC: split loads wider than a
pointer.

llvm-svn: 258506
2016-01-22 16:36:44 +00:00

75 lines
2.2 KiB
C

// RUN: %clang_cc1 -triple i386-pc-win32 -fms-extensions -emit-llvm -fms-volatile -o - < %s | FileCheck %s
struct foo {
volatile int x;
};
struct bar {
int x;
};
typedef _Complex float __declspec(align(8)) baz;
void test1(struct foo *p, struct foo *q) {
*p = *q;
// CHECK-LABEL: @test1
// CHECK: load atomic volatile {{.*}} acquire
// CHECK: store atomic volatile {{.*}}, {{.*}} release
}
void test2(volatile int *p, volatile int *q) {
*p = *q;
// CHECK-LABEL: @test2
// CHECK: load atomic volatile {{.*}} acquire
// CHECK: store atomic volatile {{.*}}, {{.*}} release
}
void test3(struct foo *p, struct foo *q) {
p->x = q->x;
// CHECK-LABEL: @test3
// CHECK: load atomic volatile {{.*}} acquire
// CHECK: store atomic volatile {{.*}}, {{.*}} release
}
void test4(volatile struct foo *p, volatile struct foo *q) {
p->x = q->x;
// CHECK-LABEL: @test4
// CHECK: load atomic volatile {{.*}} acquire
// CHECK: store atomic volatile {{.*}}, {{.*}} release
}
void test5(volatile struct foo *p, volatile struct foo *q) {
*p = *q;
// CHECK-LABEL: @test5
// CHECK: load atomic volatile {{.*}} acquire
// CHECK: store atomic volatile {{.*}}, {{.*}} release
}
void test6(struct bar *p, struct bar *q) {
*p = *q;
// CHECK-LABEL: @test6
// CHECK-NOT: load atomic volatile {{.*}}
// CHECK-NOT: store atomic volatile {{.*}}, {{.*}}
}
void test7(volatile struct bar *p, volatile struct bar *q) {
*p = *q;
// CHECK-LABEL: @test7
// CHECK: load atomic volatile {{.*}} acquire
// CHECK: store atomic volatile {{.*}}, {{.*}} release
}
void test8(volatile double *p, volatile double *q) {
*p = *q;
// CHECK-LABEL: @test8
// CHECK: load volatile {{.*}}
// CHECK: store volatile {{.*}}, {{.*}}
}
void test9(volatile baz *p, baz *q) {
*p = *q;
// CHECK-LABEL: @test9
// CHECK: store atomic volatile {{.*}}, {{.*}} release
}
void test10(volatile long long *p, volatile long long *q) {
*p = *q;
// CHECK-LABEL: @test10
// CHECK: load volatile {{.*}}
// CHECK: store volatile {{.*}}, {{.*}}
}
void test11(volatile float *p, volatile float *q) {
*p = *q;
// CHECK-LABEL: @test11
// CHECK: load atomic volatile {{.*}} acquire
// CHECK: store atomic volatile {{.*}}, {{.*}} release
}