1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 %s -emit-llvm -O1 -o - -triple=i686-apple-darwin9 -std=c++11 | FileCheck %s 2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 30e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-DAG: @PR22043 = global i32 0, align 4 40e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef _Atomic(int) AtomicInt; 50e2c34f92f00628d48968dfea096d36381f494cbStephen HinesAtomicInt PR22043 = AtomicInt(); 60e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-DAG: @_ZN7PR180978constant1aE = global { i16, i8 } { i16 1, i8 6 }, align 4 8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-DAG: @_ZN7PR180978constant1bE = global { i16, i8 } { i16 2, i8 6 }, align 4 9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-DAG: @_ZN7PR180978constant1cE = global { i16, i8 } { i16 3, i8 6 }, align 4 10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-DAG: @_ZN7PR180978constant1yE = global { { i16, i8 }, i32 } { { i16, i8 } { i16 4, i8 6 }, i32 5 }, align 4 11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 123a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnallstruct A { 133a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnall _Atomic(int) i; 143a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnall A(int j); 153a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnall void v(int j); 163a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnall}; 173a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnall// Storing to atomic values should be atomic 183a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnall// CHECK: store atomic i32 193a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnallvoid A::v(int j) { i = j; } 203a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnall// Initialising atomic values should not be atomic 213a3c9b26ded46cb9055564adb2f48911eef84aceDavid Chisnall// CHECK-NOT: store atomic 223a3c9b26ded46cb9055564adb2f48911eef84aceDavid ChisnallA::A(int j) : i(j) {} 235d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnall 245d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnallstruct B { 255d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnall int i; 265d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnall B(int x) : i(x) {} 275d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnall}; 285d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnall 295d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnall_Atomic(B) b; 305d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnall 3193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z11atomic_initR1Ai 325d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnallvoid atomic_init(A& a, int i) { 335d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnall // CHECK-NOT: atomic 3447bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor // CHECK: tail call void @_ZN1BC1Ei 35944b5623c3e658f5ceabf1349cdb7371cb2387bbRichard Smith __c11_atomic_init(&b, B(i)); 3647bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor // CHECK-NEXT: ret void 375d70cfddc8a8a450d1425e190f10512a51352e5dDavid Chisnall} 3847bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor 3993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z16atomic_init_boolPU7_Atomicbb 4047bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregorvoid atomic_init_bool(_Atomic(bool) *ab, bool b) { 4147bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor // CHECK-NOT: atomic 4247bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor // CHECK: {{zext i1.*to i8}} 4347bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor // CHECK-NEXT: store i8 4447bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor __c11_atomic_init(ab, b); 4547bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor // CHECK-NEXT: ret void 4647bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor} 4747bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor 4847bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregorstruct AtomicBoolMember { 4947bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor _Atomic(bool) ab; 5047bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor AtomicBoolMember(bool b); 5147bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor}; 5247bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor 5393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN16AtomicBoolMemberC2Eb 5447bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor// CHECK: {{zext i1.*to i8}} 5547bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor// CHECK-NEXT: store i8 5647bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor// CHECK-NEXT: ret void 5747bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas GregorAtomicBoolMember::AtomicBoolMember(bool b) : ab(b) { } 5847bfcca2d6972d98a1b25239cd1aa658b60680e2Douglas Gregor 59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace PR18097 { 60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines namespace dynamic { 61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct X { 62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines X(int); 63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines short n; 64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines char c; 65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @__cxx_global_var_init 68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @_ZN7PR180977dynamic1XC1Ei({{.*}}* @_ZN7PR180977dynamic1aE, i32 1) 69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(X) a = X(1); 70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @__cxx_global_var_init 72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @_ZN7PR180977dynamic1XC1Ei({{.*}}* @_ZN7PR180977dynamic1bE, i32 2) 73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(X) b(X(2)); 74176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @__cxx_global_var_init 76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @_ZN7PR180977dynamic1XC1Ei({{.*}}* @_ZN7PR180977dynamic1cE, i32 3) 77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(X) c{X(3)}; 78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct Y { 80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(X) a; 81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(int) b; 82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @__cxx_global_var_init 843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: call void @_ZN7PR180977dynamic1XC1Ei({{.*}}* getelementptr inbounds ({{.*}}, {{.*}}* @_ZN7PR180977dynamic1yE, i32 0, i32 0), i32 4) 853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i32 5, i32* getelementptr inbounds ({{.*}}, {{.*}}* @_ZN7PR180977dynamic1yE, i32 0, i32 1) 86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Y y = { X(4), 5 }; 87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECKs at top of file. 90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines namespace constant { 91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct X { 92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines constexpr X(int n) : n(n) {} 93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines short n; 94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines char c = 6; 95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 96176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(X) a = X(1); 97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(X) b(X(2)); 98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(X) c{X(3)}; 99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct Y { 101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(X) a; 102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines _Atomic(int) b; 103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Y y = { X(4), 5 }; 105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 107