1 // RUN: %clang_cc1 %s -std=c++14 -emit-llvm -o - -triple=x86_64-linux-gnu | FileCheck %s
2
3 struct AM {
4 int f1, f2;
5 };
6 alignas(8) AM m;
load1()7 AM load1() {
8 AM am;
9 // m is declared to align to 8bytes, so generate load atomic instead
10 // of libcall.
11 // CHECK-LABEL: @_Z5load1v
12 // CHECK: load atomic {{.*}} monotonic, align 8
13 __atomic_load(&m, &am, 0);
14 return am;
15 }
16
17 struct BM {
18 int f1;
19 alignas(8) AM f2;
20 };
21 BM bm;
load2()22 AM load2() {
23 AM am;
24 // BM::f2 is declared to align to 8bytes, so generate load atomic instead
25 // of libcall.
26 // CHECK-LABEL: @_Z5load2v
27 // CHECK: load atomic {{.*}} monotonic, align 8
28 __atomic_load(&bm.f2, &am, 0);
29 return am;
30 }
31
32 namespace std {
33 template <class _Tp>
34 inline constexpr
35 __attribute__ ((__visibility__("hidden"), __internal_linkage__))
__addressof(_Tp & __x)36 _Tp* __addressof(_Tp& __x) noexcept
37 {
38 return __builtin_addressof(__x);
39 }
40 }
41
load3()42 AM load3() {
43 AM am;
44 // m is declared to align to 8bytes, so generate load atomic instead
45 // of libcall.
46 // CHECK-LABEL: @_Z5load3v
47 // CHECK: load atomic {{.*}} monotonic, align 8
48 __atomic_load(std::__addressof(m), &am, 0);
49 return am;
50 }
51