Skip to content

Commit fe6fb4f

Browse files
committed
Convert tests to using filecheck.
1 parent c029153 commit fe6fb4f

File tree

6 files changed

+455
-287
lines changed

6 files changed

+455
-287
lines changed

test/bpf.jl

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,30 @@
11
@testset "No-op" begin
22
kernel() = 0
33

4-
output = sprint(io->BPF.code_native(io, kernel, ()))
5-
@test occursin("\tr0 = 0\n\texit", output)
4+
@test @filecheck begin
5+
check"CHECK: r0 = 0"
6+
check"CHECK-NEXT: exit"
7+
BPF.code_native(kernel, ())
8+
end
69
end
710
@testset "Return argument" begin
811
kernel(x) = x
912

10-
output = sprint(io->BPF.code_native(io, kernel, (UInt64,)))
11-
@test occursin("\tr0 = r1\n\texit", output)
13+
@test @filecheck begin
14+
check"CHECK: r0 = r1"
15+
check"CHECK-NEXT: exit"
16+
BPF.code_native(kernel, (UInt64,))
17+
end
1218
end
1319
@testset "Addition" begin
1420
kernel(x) = x+1
1521

16-
output = sprint(io->BPF.code_native(io, kernel, (UInt64,)))
17-
@test occursin("\tr0 = r1\n\tr0 += 1\n\texit", output)
22+
@test @filecheck begin
23+
check"CHECK: r0 = r1"
24+
check"CHECK-NEXT: r0 += 1"
25+
check"CHECK-NEXT: exit"
26+
BPF.code_native(kernel, (UInt64,))
27+
end
1828
end
1929
@testset "Errors" begin
2030
kernel(x) = fakefunc(x)
@@ -26,8 +36,11 @@ end
2636
goodcall(x) = Base.llvmcall("%2 = call i64 inttoptr (i64 3 to i64 (i64)*)(i64 %0)\nret i64 %2", Int, Tuple{Int}, x)
2737
kernel(x) = goodcall(x)
2838

29-
output = sprint(io->BPF.code_native(io, kernel, (Int,)))
30-
@test occursin(r"\tcall .*\n\texit", output)
39+
@test @filecheck begin
40+
check"CHECK: call"
41+
check"CHECK-NEXT: exit"
42+
BPF.code_native(kernel, (Int,))
43+
end
3144
end
3245
@testset "invalid" begin
3346
badcall(x) = Base.llvmcall("%2 = call i64 inttoptr (i64 3000 to i64 (i64)*)(i64 %0)\nret i64 %2", Int, Tuple{Int}, x)

test/gcn.jl

Lines changed: 62 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ if :AMDGPU in LLVM.backends()
44
@testset "kernel calling convention" begin
55
kernel() = return
66

7-
ir = sprint(io->GCN.code_llvm(io, kernel, Tuple{}; dump_module=true))
8-
@test !occursin("amdgpu_kernel", ir)
7+
@test @filecheck begin
8+
check"CHECK-NOT: amdgpu_kernel"
9+
GCN.code_llvm(kernel, Tuple{}; dump_module=true)
10+
end
911

10-
ir = sprint(io->GCN.code_llvm(io, kernel, Tuple{};
11-
dump_module=true, kernel=true))
12-
@test occursin("amdgpu_kernel", ir)
12+
@test @filecheck begin
13+
check"CHECK: amdgpu_kernel"
14+
GCN.code_llvm(kernel, Tuple{}; dump_module=true, kernel=true)
15+
end
1316
end
1417

1518
end
@@ -27,8 +30,10 @@ end
2730
return
2831
end
2932

30-
asm = sprint(io->GCN.code_native(io, kernel, Tuple{}))
31-
@test occursin("s_trap 2", asm)
33+
@test @filecheck begin
34+
check"CHECK: s_trap 2"
35+
GCN.code_native(kernel, Tuple{})
36+
end
3237
@test_skip occursin("s_cbranch_execz", asm)
3338
if Base.libllvm_version < v"9"
3439
@test_broken occursin("v_readfirstlane", asm)
@@ -44,9 +49,11 @@ end
4449
return
4550
end
4651

47-
asm = sprint(io->GCN.code_native(io, parent, Tuple{Int64}; dump_module=true))
48-
@test occursin(r"s_add_u32.*(julia|j)_child_.*@rel32@", asm)
49-
@test occursin(r"s_addc_u32.*(julia|j)_child_.*@rel32@", asm)
52+
@test @filecheck begin
53+
check"CHECK: s_add_u32{{.*(julia|j)_child_.*}}@rel32@"
54+
check"CHECK: s_addc_u32{{.*(julia|j)_child_.*}}@rel32@"
55+
GCN.code_native(parent, Tuple{Int64}; dump_module=true)
56+
end
5057
end
5158

