1b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s
2b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -emit-pch -o %t %s
3b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
40e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// expected-no-diagnostics
587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// REQUIRES: x86-registered-target
60e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#ifndef HEADER
70e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#define HEADER
80e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
90e2c34f92f00628d48968dfea096d36381f494cbStephen Hines_Bool bv, bx;
100e2c34f92f00628d48968dfea096d36381f494cbStephen Hineschar cv, cx;
110e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesunsigned char ucv, ucx;
120e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesshort sv, sx;
130e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesunsigned short usv, usx;
140e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesint iv, ix;
150e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesunsigned int uiv, uix;
160e2c34f92f00628d48968dfea096d36381f494cbStephen Hineslong lv, lx;
170e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesunsigned long ulv, ulx;
180e2c34f92f00628d48968dfea096d36381f494cbStephen Hineslong long llv, llx;
190e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesunsigned long long ullv, ullx;
200e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesfloat fv, fx;
210e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesdouble dv, dx;
220e2c34f92f00628d48968dfea096d36381f494cbStephen Hineslong double ldv, ldx;
230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines_Complex int civ, cix;
240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines_Complex float cfv, cfx;
250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines_Complex double cdv, cdx;
260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
270e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef int int4 __attribute__((__vector_size__(16)));
280e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesint4 int4x;
290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
300e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct BitFields {
310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 32;
320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int a : 31;
330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} bfx;
340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
350e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct BitFields_packed {
360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 32;
370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int a : 31;
380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} __attribute__ ((__packed__)) bfx_packed;
390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
400e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct BitFields2 {
410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 31;
420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int a : 1;
430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} bfx2;
440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
450e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct BitFields2_packed {
460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 31;
470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int a : 1;
480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} __attribute__ ((__packed__)) bfx2_packed;
490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
500e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct BitFields3 {
510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 11;
520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int a : 14;
530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} bfx3;
540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
550e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct BitFields3_packed {
560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int : 11;
570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int a : 14;
580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} __attribute__ ((__packed__)) bfx3_packed;
590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
600e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct BitFields4 {
610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short : 16;
620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int a: 1;
630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long b : 7;
640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} bfx4;
650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
660e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct BitFields4_packed {
670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  short : 16;
680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int a: 1;
690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  long b : 7;
700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} __attribute__ ((__packed__)) bfx4_packed;
710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
720e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef float float2 __attribute__((ext_vector_type(2)));
730e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesfloat2 float2x;
740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Register "0" is currently an invalid register for global register variables.
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Use "esp" instead of "0".
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// register int rix __asm__("0");
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarregister int rix __asm__("esp");
790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
800e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesint main() {
813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i8, i8*
820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8
830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  bv = bx;
853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i8, i8*
860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8
870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  cv = cx;
893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i8, i8*
900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8
910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ucv = ucx;
933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i16, i16*
940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i16
950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  sv = sx;
973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i16, i16*
980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i16
990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  usv = usx;
1013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i32, i32*
1020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32
1030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  iv = ix;
1053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i32, i32*
1060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32
1070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  uiv = uix;
1093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64*
1100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64
1110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  lv = lx;
1133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64*
1140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64
1150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ulv = ulx;
1173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64*
1180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64
1190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  llv = llx;
1213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64*
1220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64
1230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ullv = ullx;
1253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i32, i32* bitcast (float*
1260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: bitcast i32 {{.*}} to float
1270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store float
1280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  fv = fx;
1303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64* bitcast (double*
1310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: bitcast i64 {{.*}} to double
1320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store double
1330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  dv = dx;
1353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i128, i128* bitcast (x86_fp80*
1360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[BITCAST:%.+]] = bitcast x86_fp80* [[LDTEMP:%.*]] to i128*
1370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i128 [[LD]], i128* [[BITCAST]]
1383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load x86_fp80, x86_fp80* [[LDTEMP]]
1390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80 [[LD]]
1400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = ldx;
1420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} void @__atomic_load(i64 8,
1430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32
1440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32
1450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  civ = cix;
1470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} void @__atomic_load(i64 8,
1480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store float
1490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store float
1500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  cfv = cfx;
1520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} void @__atomic_load(i64 16,
1530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} @__kmpc_flush(
1540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store double
1550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store double
1560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic seq_cst read
1570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  cdv = cdx;
1583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64*
1590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8
1600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  bv = ulx;
1623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i8, i8*
1630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8
1640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  cv = bx;
1663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i8, i8*
1670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} @__kmpc_flush(
1680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8
1690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read, seq_cst
1700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ucv = cx;
1713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64*
1720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i16
1730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  sv = ulx;
1753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64*
1760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i16
1770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  usv = lx;
1793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i32, i32*
1800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} @__kmpc_flush(
1810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32
1820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic seq_cst, read
1830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  iv = uix;
1843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i32, i32*
1850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32
1860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  uiv = ix;
1880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} void @__atomic_load(i64 8,
1890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64
1900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  lv = cix;
1923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i32, i32*
1930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64
1940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ulv = fx;
1963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64*
1970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64
1980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
1990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  llv = dx;
2003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i128, i128*
2010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64
2020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ullv = ldx;
2040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} void @__atomic_load(i64 8,
2050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store float
2060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  fv = cix;
2083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i16, i16*
2090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store double
2100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  dv = sx;
2123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i8, i8*
2130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
2140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bx;
2163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i8, i8*
2170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32
2180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32
2190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  civ = bx;
2213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i16, i16*
2220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store float
2230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store float
2240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  cfv = usx;
2263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load atomic i64, i64*
2270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store double
2280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store double
2290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  cdv = llx;
2313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[I128VAL:%.+]] = load atomic i128, i128* bitcast (<4 x i32>* @{{.+}} to i128*) monotonic
2320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[I128PTR:%.+]] = bitcast <4 x i32>* [[LDTEMP:%.+]] to i128*
2330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i128 [[I128VAL]], i128* [[I128PTR]]
2343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load <4 x i32>, <4 x i32>* [[LDTEMP]]
2350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: extractelement <4 x i32> [[LD]]
2360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8
2370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  bv = int4x[0];
2393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i32, i32* bitcast (i8* getelementptr (i8, i8* bitcast (%{{.+}}* @{{.+}} to i8*), i64 4) to i32*) monotonic
2400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32 [[LD]], i32* [[LDTEMP:%.+]]
2413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i32, i32* [[LDTEMP]]
2420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[SHL:%.+]] = shl i32 [[LD]], 1
2430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: ashr i32 [[SHL]], 1
2440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
2450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx.a;
2470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[LDTEMP_VOID_PTR:%.+]] = bitcast i32* [[LDTEMP:%.+]] to i8*
2483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: call void @__atomic_load(i64 4, i8* getelementptr (i8, i8* bitcast (%struct.BitFields_packed* @bfx_packed to i8*), i64 4), i8* [[LDTEMP_VOID_PTR]], i32 0)
2493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i32, i32* [[LDTEMP]]
2500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[SHL:%.+]] = shl i32 [[LD]], 1
2510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: ashr i32 [[SHL]], 1
2520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
2530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx_packed.a;
2553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i32, i32* getelementptr inbounds (%struct.BitFields2, %struct.BitFields2* @bfx2, i32 0, i32 0) monotonic
2560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32 [[LD]], i32* [[LDTEMP:%.+]]
2573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i32, i32* [[LDTEMP]]
2580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: ashr i32 [[LD]], 31
2590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
2600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx2.a;
2623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i8, i8* getelementptr (i8, i8* bitcast (%struct.BitFields2_packed* @bfx2_packed to i8*), i64 3) monotonic
2630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8 [[LD]], i8* [[LDTEMP:%.+]]
2643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i8, i8* [[LDTEMP]]
2650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: ashr i8 [[LD]], 7
2660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
2670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx2_packed.a;
2693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i32, i32* getelementptr inbounds (%struct.BitFields3, %struct.BitFields3* @bfx3, i32 0, i32 0) monotonic
2700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i32 [[LD]], i32* [[LDTEMP:%.+]]
2713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i32, i32* [[LDTEMP]]
2720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[SHL:%.+]] = shl i32 [[LD]], 7
2730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: ashr i32 [[SHL]], 18
2740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
2750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx3.a;
2770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[LDTEMP_VOID_PTR:%.+]] = bitcast i24* [[LDTEMP:%.+]] to i8*
2783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: call void @__atomic_load(i64 3, i8* getelementptr (i8, i8* bitcast (%struct.BitFields3_packed* @bfx3_packed to i8*), i64 1), i8* [[LDTEMP_VOID_PTR]], i32 0)
2793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i24, i24* [[LDTEMP]]
2800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[SHL:%.+]] = shl i24 [[LD]], 7
2810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[ASHR:%.+]] = ashr i24 [[SHL]], 10
2820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: sext i24 [[ASHR]] to i32
2830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
2840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx3_packed.a;
2863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i64, i64* bitcast (%struct.BitFields4* @bfx4 to i64*) monotonic
2870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64 [[LD]], i64* [[LDTEMP:%.+]]
2883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i64, i64* [[LDTEMP]]
2890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[SHL:%.+]] = shl i64 [[LD]], 47
2900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[ASHR:%.+]] = ashr i64 [[SHL]], 63
2910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: trunc i64 [[ASHR]] to i32
2920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
2930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
2940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx4.a;
2953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i8, i8* getelementptr inbounds (%struct.BitFields4_packed, %struct.BitFields4_packed* @bfx4_packed, i32 0, i32 0, i64 2) monotonic
2960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8 [[LD]], i8* [[LDTEMP:%.+]]
2973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i8, i8* [[LDTEMP]]
2980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[SHL:%.+]] = shl i8 [[LD]], 7
2990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[ASHR:%.+]] = ashr i8 [[SHL]], 7
3000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: sext i8 [[ASHR]] to i32
3010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
3020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
3030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx4_packed.a;
3043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i64, i64* bitcast (%struct.BitFields4* @bfx4 to i64*) monotonic
3050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64 [[LD]], i64* [[LDTEMP:%.+]]
3063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i64, i64* [[LDTEMP]]
3070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[SHL:%.+]] = shl i64 [[LD]], 40
3080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[ASHR:%.+]] = ashr i64 [[SHL]], 57
3090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
3100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
3110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx4.b;
3123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i8, i8* getelementptr inbounds (%struct.BitFields4_packed, %struct.BitFields4_packed* @bfx4_packed, i32 0, i32 0, i64 2) monotonic
3130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i8 [[LD]], i8* [[LDTEMP:%.+]]
3143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load i8, i8* [[LDTEMP]]
3150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[ASHR:%.+]] = ashr i8 [[LD]], 1
3160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: sext i8 [[ASHR]] to i64
3170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store x86_fp80
3180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
3190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ldv = bfx4_packed.b;
3203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load atomic i64, i64* bitcast (<2 x float>* @{{.+}} to i64*) monotonic
3213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[BITCAST:%.+]] = bitcast <2 x float>* [[LDTEMP:%.+]] to i64*
3223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: store i64 [[LD]], i64* [[BITCAST]]
3233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[LD:%.+]] = load <2 x float>, <2 x float>* [[LDTEMP]]
3240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: extractelement <2 x float> [[LD]]
3250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store i64
3260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read
3270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  ulv = float2x.x;
3280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} i{{[0-9]+}} @llvm.read_register
3290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: call{{.*}} @__kmpc_flush(
3300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: store double
3310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#pragma omp atomic read seq_cst
3320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  dv = rix;
3330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return 0;
3340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
3350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#endif
337