// RUN: %clang_cc1 -no-opaque-pointers %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; }