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; 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; 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__)) 36 _Tp* __addressof(_Tp& __x) noexcept 37 { 38 return __builtin_addressof(__x); 39 } 40 } 41 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