| // 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; |
| } |