// COM: Run Comgr binary to compile OpenCL source into LLVM IR Bitcode, linking
// COM: against the AMD Device Libraries
// RUN: source-to-bc-with-dev-libs %s -o %t-with-dev-libs.bc

// COM: Dissasemble LLVM IR bitcode to LLVM IR text
// RUN: %llvm-dis %t-with-dev-libs.bc -o - | %FileCheck %s

// COM: Verify LLVM IR text file
// CHECK: target triple = "amdgcn-amd-amdhsa"
// CHECK: define internal float @_Z4powrff
// CHECK: define internal float @_Z6sincosfPU3AS5f
// CHECK: define internal float @_Z4cbrtf
// CHECK: define internal float @__ocml_sincos_f32
// CHECK: define internal float @__ocml_powr_f32
// CHECK: define internal noundef float @__ocml_exp_f32
// CHECK: define internal ptr addrspace(1) @__printf_alloc

extern const __constant bool __oclc_finite_only_opt;
extern const __constant bool __oclc_unsafe_math_opt;
extern const __constant bool __oclc_wavefrontsize64;
extern const __constant int __oclc_ISA_version;
extern const __constant int __oclc_ABI_version;

void kernel device_libs(__global float *status, float x, float y, float z) {

  if (__oclc_finite_only_opt)            status[0] = 1.0;
  if (__oclc_unsafe_math_opt)            status[1] = 1.0;
  if (__oclc_wavefrontsize64)            status[2] = 1.0;
  if (__oclc_ISA_version)                status[3] = 1.0;
  if (__oclc_ABI_version)                status[4] = 1.0;

  // Math functions to test AMDGPULibCalls Folding optimizations
  // fold_sincos()
  status[6] = sin(x) + cos(x);
  status[7] = cos(x) + sin(x);

  // fold_rootn()
  status[8] = rootn(y, 3);
  status[9] = rootn(y, -1);
  status[10] = rootn(y, -2);

  // fold_pow()
  status[11] = pow(z, (float) 0.5);
  status[12] = powr(y, (float) 7.23);

  // printf()
  printf("testy\n");
}
