13ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// XFAIL: hexagon 27a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s 30e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple mips-linux-gnu -emit-llvm %s -o - | FileCheck %s 47a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall 5860a319e62b0e256817a458396d191aa91c0787aEli Friedmanvoid foo(int x) 67a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall{ 77a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall _Atomic(int) i = 0; 8860a319e62b0e256817a458396d191aa91c0787aEli Friedman _Atomic(short) j = 0; 97a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall // Check that multiply / divides on atomics produce a cmpxchg loop 10860a319e62b0e256817a458396d191aa91c0787aEli Friedman i *= 2; 11860a319e62b0e256817a458396d191aa91c0787aEli Friedman // CHECK: mul nsw i32 120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // CHECK: {{(cmpxchg i32*|i1 @__atomic_compare_exchange\(i32 4,)}} 13860a319e62b0e256817a458396d191aa91c0787aEli Friedman i /= 2; 14860a319e62b0e256817a458396d191aa91c0787aEli Friedman // CHECK: sdiv i32 150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // CHECK: {{(cmpxchg i32*|i1 @__atomic_compare_exchange\(i32 4, )}} 16860a319e62b0e256817a458396d191aa91c0787aEli Friedman j /= x; 17860a319e62b0e256817a458396d191aa91c0787aEli Friedman // CHECK: sdiv i32 180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // CHECK: {{(cmpxchg i16*|i1 @__atomic_compare_exchange\(i32 2, )}} 19860a319e62b0e256817a458396d191aa91c0787aEli Friedman 207a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall} 210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 220e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesextern _Atomic _Bool b; 230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines_Bool bar() { 250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-LABEL: @bar 263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[load:.*]] = load atomic i8, i8* @b seq_cst 270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: %[[tobool:.*]] = trunc i8 %[[load]] to i1 280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: ret i1 %[[tobool]] 290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return b; 300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 320e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesextern _Atomic(_Complex int) x; 330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 340e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid baz(int y) { 350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-LABEL: @baz 360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: {{store atomic|call void @__atomic_store}} 370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines x += y; 380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 39