27
27
end
28
28
29
29
ir = sprint (io-> PTX. code_llvm (io, mod. kernel, Tuple{mod. Aggregate}))
30
- @test occursin (r" @\w *kernel \w *\( ({ i64 }|\[ 1 x i64\] )\* " , ir) ||
31
- occursin (r" @\w *kernel \w *\( ptr " , ir)
30
+ @test occursin (r" @julia_kernel \w *\( ({ i64 }|\[ 1 x i64\] )\* " , ir) ||
31
+ occursin (r" @julia_kernel \w *\( ptr " , ir)
32
32
33
33
ir = sprint (io-> PTX. code_llvm (io, mod. kernel, Tuple{mod. Aggregate}; kernel= true ))
34
- @test occursin (r" @\w *kernel \w * \( .*({ i64 }|\[ 1 x i64\] ) " , ir)
34
+ @test occursin (r" @_Z6kernel9Aggregate \( .*({ i64 }|\[ 1 x i64\] ) " , ir)
35
35
end
36
36
37
37
@testset " property_annotations" begin
83
83
@testset " kernel state" begin
84
84
# state should be passed by value to kernel functions
85
85
86
- kernel () = return
86
+ mod = @eval module $ (gensym ())
87
+ export kernel
88
+ kernel () = return
89
+ end
87
90
88
- ir = sprint (io-> PTX. code_llvm (io, kernel, Tuple{}))
89
- @test occursin (r" @\w *kernel \w *\(\) " , ir)
91
+ ir = sprint (io-> PTX. code_llvm (io, mod . kernel, Tuple{}))
92
+ @test occursin (r" @julia_kernel \w *\(\) " , ir)
90
93
91
- ir = sprint (io-> PTX. code_llvm (io, kernel, Tuple{}; kernel= true ))
92
- @test occursin (r" @ \w *kernel \w * \(\ [ 1 x i64\ ] %state\ )" , ir)
94
+ ir = sprint (io-> PTX. code_llvm (io, mod . kernel, Tuple{}; kernel= true ))
95
+ @test occursin (" @_Z6kernel( [1 x i64] %state)" , ir)
93
96
94
97
# state should only passed to device functions that use it
95
98
@@ -111,13 +114,13 @@ end
111
114
kernel= true , dump_module= true ))
112
115
113
116
# kernel should take state argument before all else
114
- @test occursin (r" @\w *kernel \w * \(\[ 1 x i64\] %state" , ir)
117
+ @test occursin (r" @_Z6kernelP5Int64 \(\[ 1 x i64\] %state" , ir)
115
118
116
119
# child1 doesn't use the state
117
- @test occursin (r" @\w *child1 \w *\( (i64|i8\* |ptr)" , ir)
120
+ @test occursin (r" @julia_child1 \w *\( (i64|i8\* |ptr)" , ir)
118
121
119
122
# child2 does
120
- @test occursin (r" @\w *child2 \w *\(\[ 1 x i64\] %state" , ir)
123
+ @test occursin (r" @julia_child2 \w *\(\[ 1 x i64\] %state" , ir)
121
124
122
125
# can't have the unlowered intrinsic
123
126
@test ! occursin (" julia.gpu.state_getter" , ir)
@@ -133,46 +136,58 @@ end
133
136
@testset " child functions" begin
134
137
# we often test using @noinline child functions, so test whether these survive
135
138
# (despite not having side-effects)
136
- @noinline child (i) = sink (i)
137
- function parent (i)
138
- child (i)
139
- return
139
+
140
+ mod = @eval module $ (gensym ())
141
+ import .. sink
142
+ export child, parent
143
+
144
+ @noinline child (i) = sink (i)
145
+ function parent (i)
146
+ child (i)
147
+ return
148
+ end
140
149
end
141
150
142
- asm = sprint (io-> PTX. code_native (io, parent, Tuple{Int64}))
143
- @test occursin (r" call.uni\s +julia_.*child_ " m , asm)
151
+ asm = sprint (io-> PTX. code_native (io, mod . parent, Tuple{Int64}))
152
+ @test occursin (r" call.uni\s +julia_child_ " m , asm)
144
153
end
145
154
146
155
@testset " kernel functions" begin
147
- @noinline nonentry (i) = sink (i)
148
- function entry (i)
149
- nonentry (i)
150
- return
156
+ mod = @eval module $ (gensym ())
157
+ import .. sink
158
+ export nonentry, entry
159
+
160
+ @noinline nonentry (i) = sink (i)
161
+ function entry (i)
162
+ nonentry (i)
163
+ return
164
+ end
151
165
end
152
166
153
- asm = sprint (io-> PTX. code_native (io, entry, Tuple{Int64}; kernel= true ))
154
- @test occursin (r" \. visible \. entry \w *entry" , asm)
155
- @test ! occursin (r" \. visible \. func \w *nonentry" , asm)
156
- @test occursin (r" \. func \w *nonentry" , asm)
167
+ asm = sprint (io-> PTX. code_native (io, mod. entry, Tuple{Int64};
168
+ kernel= true , dump_module= true ))
169
+ @test occursin (" .visible .entry _Z5entry5Int64" , asm)
170
+ @test ! occursin (" .visible .func julia_nonentry" , asm)
171
+ @test occursin (" .func julia_nonentry" , asm)
157
172
158
173
@testset " property_annotations" begin
159
- asm = sprint (io-> PTX. code_native (io, entry, Tuple{Int64}; kernel= true ))
174
+ asm = sprint (io-> PTX. code_native (io, mod . entry, Tuple{Int64}; kernel= true ))
160
175
@test ! occursin (" maxntid" , asm)
161
176
162
- asm = sprint (io-> PTX. code_native (io, entry, Tuple{Int64};
177
+ asm = sprint (io-> PTX. code_native (io, mod . entry, Tuple{Int64};
163
178
kernel= true , maxthreads= 42 ))
164
179
@test occursin (" .maxntid 42, 1, 1" , asm)
165
180
166
- asm = sprint (io-> PTX. code_native (io, entry, Tuple{Int64};
181
+ asm = sprint (io-> PTX. code_native (io, mod . entry, Tuple{Int64};
167
182
kernel= true , minthreads= 42 ))
168
183
@test occursin (" .reqntid 42, 1, 1" , asm)
169
184
170
- asm = sprint (io-> PTX. code_native (io, entry, Tuple{Int64};
185
+ asm = sprint (io-> PTX. code_native (io, mod . entry, Tuple{Int64};
171
186
kernel= true , blocks_per_sm= 42 ))
172
187
@test occursin (" .minnctapersm 42" , asm)
173
188
174
189
if LLVM. version () >= v " 4.0"
175
- asm = sprint (io-> PTX. code_native (io, entry, Tuple{Int64};
190
+ asm = sprint (io-> PTX. code_native (io, mod . entry, Tuple{Int64};
176
191
kernel= true , maxregs= 42 ))
177
192
@test occursin (" .maxnreg 42" , asm)
178
193
end
@@ -183,44 +198,55 @@ end
183
198
# bug: depending on a child function from multiple parents resulted in
184
199
# the child only being present once
185
200
186
- @noinline child (i) = sink (i)
187
- function parent1 (i)
188
- child (i)
189
- return
190
- end
191
-
192
- asm = sprint (io-> PTX. code_native (io, parent1, Tuple{Int}))
193
- @test occursin (r" .func \w *child_" , asm)
201
+ mod = @eval module $ (gensym ())
202
+ import .. sink
203
+ export child, parent1, parent2
194
204
195
- function parent2 (i)
196
- child (i+ 1 )
197
- return
205
+ @noinline child (i) = sink (i)
206
+ function parent1 (i)
207
+ child (i)
208
+ return
209
+ end
210
+ function parent2 (i)
211
+ child (i+ 1 )
212
+ return
213
+ end
198
214
end
199
215
200
- asm = sprint (io-> PTX. code_native (io, parent2, Tuple{Int}))
201
- @test occursin (r" .func \w *child_" , asm)
216
+ asm = sprint (io-> PTX. code_native (io, mod. parent1, Tuple{Int}))
217
+ @test occursin (" .func julia_child_" , asm)
218
+
219
+ asm = sprint (io-> PTX. code_native (io, mod. parent2, Tuple{Int}))
220
+ @test occursin (" .func julia_child_" , asm)
202
221
end
203
222
204
223
@testset " child function reuse bis" begin
205
224
# bug: similar, but slightly different issue as above
206
225
# in the case of two child functions
207
- @noinline child1 (i) = sink (i)
208
- @noinline child2 (i) = sink (i+ 1 )
209
- function parent1 (i)
210
- child1 (i) + child2 (i)
211
- return
212
- end
213
- asm = sprint (io-> PTX. code_native (io, parent1, Tuple{Int}))
214
- @test occursin (r" .func \w *child1_" , asm)
215
- @test occursin (r" .func \w *child2_" , asm)
216
226
217
- function parent2 (i)
218
- child1 (i+ 1 ) + child2 (i+ 1 )
219
- return
227
+ mod = @eval module $ (gensym ())
228
+ import .. sink
229
+ export parent1, parent2, child1, child2
230
+
231
+ @noinline child1 (i) = sink (i)
232
+ @noinline child2 (i) = sink (i+ 1 )
233
+ function parent1 (i)
234
+ child1 (i) + child2 (i)
235
+ return
236
+ end
237
+ function parent2 (i)
238
+ child1 (i+ 1 ) + child2 (i+ 1 )
239
+ return
240
+ end
220
241
end
221
- asm = sprint (io-> PTX. code_native (io, parent2, Tuple{Int}))
222
- @test occursin (r" .func \w *child1_" , asm)
223
- @test occursin (r" .func \w *child2_" , asm)
242
+
243
+ asm = sprint (io-> PTX. code_native (io, mod. parent1, Tuple{Int}))
244
+ @test occursin (" .func julia_child1_" , asm)
245
+ @test occursin (" .func julia_child2_" , asm)
246
+
247
+ asm = sprint (io-> PTX. code_native (io, mod. parent2, Tuple{Int}))
248
+ @test occursin (" .func julia_child1_" , asm)
249
+ @test occursin (" .func julia_child2_" , asm)
224
250
end
225
251
226
252
@testset " indirect sysimg function use" begin
261
287
262
288
@testset " GC and TLS lowering" begin
263
289
mod = @eval module $ (gensym ())
290
+ import .. sink
291
+
264
292
mutable struct PleaseAllocate
265
293
y:: Csize_t
266
294
end
0 commit comments