11
11
12
12
%struct_without_bools = type { i8 }
13
13
%struct = type { [4 x <8 x i1* >], [4 x <8 x i1 >*]* }
14
+ %inner = type { i1 }
15
+ %struct2 = type { i32 , i1 , %inner }
14
16
15
17
; CHECK: %struct_without_bools = type { i8 }
16
18
; CHECK: %struct = type { [4 x <8 x i8*>], [4 x <8 x i8>*]* }
17
-
19
+ ; CHECK: %struct2 = type { i32, i8, %inner }
20
+ ; CHECK: %inner = type { i8 }
21
+ ; CHECK: %struct2.unpromoted = type { i32, i1, %inner.unpromoted }
22
+ ; CHECK: %inner.unpromoted = type { i1 }
18
23
19
24
define spir_func void @fun_struct_without_bools (i1 %input1 , %struct_without_bools %input2 ) {
20
25
ret void
@@ -30,6 +35,7 @@ define spir_func i1 @callee0(i1 %input) {
30
35
; CHECK: define spir_func i8 @callee0(i8 %input)
31
36
; CHECK-NEXT: ret i8 %input
32
37
38
+
33
39
define spir_func i1 @callee1 (%struct addrspace (1 )* %input_struct )
34
40
{
35
41
%1 = load %struct , %struct addrspace (1 )* %input_struct
@@ -40,11 +46,90 @@ define spir_func i1 @callee1(%struct addrspace(1)* %input_struct)
40
46
; CHECK-NEXT: %1 = load %struct, %struct addrspace(1)* %input_struct
41
47
; CHECK-NEXT: ret i8 1
42
48
49
+
50
+ define spir_func %struct2 @callee2 (%struct2 %input_struct ) {
51
+ ret %struct2 %input_struct
52
+ }
53
+
54
+ ; CHECK: define spir_func %struct2 @callee2(%struct2 %input_struct) {
55
+ ; CHECK-NEXT: %1 = extractvalue %struct2 %input_struct, 0
56
+ ; CHECK-NEXT: %2 = insertvalue %struct2.unpromoted poison, i32 %1, 0
57
+ ; CHECK-NEXT: %3 = extractvalue %struct2 %input_struct, 1
58
+ ; CHECK-NEXT: %4 = trunc i8 %3 to i1
59
+ ; CHECK-NEXT: %5 = insertvalue %struct2.unpromoted %2, i1 %4, 1
60
+ ; CHECK-NEXT: %6 = extractvalue %struct2 %input_struct, 2
61
+ ; CHECK-NEXT: %7 = extractvalue %inner %6, 0
62
+ ; CHECK-NEXT: %8 = trunc i8 %7 to i1
63
+ ; CHECK-NEXT: %9 = insertvalue %inner.unpromoted poison, i1 %8, 0
64
+ ; CHECK-NEXT: %10 = insertvalue %struct2.unpromoted %5, %inner.unpromoted %9, 2
65
+ ; CHECK-NEXT: %11 = extractvalue %struct2.unpromoted %10, 0
66
+ ; CHECK-NEXT: %12 = insertvalue %struct2 poison, i32 %11, 0
67
+ ; CHECK-NEXT: %13 = extractvalue %struct2.unpromoted %10, 1
68
+ ; CHECK-NEXT: %14 = zext i1 %13 to i8
69
+ ; CHECK-NEXT: %15 = insertvalue %struct2 %12, i8 %14, 1
70
+ ; CHECK-NEXT: %16 = extractvalue %struct2.unpromoted %10, 2
71
+ ; CHECK-NEXT: %17 = extractvalue %inner.unpromoted %16, 0
72
+ ; CHECK-NEXT: %18 = zext i1 %17 to i8
73
+ ; CHECK-NEXT: %19 = insertvalue %inner poison, i8 %18, 0
74
+ ; CHECK-NEXT: %20 = insertvalue %struct2 %15, %inner %19, 2
75
+ ; CHECK-NEXT: ret %struct2 %20
76
+
77
+
78
+ define spir_func [ 2 x i1 ] @callee3 ( [ 2 x i1 ] %input_array ) {
79
+ ret [ 2 x i1 ] %input_array
80
+ }
81
+
82
+ ; CHECK: define spir_func [2 x i8] @callee3([2 x i8] %input_array) {
83
+ ; CHECK-NEXT: %1 = extractvalue [2 x i8] %input_array, 0
84
+ ; CHECK-NEXT: %2 = trunc i8 %1 to i1
85
+ ; CHECK-NEXT: %3 = insertvalue [2 x i1] poison, i1 %2, 0
86
+ ; CHECK-NEXT: %4 = extractvalue [2 x i8] %input_array, 1
87
+ ; CHECK-NEXT: %5 = trunc i8 %4 to i1
88
+ ; CHECK-NEXT: %6 = insertvalue [2 x i1] %3, i1 %5, 1
89
+ ; CHECK-NEXT: %7 = extractvalue [2 x i1] %6, 0
90
+ ; CHECK-NEXT: %8 = zext i1 %7 to i8
91
+ ; CHECK-NEXT: %9 = insertvalue [2 x i8] poison, i8 %8, 0
92
+ ; CHECK-NEXT: %10 = extractvalue [2 x i1] %6, 1
93
+ ; CHECK-NEXT: %11 = zext i1 %10 to i8
94
+ ; CHECK-NEXT: %12 = insertvalue [2 x i8] %9, i8 %11, 1
95
+ ; CHECK-NEXT: ret [2 x i8] %12
96
+
97
+
98
+ define spir_func [ 2 x %inner ] @calle4 ( [ 2 x %inner ] %input_array ) {
99
+ ret [ 2 x %inner ] %input_array
100
+ }
101
+
102
+ ; CHECK: define spir_func [2 x %inner] @calle4([2 x %inner] %input_array) {
103
+ ; CHECK-NEXT: %1 = extractvalue [2 x %inner] %input_array, 0
104
+ ; CHECK-NEXT: %2 = extractvalue %inner %1, 0
105
+ ; CHECK-NEXT: %3 = trunc i8 %2 to i1
106
+ ; CHECK-NEXT: %4 = insertvalue %inner.unpromoted poison, i1 %3, 0
107
+ ; CHECK-NEXT: %5 = insertvalue [2 x %inner.unpromoted] poison, %inner.unpromoted %4, 0
108
+ ; CHECK-NEXT: %6 = extractvalue [2 x %inner] %input_array, 1
109
+ ; CHECK-NEXT: %7 = extractvalue %inner %6, 0
110
+ ; CHECK-NEXT: %8 = trunc i8 %7 to i1
111
+ ; CHECK-NEXT: %9 = insertvalue %inner.unpromoted poison, i1 %8, 0
112
+ ; CHECK-NEXT: %10 = insertvalue [2 x %inner.unpromoted] %5, %inner.unpromoted %9, 1
113
+ ; CHECK-NEXT: %11 = extractvalue [2 x %inner.unpromoted] %10, 0
114
+ ; CHECK-NEXT: %12 = extractvalue %inner.unpromoted %11, 0
115
+ ; CHECK-NEXT: %13 = zext i1 %12 to i8
116
+ ; CHECK-NEXT: %14 = insertvalue %inner poison, i8 %13, 0
117
+ ; CHECK-NEXT: %15 = insertvalue [2 x %inner] poison, %inner %14, 0
118
+ ; CHECK-NEXT: %16 = extractvalue [2 x %inner.unpromoted] %10, 1
119
+ ; CHECK-NEXT: %17 = extractvalue %inner.unpromoted %16, 0
120
+ ; CHECK-NEXT: %18 = zext i1 %17 to i8
121
+ ; CHECK-NEXT: %19 = insertvalue %inner poison, i8 %18, 0
122
+ ; CHECK-NEXT: %20 = insertvalue [2 x %inner] %15, %inner %19, 1
123
+ ; CHECK-NEXT: ret [2 x %inner] %20
124
+
43
125
define spir_func void @caller (i1 %input , %struct addrspace (1 )* %input_struct ) {
44
126
%1 = call i1 @callee0 (i1 false )
45
127
%2 = call i1 @callee0 (i1 true )
46
128
%3 = call i1 @callee0 (i1 %input )
47
129
%4 = call i1 @callee1 (%struct addrspace (1 )* %input_struct )
130
+ %5 = call %struct2 @callee2 ( %struct2 { i32 5 , i1 false , %inner { i1 true } })
131
+ %6 = call [ 2 x i1 ] @callee3 ( [ 2 x i1 ] [ i1 true , i1 false ])
132
+ %7 = call [ 2 x %inner ] @calle4 ( [ 2 x %inner ] [ %inner { i1 true }, %inner { i1 false } ])
48
133
ret void
49
134
}
50
135
@@ -53,4 +138,7 @@ define spir_func void @caller(i1 %input, %struct addrspace(1)* %input_struct) {
53
138
; CHECK-NEXT: %2 = call i8 @callee0(i8 1)
54
139
; CHECK-NEXT: %3 = call i8 @callee0(i8 %input)
55
140
; CHECK-NEXT: %4 = call i8 @callee1(%struct addrspace(1)* %input_struct)
141
+ ; CHECK-NEXT: %5 = call %struct2 @callee2(%struct2 { i32 5, i8 0, %inner { i8 1 } })
142
+ ; CHECK-NEXT: %6 = call [2 x i8] @callee3([2 x i8] c"\01\00")
143
+ ; CHECK-NEXT: %7 = call [2 x %inner] @calle4([2 x %inner] [%inner { i8 1 }, %inner zeroinitializer])
56
144
; CHECK-NEXT: ret void
0 commit comments