xref: /llvm-project/clang/test/CodeGenOpenCL/preserve_vec3.cl (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2// RUN: %clang_cc1 %s -emit-llvm -o - -triple spir-unknown-unknown | FileCheck %s
3
4typedef char char3 __attribute__((ext_vector_type(3)));
5typedef char char8 __attribute__((ext_vector_type(8)));
6typedef short short3 __attribute__((ext_vector_type(3)));
7typedef double double2 __attribute__((ext_vector_type(2)));
8typedef float float3 __attribute__((ext_vector_type(3)));
9typedef float float4 __attribute__((ext_vector_type(4)));
10
11// CHECK-LABEL: define dso_local spir_kernel void @foo(
12// CHECK-SAME: ptr addrspace(1) noundef readonly align 16 captures(none) [[A:%.*]], ptr addrspace(1) noundef writeonly align 16 captures(none) initializes((0, 16)) [[B:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] !kernel_arg_addr_space [[META3:![0-9]+]] !kernel_arg_access_qual [[META4:![0-9]+]] !kernel_arg_type [[META5:![0-9]+]] !kernel_arg_base_type [[META6:![0-9]+]] !kernel_arg_type_qual [[META7:![0-9]+]] {
13// CHECK-NEXT:  [[ENTRY:.*:]]
14// CHECK-NEXT:    [[LOADVECN:%.*]] = load <4 x float>, ptr addrspace(1) [[A]], align 16
15// CHECK-NEXT:    [[EXTRACTVEC1:%.*]] = shufflevector <4 x float> [[LOADVECN]], <4 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
16// CHECK-NEXT:    store <4 x float> [[EXTRACTVEC1]], ptr addrspace(1) [[B]], align 16, !tbaa [[TBAA8:![0-9]+]]
17// CHECK-NEXT:    ret void
18//
19void kernel foo(global float3 *a, global float3 *b) {
20  *b = *a;
21}
22
23// CHECK-LABEL: define dso_local spir_kernel void @float4_to_float3(
24// CHECK-SAME: ptr addrspace(1) noundef writeonly align 16 captures(none) initializes((0, 16)) [[A:%.*]], ptr addrspace(1) noundef readonly align 16 captures(none) [[B:%.*]]) local_unnamed_addr #[[ATTR0]] !kernel_arg_addr_space [[META3]] !kernel_arg_access_qual [[META4]] !kernel_arg_type [[META11:![0-9]+]] !kernel_arg_base_type [[META12:![0-9]+]] !kernel_arg_type_qual [[META7]] {
25// CHECK-NEXT:  [[ENTRY:.*:]]
26// CHECK-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr addrspace(1) [[B]], align 16, !tbaa [[TBAA8]]
27// CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <4 x float> [[TMP0]], <4 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
28// CHECK-NEXT:    store <4 x float> [[EXTRACTVEC]], ptr addrspace(1) [[A]], align 16, !tbaa [[TBAA8]]
29// CHECK-NEXT:    ret void
30//
31void kernel float4_to_float3(global float3 *a, global float4 *b) {
32  *a = __builtin_astype(*b, float3);
33}
34
35// CHECK-LABEL: define dso_local spir_kernel void @float3_to_float4(
36// CHECK-SAME: ptr addrspace(1) noundef readonly align 16 captures(none) [[A:%.*]], ptr addrspace(1) noundef writeonly align 16 captures(none) initializes((0, 16)) [[B:%.*]]) local_unnamed_addr #[[ATTR0]] !kernel_arg_addr_space [[META3]] !kernel_arg_access_qual [[META4]] !kernel_arg_type [[META11]] !kernel_arg_base_type [[META12]] !kernel_arg_type_qual [[META7]] {
37// CHECK-NEXT:  [[ENTRY:.*:]]
38// CHECK-NEXT:    [[LOADVECN:%.*]] = load <4 x float>, ptr addrspace(1) [[A]], align 16
39// CHECK-NEXT:    [[ASTYPE:%.*]] = shufflevector <4 x float> [[LOADVECN]], <4 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
40// CHECK-NEXT:    store <4 x float> [[ASTYPE]], ptr addrspace(1) [[B]], align 16, !tbaa [[TBAA8]]
41// CHECK-NEXT:    ret void
42//
43void kernel float3_to_float4(global float3 *a, global float4 *b) {
44  *b = __builtin_astype(*a, float4);
45}
46
47// CHECK-LABEL: define dso_local spir_kernel void @float3_to_double2(
48// CHECK-SAME: ptr addrspace(1) noundef readonly align 16 captures(none) [[A:%.*]], ptr addrspace(1) noundef writeonly align 16 captures(none) initializes((0, 16)) [[B:%.*]]) local_unnamed_addr #[[ATTR0]] !kernel_arg_addr_space [[META3]] !kernel_arg_access_qual [[META4]] !kernel_arg_type [[META13:![0-9]+]] !kernel_arg_base_type [[META14:![0-9]+]] !kernel_arg_type_qual [[META7]] {
49// CHECK-NEXT:  [[ENTRY:.*:]]
50// CHECK-NEXT:    [[LOADVECN:%.*]] = load <4 x float>, ptr addrspace(1) [[A]], align 16
51// CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <4 x float> [[LOADVECN]], <4 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
52// CHECK-NEXT:    store <4 x float> [[TMP0]], ptr addrspace(1) [[B]], align 16, !tbaa [[TBAA8]]
53// CHECK-NEXT:    ret void
54//
55void kernel float3_to_double2(global float3 *a, global double2 *b) {
56  *b = __builtin_astype(*a, double2);
57}
58
59// CHECK-LABEL: define dso_local spir_kernel void @char8_to_short3(
60// CHECK-SAME: ptr addrspace(1) noundef writeonly align 8 captures(none) initializes((0, 8)) [[A:%.*]], ptr addrspace(1) noundef readonly align 8 captures(none) [[B:%.*]]) local_unnamed_addr #[[ATTR0]] !kernel_arg_addr_space [[META3]] !kernel_arg_access_qual [[META4]] !kernel_arg_type [[META15:![0-9]+]] !kernel_arg_base_type [[META16:![0-9]+]] !kernel_arg_type_qual [[META7]] {
61// CHECK-NEXT:  [[ENTRY:.*:]]
62// CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i16>, ptr addrspace(1) [[B]], align 8, !tbaa [[TBAA8]]
63// CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <4 x i16> [[TMP0]], <4 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
64// CHECK-NEXT:    store <4 x i16> [[EXTRACTVEC]], ptr addrspace(1) [[A]], align 8, !tbaa [[TBAA8]]
65// CHECK-NEXT:    ret void
66//
67void kernel char8_to_short3(global short3 *a, global char8 *b) {
68  *a = __builtin_astype(*b, short3);
69}
70
71// CHECK-LABEL: define dso_local spir_func void @from_char3(
72// CHECK-SAME: <3 x i8> noundef [[A:%.*]], ptr addrspace(1) noundef writeonly captures(none) initializes((0, 4)) [[OUT:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] {
73// CHECK-NEXT:  [[ENTRY:.*:]]
74// CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <3 x i8> [[A]], <3 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
75// CHECK-NEXT:    store <4 x i8> [[EXTRACTVEC]], ptr addrspace(1) [[OUT]], align 4, !tbaa [[TBAA17:![0-9]+]]
76// CHECK-NEXT:    ret void
77//
78void from_char3(char3 a, global int *out) {
79  *out = __builtin_astype(a, int);
80}
81
82// CHECK-LABEL: define dso_local spir_func void @from_short3(
83// CHECK-SAME: <3 x i16> noundef [[A:%.*]], ptr addrspace(1) noundef writeonly captures(none) initializes((0, 8)) [[OUT:%.*]]) local_unnamed_addr #[[ATTR1]] {
84// CHECK-NEXT:  [[ENTRY:.*:]]
85// CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <3 x i16> [[A]], <3 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
86// CHECK-NEXT:    store <4 x i16> [[EXTRACTVEC]], ptr addrspace(1) [[OUT]], align 8, !tbaa [[TBAA19:![0-9]+]]
87// CHECK-NEXT:    ret void
88//
89void from_short3(short3 a, global long *out) {
90  *out = __builtin_astype(a, long);
91}
92
93// CHECK-LABEL: define dso_local spir_func void @scalar_to_char3(
94// CHECK-SAME: i32 noundef [[A:%.*]], ptr addrspace(1) noundef writeonly captures(none) initializes((0, 4)) [[OUT:%.*]]) local_unnamed_addr #[[ATTR1]] {
95// CHECK-NEXT:  [[ENTRY:.*:]]
96// CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A]] to <4 x i8>
97// CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <4 x i8> [[TMP0]], <4 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
98// CHECK-NEXT:    store <4 x i8> [[EXTRACTVEC]], ptr addrspace(1) [[OUT]], align 4, !tbaa [[TBAA8]]
99// CHECK-NEXT:    ret void
100//
101void scalar_to_char3(int a, global char3 *out) {
102  *out = __builtin_astype(a, char3);
103}
104
105// CHECK-LABEL: define dso_local spir_func void @scalar_to_short3(
106// CHECK-SAME: i64 noundef [[A:%.*]], ptr addrspace(1) noundef writeonly captures(none) initializes((0, 8)) [[OUT:%.*]]) local_unnamed_addr #[[ATTR1]] {
107// CHECK-NEXT:  [[ENTRY:.*:]]
108// CHECK-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A]] to <4 x i16>
109// CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <4 x i16> [[TMP0]], <4 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
110// CHECK-NEXT:    store <4 x i16> [[EXTRACTVEC]], ptr addrspace(1) [[OUT]], align 8, !tbaa [[TBAA8]]
111// CHECK-NEXT:    ret void
112//
113void scalar_to_short3(long a, global short3 *out) {
114  *out = __builtin_astype(a, short3);
115}
116
117//.
118// CHECK: [[META3]] = !{i32 1, i32 1}
119// CHECK: [[META4]] = !{!"none", !"none"}
120// CHECK: [[META5]] = !{!"float3*", !"float3*"}
121// CHECK: [[META6]] = !{!"float __attribute__((ext_vector_type(3)))*", !"float __attribute__((ext_vector_type(3)))*"}
122// CHECK: [[META7]] = !{!"", !""}
123// CHECK: [[TBAA8]] = !{[[META9:![0-9]+]], [[META9]], i64 0}
124// CHECK: [[META9]] = !{!"omnipotent char", [[META10:![0-9]+]], i64 0}
125// CHECK: [[META10]] = !{!"Simple C/C++ TBAA"}
126// CHECK: [[META11]] = !{!"float3*", !"float4*"}
127// CHECK: [[META12]] = !{!"float __attribute__((ext_vector_type(3)))*", !"float __attribute__((ext_vector_type(4)))*"}
128// CHECK: [[META13]] = !{!"float3*", !"double2*"}
129// CHECK: [[META14]] = !{!"float __attribute__((ext_vector_type(3)))*", !"double __attribute__((ext_vector_type(2)))*"}
130// CHECK: [[META15]] = !{!"short3*", !"char8*"}
131// CHECK: [[META16]] = !{!"short __attribute__((ext_vector_type(3)))*", !"char __attribute__((ext_vector_type(8)))*"}
132// CHECK: [[TBAA17]] = !{[[META18:![0-9]+]], [[META18]], i64 0}
133// CHECK: [[META18]] = !{!"int", [[META9]], i64 0}
134// CHECK: [[TBAA19]] = !{[[META20:![0-9]+]], [[META20]], i64 0}
135// CHECK: [[META20]] = !{!"long", [[META9]], i64 0}
136//.
137