// RUN: %libomptarget-compilexx-and-run-generic
// RUN: %libomptarget-compileoptxx-and-run-generic

// FIXME: This is a bug in host offload, this should run fine.
// UNSUPPORTED: aarch64-unknown-linux-gnu
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO

// This test validates that the OpenMP target reductions to find a minimum work
// as indended for a few common data types.

#include <algorithm>
#include <cassert>
#include <limits>
#include <vector>

template <class Tp> void test_min_idx_reduction() {
  const Tp length = 1000;
  const Tp nminimas = 8;
  std::vector<float> a(length, 3.0f);
  const Tp step = length / nminimas;
  for (Tp i = 0; i < nminimas; i++) {
    a[i * step] -= 1.0f;
  }
  for (Tp i = 0; i < nminimas; i++) {
    Tp idx = a.size();
    float *b = a.data();
#pragma omp target teams distribute parallel for reduction(min : idx)          \
    map(always, to : b[0 : length])
    for (Tp j = 0; j < length - 1; j++) {
      if (b[j] < b[j + 1]) {
        idx = std::min(idx, j);
      }
    }
    assert(idx == i * step &&
           "#pragma omp target teams distribute parallel for "
           "reduction(min:<identifier list>) does not work as intended.");
    a[idx] += 1.0f;
  }
}

template <class Tp> void test_min_val_reduction() {
  const int length = 1000;
  const int half = length / 2;
  std::vector<Tp> a(length, (Tp)3);
  a[half] -= (Tp)1;
  Tp min_val = std::numeric_limits<Tp>::max();
  Tp *b = a.data();
#pragma omp target teams distribute parallel for reduction(min : min_val)      \
    map(always, to : b[0 : length])
  for (int i = 0; i < length; i++) {
    min_val = std::min(min_val, b[i]);
  }
  assert(std::abs(((double)a[half + 1]) - ((double)min_val) - 1.0) < 1e-6 &&
         "#pragma omp target teams distribute parallel for "
         "reduction(min:<identifier list>) does not work as intended.");
}

int main() {
  // Reducing over indices
  test_min_idx_reduction<int>();
  test_min_idx_reduction<unsigned int>();
  test_min_idx_reduction<long>();

  // Reducing over values
  test_min_val_reduction<int>();
  test_min_val_reduction<unsigned int>();
  test_min_val_reduction<long>();
  test_min_val_reduction<float>();
  test_min_val_reduction<double>();
  return 0;
}
