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