1*d1c8a151SAnastasia Stulova// RUN: %clang_cc1 %s -triple spir-unknown-unknown -O0 -emit-llvm -o - | FileCheck %s 2*d1c8a151SAnastasia Stulova 3*d1c8a151SAnastasia Stulovatypedef int int2 __attribute__((ext_vector_type(2))); 4*d1c8a151SAnastasia Stulovatypedef int int4 __attribute__((ext_vector_type(4))); 5*d1c8a151SAnastasia Stulova 6*d1c8a151SAnastasia Stulovastruct Storage final { 7*d1c8a151SAnastasia Stulova constexpr const float& operator[](const int index) const noexcept { 8*d1c8a151SAnastasia Stulova return InternalStorage[index]; 9*d1c8a151SAnastasia Stulova } 10*d1c8a151SAnastasia Stulova 11*d1c8a151SAnastasia Stulova const float InternalStorage[1]; 12*d1c8a151SAnastasia Stulova}; 13*d1c8a151SAnastasia Stulova 14*d1c8a151SAnastasia Stulovaconstexpr Storage getStorage() { 15*d1c8a151SAnastasia Stulova return Storage{{1.0f}}; 16*d1c8a151SAnastasia Stulova} 17*d1c8a151SAnastasia Stulova 18*d1c8a151SAnastasia Stulovaconstexpr float compute() { 19*d1c8a151SAnastasia Stulova constexpr auto s = getStorage(); 20*d1c8a151SAnastasia Stulova return 2.0f / (s[0]); 21*d1c8a151SAnastasia Stulova} 22*d1c8a151SAnastasia Stulova 23*d1c8a151SAnastasia Stulovaconstexpr float FloatConstant = compute(); 24*d1c8a151SAnastasia Stulova 25*d1c8a151SAnastasia Stulova// CHECK-LABEL: define{{.*}} spir_kernel void @foo 26*d1c8a151SAnastasia Stulova// CHECK: store float 2.000000e+00 27*d1c8a151SAnastasia Stulovakernel void foo(global float *x) { 28*d1c8a151SAnastasia Stulova *x = FloatConstant; 29*d1c8a151SAnastasia Stulova} 30*d1c8a151SAnastasia Stulova 31*d1c8a151SAnastasia Stulova// Test evaluation of constant vectors. 32*d1c8a151SAnastasia Stulova// CHECK-LABEL: define{{.*}} spir_kernel void @vecEval 33*d1c8a151SAnastasia Stulova// CHECK: store i32 3 34*d1c8a151SAnastasia Stulova// CHECK: store <2 x i32> <i32 22, i32 33>, <2 x i32> 35*d1c8a151SAnastasia Stulova 36*d1c8a151SAnastasia Stulovaconst int oneElt = int4(3).x; 37*d1c8a151SAnastasia Stulovaconst int2 twoElts = (int4)(11, 22, 33, 44).yz; 38*d1c8a151SAnastasia Stulova 39*d1c8a151SAnastasia Stulovakernel void vecEval(global int *x, global int2 *y) { 40*d1c8a151SAnastasia Stulova *x = oneElt; 41*d1c8a151SAnastasia Stulova *y = twoElts; 42*d1c8a151SAnastasia Stulova} 43*d1c8a151SAnastasia Stulova 44*d1c8a151SAnastasia Stulova// Test evaluation of vectors initialized through a constexpr function. 45*d1c8a151SAnastasia Stulova// CHECK-LABEL: define{{.*}} spir_kernel void @vecEval2 46*d1c8a151SAnastasia Stulova// CHECK: store <2 x i32> 47*d1c8a151SAnastasia Stulovaconstexpr int2 addOne(int2 x) { 48*d1c8a151SAnastasia Stulova return (int2)(x.x + 1, x.y + 1); 49*d1c8a151SAnastasia Stulova} 50*d1c8a151SAnastasia Stulovaconst int2 fromConstexprFunc = addOne(int2(2)); 51*d1c8a151SAnastasia Stulova 52*d1c8a151SAnastasia Stulovakernel void vecEval2(global int2 *x) { 53*d1c8a151SAnastasia Stulova *x = fromConstexprFunc; 54*d1c8a151SAnastasia Stulova} 55*d1c8a151SAnastasia Stulova 56*d1c8a151SAnastasia Stulova// Test evaluation of vec_step 57*d1c8a151SAnastasia Stulova// CHECK-LABEL: define{{.*}} spir_kernel void @vec_step_test 58*d1c8a151SAnastasia Stulova// CHECK: store i32 6 59*d1c8a151SAnastasia Stulovaconstexpr int vsize1 = vec_step(fromConstexprFunc); 60*d1c8a151SAnastasia Stulovaconstexpr int vsize2 = vec_step(int4); 61*d1c8a151SAnastasia Stulova 62*d1c8a151SAnastasia Stulovakernel void vec_step_test(global int *x) { 63*d1c8a151SAnastasia Stulova *x = vsize1 + vsize2; 64*d1c8a151SAnastasia Stulova} 65