5259
@testset "kernel functions" begin
@@ -56,10 +63,12 @@ end
5663
return
5764
end
5865

59-
asm = sprint(io->GCN.code_native(io, entry, Tuple{Int64}; dump_module=true, kernel=true))
60-
@test occursin(r"\.amdhsa_kernel \w*entry", asm)
61-
@test !occursin(r"\.amdhsa_kernel \w*nonentry", asm)
62-
@test occursin(r"\.type.*\w*nonentry\w*,@function", asm)
66+
@test @filecheck begin
67+
check"CHECK-NOT: .amdhsa_kernel {{.*}}nonentry"
68+
check"CHECK: .type {{.*nonentry.*}},@function"
69+
check"CHECK: .amdhsa_kernel {{.*entry.*}}"
70+
GCN.code_native(entry, Tuple{Int64}; dump_module=true, kernel=true)
71+
end
6372
end
6473

6574
@testset "child function reuse" begin
@@ -80,11 +89,15 @@ end
8089
end
8190
end
8291

83-
asm = sprint(io->GCN.code_native(io, mod.parent1, Tuple{Int}; dump_module=true))
84-
@test occursin(r"\.type.*(julia|j)_[[:alnum:]_.]*child_\d*,@function", asm)
92+
@test @filecheck begin
93+
check"CHECK: .type {{.*child.*}},@function"
94+
GCN.code_native(mod.parent1, Tuple{Int}; dump_module=true)
95+
end
8596

86-
asm = sprint(io->GCN.code_native(io, mod.parent2, Tuple{Int}; dump_module=true))
87-
@test occursin(r"\.type.*(julia|j)_[[:alnum:]_.]*child_\d*,@function", asm)
97+
@test @filecheck begin
98+
check"CHECK: .type {{.*child.*}},@function"
99+
GCN.code_native(mod.parent2, Tuple{Int}; dump_module=true)
100+
end
88101
end
89102

90103
@testset "child function reuse bis" begin
@@ -106,13 +119,17 @@ end
106119
end
107120
end
108121

109-
asm = sprint(io->GCN.code_native(io, mod.parent1, Tuple{Int}; dump_module=true))
110-
@test occursin(r"\.type.*(julia|j)_[[:alnum:]_.]*child1_\d*,@function", asm)
111-
@test occursin(r"\.type.*(julia|j)_[[:alnum:]_.]*child2_\d*,@function", asm)
122+
@test @filecheck begin
123+
check"CHECK-DAG: .type {{.*child1.*}},@function"
124+
check"CHECK-DAG: .type {{.*child2.*}},@function"
125+
GCN.code_native(mod.parent1, Tuple{Int}; dump_module=true)
126+
end
112127

113-
asm = sprint(io->GCN.code_native(io, mod.parent2, Tuple{Int}; dump_module=true))
114-
@test occursin(r"\.type.*(julia|j)_[[:alnum:]_.]*child1_\d*,@function", asm)
115-
@test occursin(r"\.type.*(julia|j)_[[:alnum:]_.]*child2_\d*,@function", asm)
128+
@test @filecheck begin
129+
check"CHECK-DAG: .type {{.*child1.*}},@function"
130+
check"CHECK-DAG: .type {{.*child2.*}},@function"
131+
GCN.code_native(mod.parent2, Tuple{Int}; dump_module=true)
132+
end
116133
end
117134

118135
@testset "indirect sysimg function use" begin
@@ -127,9 +144,11 @@ end
127144
return
128145
end
129146

130-
asm = sprint(io->GCN.code_native(io, kernel, Tuple{Ptr{Int32}}))
131-
@test !occursin("jl_throw", asm)
132-
@test !occursin("jl_invoke", asm) # forced recompilation should still not invoke
147+
@test @filecheck begin
148+
check"CHECK-NOT: jl_throw"
149+
check"CHECK-NOT: jl_invoke"
150+
GCN.code_native(kernel, Tuple{Ptr{Int32}})
151+
end
133152
end
134153

135154
@testset "LLVM intrinsics" begin
@@ -171,12 +190,14 @@ false && @testset "GC and TLS lowering" begin
171190
end
172191
end
173192

174-
asm = sprint(io->GCN.code_native(io, mod.kernel, Tuple{Int}))
175-
@test occursin("gpu_gc_pool_alloc", asm)
176-
@test !occursin("julia.push_gc_frame", asm)
177-
@test !occursin("julia.pop_gc_frame", asm)
178-
@test !occursin("julia.get_gc_frame_slot", asm)
179-
@test !occursin("julia.new_gc_frame", asm)
193+
@test @filecheck begin
194+
check"CHECK-NOT: jl_push_gc_frame"
195+
check"CHECK-NOT: jl_pop_gc_frame"
196+
check"CHECK-NOT: jl_get_gc_frame_slot"
197+
check"CHECK-NOT: jl_new_gc_frame"
198+
check"CHECK: gpu_gc_pool_alloc"
199+
GCN.code_native(mod.kernel, Tuple{Int})
200+
end
180201

