1111
1212%struct_without_bools = type { i8 }
1313%struct = type { [4 x <8 x i1* >], [4 x <8 x i1 >*]* }
14+ %inner = type { i1 }
15+ %struct2 = type { i32 , i1 , %inner }
1416
1517; CHECK: %struct_without_bools = type { i8 }
1618; 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 }
1823
1924define spir_func void @fun_struct_without_bools (i1 %input1 , %struct_without_bools %input2 ) {
2025 ret void
@@ -30,6 +35,7 @@ define spir_func i1 @callee0(i1 %input) {
3035; CHECK: define spir_func i8 @callee0(i8 %input)
3136; CHECK-NEXT: ret i8 %input
3237
38+
3339define spir_func i1 @callee1 (%struct addrspace (1 )* %input_struct )
3440{
3541 %1 = load %struct , %struct addrspace (1 )* %input_struct
@@ -40,11 +46,90 @@ define spir_func i1 @callee1(%struct addrspace(1)* %input_struct)
4046; CHECK-NEXT: %1 = load %struct, %struct addrspace(1)* %input_struct
4147; CHECK-NEXT: ret i8 1
4248
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+
43125define spir_func void @caller (i1 %input , %struct addrspace (1 )* %input_struct ) {
44126 %1 = call i1 @callee0 (i1 false )
45127 %2 = call i1 @callee0 (i1 true )
46128 %3 = call i1 @callee0 (i1 %input )
47129 %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 } ])
48133 ret void
49134}
50135
@@ -53,4 +138,7 @@ define spir_func void @caller(i1 %input, %struct addrspace(1)* %input_struct) {
53138; CHECK-NEXT: %2 = call i8 @callee0(i8 1)
54139; CHECK-NEXT: %3 = call i8 @callee0(i8 %input)
55140; 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])
56144; CHECK-NEXT: ret void
0 commit comments