brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.1 KiB · f6e478e Raw
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