181202
# make sure that we can still ellide allocations
182203
function ref_kernel(ptr, i)
@@ -191,10 +212,10 @@ false && @testset "GC and TLS lowering" begin
191212
return nothing
192213
end
193214

194-
asm = sprint(io->GCN.code_native(io, ref_kernel, Tuple{Ptr{Int64}, Int}))
195-
196-
197-
@test !occursin("gpu_gc_pool_alloc", asm)
215+
@test @filecheck begin
216+
check"CHECK-NOT: gpu_gc_pool_alloc"
217+
GCN.code_native(ref_kernel, Tuple{Ptr{Int64}, Int})
218+
end
198219
end
199220

200221
@testset "float boxes" begin
@@ -208,8 +229,10 @@ end
208229
return
209230
end
210231

211-
ir = sprint(io->GCN.code_llvm(io, kernel, Tuple{Float32,Ptr{Float32}}))
212-
@test occursin("jl_box_float32", ir)
232+
@test @filecheck begin
233+
check"CHECK: jl_box_float32"
234+
GCN.code_llvm(kernel, Tuple{Float32,Ptr{Float32}})
235+
end
213236
GCN.code_native(devnull, kernel, Tuple{Float32,Ptr{Float32}})
214237
end
215238

test/metal.jl

Lines changed: 53 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,54 @@
44
@testset "byref aggregates" begin
55
kernel(x) = return
66

7-
ir = sprint(io->Metal.code_llvm(io, kernel, Tuple{Tuple{Int}}))
8-
@test occursin(r"@\w*kernel\w*\(({ i64 }|\[1 x i64\])\*", ir) ||
9-
occursin(r"@\w*kernel\w*\(ptr", ir)
7+
@test @filecheck begin
8+
check"TYPED: @{{.*kernel.*}}({{(\{ i64 \}|\[1 x i64\])}}*"
9+
check"OPAQUE: @{{.*kernel.*}}(ptr"
10+
Metal.code_llvm(kernel, Tuple{Tuple{Int}})
11+
end
1012

1113
# for kernels, every pointer argument needs to take an address space
12-
ir = sprint(io->Metal.code_llvm(io, kernel, Tuple{Tuple{Int}}; kernel=true))
13-
@test occursin(r"@\w*kernel\w*\(({ i64 }|\[1 x i64\]) addrspace\(1\)\*", ir) ||
14-
occursin(r"@\w*kernel\w*\(ptr addrspace\(1\)", ir)
14+
@test @filecheck begin
15+
check"TYPED: @{{.*kernel.*}}({{(\{ i64 \}|\[1 x i64\])}} addrspace(1)*"
16+
check"OPAQUE: @{{.*kernel.*}}(ptr addrspace(1)"
17+
Metal.code_llvm(kernel, Tuple{Tuple{Int}}; kernel=true)
18+
end
1519
end
1620

1721
@testset "byref primitives" begin
1822
kernel(x) = return
1923

20-
ir = sprint(io->Metal.code_llvm(io, kernel, Tuple{Int}))
21-
@test occursin(r"@\w*kernel\w*\(i64 ", ir)
24+
@test @filecheck begin
25+
check"CHECK: @{{.*kernel.*}}(i64 "
26+
Metal.code_llvm(kernel, Tuple{Int})
27+
end
2228

2329
# for kernels, every pointer argument needs to take an address space
24-
ir = sprint(io->Metal.code_llvm(io, kernel, Tuple{Int}; kernel=true))
25-
@test occursin(r"@\w*kernel\w*\(i64 addrspace\(1\)\*", ir) ||
26-
occursin(r"@\w*kernel\w*\(ptr addrspace\(1\)", ir)
30+
@test @filecheck begin
31+
check"TYPED: @{{.*kernel.*}}(i64 addrspace(1)*"
32+
check"OPAQUE: @{{.*kernel.*}}(ptr addrspace(1)"
33+
Metal.code_llvm(kernel, Tuple{Int}; kernel=true)
34+
end
2735
end
2836

2937
@testset "module metadata" begin
3038
kernel() = return
3139

32-
ir = sprint(io->Metal.code_llvm(io, kernel, Tuple{};
33-
dump_module=true, kernel=true))
34-
@test occursin("air.version", ir)
35-
@test occursin("air.language_version", ir)
36-
@test occursin("air.max_device_buffers", ir)
40+
@test @filecheck begin
41+
check"CHECK: air.version"
42+
check"CHECK: air.language_version"
43+
check"CHECK: air.max_device_buffers"
44+
Metal.code_llvm(kernel, Tuple{}; dump_module=true, kernel=true)
45+
end
3746
end
3847

