// RUN: %clang_cc1 %s -triple spir-unknown-unknown -O0 -emit-llvm -o - | FileCheck %s

typedef int int2 __attribute__((ext_vector_type(2)));
typedef int int4 __attribute__((ext_vector_type(4)));

struct Storage final {
  constexpr const float& operator[](const int index) const noexcept {
    return InternalStorage[index];
  }

  const float InternalStorage[1];
};

constexpr Storage getStorage() {
  return Storage{{1.0f}};
}

constexpr float compute() {
  constexpr auto s = getStorage();
  return 2.0f / (s[0]);
}

constexpr float FloatConstant = compute();

// CHECK-LABEL: define{{.*}} spir_kernel void @foo
// CHECK: store float 2.000000e+00
kernel void foo(global float *x) {
  *x = FloatConstant;
}

// Test evaluation of constant vectors.
// CHECK-LABEL: define{{.*}} spir_kernel void @vecEval
// CHECK: store i32 3
// CHECK: store <2 x i32> <i32 22, i32 33>, <2 x i32>

const int oneElt = int4(3).x;
const int2 twoElts = (int4)(11, 22, 33, 44).yz;

kernel void vecEval(global int *x, global int2 *y) {
  *x = oneElt;
  *y = twoElts;
}

// Test evaluation of vectors initialized through a constexpr function.
// CHECK-LABEL: define{{.*}} spir_kernel void @vecEval2
// CHECK: store <2 x i32>
constexpr int2 addOne(int2 x) {
  return (int2)(x.x + 1, x.y + 1);
}
const int2 fromConstexprFunc = addOne(int2(2));

kernel void vecEval2(global int2 *x) {
  *x = fromConstexprFunc;
}

// Test evaluation of vec_step
// CHECK-LABEL: define{{.*}} spir_kernel void @vec_step_test
// CHECK: store i32 6
constexpr int vsize1 = vec_step(fromConstexprFunc);
constexpr int vsize2 = vec_step(int4);

kernel void vec_step_test(global int *x) {
  *x = vsize1 + vsize2;
}
