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