Files
clang-p2996/clang/test/CodeGenOpenCLCXX/constexpr.cl
Sven van Haastregt df5a905aa8 [OpenCL] Add ExtVectorElementExpr constant evaluation (PR42387)
Add constexpr evaluation for ExtVectorElementExpr nodes by evaluating
the underlying vector expression.  Add basic folding for the case that
Evaluate does not return an LValue.

Differential Revision: https://reviews.llvm.org/D71133
2019-12-17 11:10:06 +00:00

55 lines
1.3 KiB
Common Lisp

// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=clc++ -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;
}