3948
@testset "argument metadata" begin
4049
kernel(x) = return
4150

42-
ir = sprint(io->Metal.code_llvm(io, kernel, Tuple{Int};
43-
dump_module=true, kernel=true))
44-
@test occursin("air.buffer", ir)
51+
@test @filecheck begin
52+
check"CHECK: air.buffer"
53+
Metal.code_llvm(kernel, Tuple{Int}; dump_module=true, kernel=true)
54+
end
4555

4656
# XXX: perform more exhaustive testing of argument passing metadata here,
4757
# or just defer to execution testing in Metal.jl?
@@ -54,23 +64,29 @@ end
5464
return
5565
end
5666

57-
ir = sprint(io->Metal.code_llvm(io, kernel, Tuple{Core.LLVMPtr{Int,1}}))
58-
@test occursin(r"@\w*kernel\w*\(.* addrspace\(1\)\* %.+\)", ir) ||
59-
occursin(r"@\w*kernel\w*\(ptr addrspace\(1\) %.+\)", ir)
60-
@test occursin(r"call i32 @julia.air.thread_position_in_threadgroup.i32", ir)
67+
@test @filecheck begin
68+
check"TYPED: @{{.*kernel.*}}({{.*}} addrspace(1)* %{{.+}})"
69+
check"OPAQUE: @{{.*kernel.*}}(ptr addrspace(1) %{{.+}})"
70+
check"CHECK: call i32 @julia.air.thread_position_in_threadgroup.i32"
71+
Metal.code_llvm(kernel, Tuple{Core.LLVMPtr{Int,1}})
72+
end
6173

62-
ir = sprint(io->Metal.code_llvm(io, kernel, Tuple{Core.LLVMPtr{Int,1}}; kernel=true))
63-
@test occursin(r"@\w*kernel\w*\(.* addrspace\(1\)\* %.+, i32 %thread_position_in_threadgroup\)", ir) ||
64-
occursin(r"@\w*kernel\w*\(ptr addrspace\(1\) %.+, i32 %thread_position_in_threadgroup\)", ir)
65-
@test !occursin(r"call i32 @julia.air.thread_position_in_threadgroup.i32", ir)
74+
@test @filecheck begin
75+
check"TYPED: @{{.*kernel.*}}({{.*}} addrspace(1)* %{{.+}}, i32 %thread_position_in_threadgroup)"
76+
check"OPAQUE: @{{.*kernel.*}}(ptr addrspace(1) %{{.+}}, i32 %thread_position_in_threadgroup)"
77+
check"CHECK-NOT: call i32 @julia.air.thread_position_in_threadgroup.i32"
78+
Metal.code_llvm(kernel, Tuple{Core.LLVMPtr{Int,1}}; kernel=true)
79+
end
6680
end
6781

6882
@testset "vector intrinsics" begin
6983
foo(x, y) = ccall("llvm.smax.v2i64", llvmcall, NTuple{2, VecElement{Int64}},
7084
(NTuple{2, VecElement{Int64}}, NTuple{2, VecElement{Int64}}), x, y)
7185

72-
ir = sprint(io->Metal.code_llvm(io, foo, (NTuple{2, VecElement{Int64}}, NTuple{2, VecElement{Int64}})))
73-
@test occursin("air.max.s.v2i64", ir)
86+
@test @filecheck begin
87+
check"CHECK: air.max.s.v2i64"
88+
Metal.code_llvm(foo, (NTuple{2, VecElement{Int64}}, NTuple{2, VecElement{Int64}}))
89+
end
7490
end
7591

7692
@testset "unsupported type detection" begin
@@ -104,8 +120,10 @@ end
104120
return
105121
end
106122

107-
ir = sprint(io->Metal.code_llvm(io, kernel1, Tuple{Core.LLVMPtr{Float32,1}}; validate=true))
108-
@test occursin("@metal_os_log", ir)
123+
@test @filecheck begin
124+
check"CHECK: @metal_os_log"
125+
Metal.code_llvm(kernel1, Tuple{Core.LLVMPtr{Float32,1}}; validate=true)
126+
end
109127

110128
function kernel2(ptr)
111129
val = unsafe_load(ptr)
@@ -130,9 +148,10 @@ end
130148
end
131149
end
132150

133-
ir = sprint(io->Metal.code_llvm(io, mod.kernel, Tuple{Core.LLVMPtr{Float32,1}, Int};
134-
dump_module=true, kernel=true))
135-
@test occursin("addrspace(2) constant [2 x float]", ir)
151+
@test @filecheck begin
152+
check"CHECK: addrspace(2) constant [2 x float]"
153+
Metal.code_llvm(mod.kernel, Tuple{Core.LLVMPtr{Float32,1}, Int}; dump_module=true, kernel=true)
154+
end
136155
end
137156

138157
end

0 commit comments

Comments
 (0)