James Y Knight 8043d5a964 NFC: update clang tests to check ordering and alignment for atomicrmw/cmpxchg.
The ability to specify alignment was recently added, and it's an
important property which we should ensure is set as expected by
Clang. (Especially before making further changes to Clang's code in
this area.) But, because it's on the end of the lines, the existing
tests all ignore it.

Therefore, update all the tests to also verify the expected alignment
for atomicrmw and cmpxchg. While I was in there, I also updated uses
of 'load atomic' and 'store atomic', and added the memory ordering,
where that was missing.
2021-02-11 17:35:09 -05:00

88 lines
2.6 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;
#pragma pack(push)
#pragma pack(1)
struct qux {
volatile int f;
};
#pragma pack(pop)
void test1(struct foo *p, struct foo *q) {
*p = *q;
// CHECK-LABEL: @test1
// CHECK: load atomic volatile {{.*}} acquire, align 4
// CHECK: store atomic volatile {{.*}}, {{.*}} release, align 4
}
void test2(volatile int *p, volatile int *q) {
*p = *q;
// CHECK-LABEL: @test2
// CHECK: load atomic volatile {{.*}} acquire, align 4
// CHECK: store atomic volatile {{.*}}, {{.*}} release, align 4
}
void test3(struct foo *p, struct foo *q) {
p->x = q->x;
// CHECK-LABEL: @test3
// CHECK: load atomic volatile {{.*}} acquire, align 4
// CHECK: store atomic volatile {{.*}}, {{.*}} release, align 4
}
void test4(volatile struct foo *p, volatile struct foo *q) {
p->x = q->x;
// CHECK-LABEL: @test4
// CHECK: load atomic volatile {{.*}} acquire, align 4
// CHECK: store atomic volatile {{.*}}, {{.*}} release, align 4
}
void test5(volatile struct foo *p, volatile struct foo *q) {
*p = *q;
// CHECK-LABEL: @test5
// CHECK: load atomic volatile {{.*}} acquire, align 4
// CHECK: store atomic volatile {{.*}}, {{.*}} release, align 4
}
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, align 4
// CHECK: store atomic volatile {{.*}}, {{.*}} release, align 4
}
void test8(volatile double *p, volatile double *q) {
*p = *q;
// CHECK-LABEL: @test8
// CHECK: load volatile {{.*}}, align 8
// CHECK: store volatile {{.*}}, {{.*}}, align 8
}
void test9(volatile baz *p, baz *q) {
*p = *q;
// CHECK-LABEL: @test9
// CHECK: store volatile {{.*}}, {{.*}}, align 8
// CHECK: store volatile {{.*}}, {{.*}}, align 4
}
void test10(volatile long long *p, volatile long long *q) {
*p = *q;
// CHECK-LABEL: @test10
// CHECK: load volatile {{.*}}, align 8
// CHECK: store volatile {{.*}}, {{.*}}, align 8
}
void test11(volatile float *p, volatile float *q) {
*p = *q;
// CHECK-LABEL: @test11
// CHECK: load atomic volatile {{.*}} acquire, align 4
// CHECK: store atomic volatile {{.*}}, {{.*}} release, align 4
}
int test12(struct qux *p) {
return p->f;
// CHECK-LABEL: @test12
// CHECK: load volatile {{.*}}, align 1
}