51 lines · cpp
1// RUN: %clang_cc1 %s -std=c++14 -emit-llvm -o - -triple=x86_64-linux-gnu | FileCheck %s2 3struct AM {4 int f1, f2;5};6alignas(8) AM m;7AM load1() {8 AM am;9 // m is declared to align to 8bytes, so generate load atomic instead10 // of libcall.11 // CHECK-LABEL: @_Z5load1v12 // CHECK: load atomic {{.*}} monotonic, align 813 __atomic_load(&m, &am, 0);14 return am;15}16 17struct BM {18 int f1;19 alignas(8) AM f2;20};21BM bm;22AM load2() {23 AM am;24 // BM::f2 is declared to align to 8bytes, so generate load atomic instead25 // of libcall.26 // CHECK-LABEL: @_Z5load2v27 // CHECK: load atomic {{.*}} monotonic, align 828 __atomic_load(&bm.f2, &am, 0);29 return am;30}31 32namespace std {33 template <class _Tp>34 inline constexpr35 __attribute__ ((__visibility__("hidden"), __internal_linkage__))36 _Tp* __addressof(_Tp& __x) noexcept37 {38 return __builtin_addressof(__x);39 }40}41 42AM load3() {43 AM am;44 // m is declared to align to 8bytes, so generate load atomic instead45 // of libcall.46 // CHECK-LABEL: @_Z5load3v47 // CHECK: load atomic {{.*}} monotonic, align 848 __atomic_load(std::__addressof(m), &am, 0);49 return am;50}51