|  | // RUN: %clang_cc1 %s -std=c++14 -emit-llvm -o - -triple=x86_64-linux-gnu | FileCheck %s | 
|  |  | 
|  | struct AM { | 
|  | int f1, f2; | 
|  | }; | 
|  | alignas(8) AM m; | 
|  | AM load1() { | 
|  | AM am; | 
|  | // m is declared to align to 8bytes, so generate load atomic instead | 
|  | // of libcall. | 
|  | // CHECK-LABEL: @_Z5load1v | 
|  | // CHECK: load atomic {{.*}} monotonic, align 8 | 
|  | __atomic_load(&m, &am, 0); | 
|  | return am; | 
|  | } | 
|  |  | 
|  | struct BM { | 
|  | int f1; | 
|  | alignas(8) AM f2; | 
|  | }; | 
|  | BM bm; | 
|  | AM load2() { | 
|  | AM am; | 
|  | // BM::f2 is declared to align to 8bytes, so generate load atomic instead | 
|  | // of libcall. | 
|  | // CHECK-LABEL: @_Z5load2v | 
|  | // CHECK: load atomic {{.*}} monotonic, align 8 | 
|  | __atomic_load(&bm.f2, &am, 0); | 
|  | return am; | 
|  | } | 
|  |  | 
|  | namespace std { | 
|  | template <class _Tp> | 
|  | inline constexpr | 
|  | __attribute__ ((__visibility__("hidden"), __internal_linkage__)) | 
|  | _Tp* __addressof(_Tp& __x) noexcept | 
|  | { | 
|  | return __builtin_addressof(__x); | 
|  | } | 
|  | } | 
|  |  | 
|  | AM load3() { | 
|  | AM am; | 
|  | // m is declared to align to 8bytes, so generate load atomic instead | 
|  | // of libcall. | 
|  | // CHECK-LABEL: @_Z5load3v | 
|  | // CHECK: load atomic {{.*}} monotonic, align 8 | 
|  | __atomic_load(std::__addressof(m), &am, 0); | 
|  | return am; | 
|  | } |