Skip to content

Check generated device code with FileCheck.jl - #783

Merged
vchuravy merged 3 commits into
mainfrom
vc/filecheck-codegen
Sep 15, 2026
Merged

vchuravy merged 3 commits into
mainfrom
vc/filecheck-codegen

Conversation

@vchuravy

@vchuravy vchuravy commented Sep 14, 2026 •

Copy link
Copy Markdown
Member

The test suite covers what kernels compute, but nothing pins down how they compile. Several of the guarantees KernelAbstractions makes are about the generated code rather than the result, and all of them can regress silently today:

  • the global index is computed from the SPIR-V work-item builtins, with no call back into the Julia runtime, and array accesses go to address space 1;
  • without @inbounds the kernel carries the out-of-bounds path (the error printf plus gpu_report_exception/gpu_signal_exception), and @inbounds removes all of it;
  • with both the workgroupsize and the ndrange known at compile time, __validindex folds away and the kernel body becomes straight-line code (paired with a dynamic-ndrange kernel that still branches, so the check is not vacuous);
  • @localmem becomes a module-level allocation in address space 3 that the kernel reads and writes directly;
  • @synchronize becomes a SPIR-V control barrier;
  • @atomic becomes a native atomicrmw, not a compare-and-swap loop;
  • @print becomes a single variadic printf call, not one call per argument.

test/codegen_checks.jl states each of those as LLVM FileCheck directives over @device_code_llvm output, using FileCheck.jl. test/codegen.jl runs it.

Why a subprocess

Pkg.test defaults to --check-bounds=yes, which forces bounds checks on regardless of @inbounds. Under it the two @inbounds assertions are not merely untestable but false. Making them conditional would mean they never run in CI, so instead test/codegen.jl runs the checks in a subprocess that inherits neither --check-bounds nor --code-coverage, following the existing pattern in test/coverage.jl — coverage instruments the very kernels being inspected, and under Pkg.test(coverage=true) would also fold the subprocess into the outer report. codegen_checks.jl refuses to run unless bounds checking is on auto, so a future regression in the flag handling fails loudly rather than quietly asserting nothing.

To iterate on a pattern, run it directly:

julia --project=test test/codegen_checks.jl

Notes

  • The tests deliberately live outside Testsuite. That module is included by the backend packages, which cannot pick up new test dependencies, and the patterns are specific to the in-tree POCL/SPIR-V back-end anyway.
  • Patterns avoid pointer syntax, so they hold for both the typed pointers of LLVM 15 (Julia 1.10) and the opaque pointers of later versions. Confirmed on the 1.10 jobs.
  • Exclusions use implicit_check_not rather than a trailing @check_not: a CHECK-NOT after the last positive check only covers the range from that match to the end of the input, which for ret void is nothing at all.
  • The two @localmem accesses are @check_dag, because LLVM is free to emit the basic blocks in any order — it does in fact sink the barrier block above them here.
  • FileCheck v1.2 depends only on LLVM_utils_unified_jll, a FileCheck-only artifact, rather than on a full LLVM build.

Testing

Pkg.test(coverage=true) passes locally, and CI is green across the matrix.

Each check was verified non-vacuous by mutating the kernel it covers — dropping @inbounds, @synchronize and @atomic each fail exactly the corresponding test. Breaking a pattern was also verified to fail the parent testset, with the subprocess's annotated FileCheck output surfaced in the log.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DbbtGLjxXpt7kZj6h2yVdK

The test suite covers what kernels compute, but nothing pins down how they
compile. Several of the guarantees KernelAbstractions makes are about the
generated code rather than the result -- `@inbounds` removing the out-of-bounds
path, a statically sized ndrange folding `__validindex` away, `@localmem`
landing in the workgroup address space, `@atomic` becoming a native
`atomicrmw` -- and all of those can regress silently.

Add test/codegen.jl, which states them as LLVM FileCheck directives over
`@device_code_llvm` output, using FileCheck.jl.

The tests live outside `Testsuite`: that module is included by the backend
packages, which cannot pick up new test dependencies, and the patterns are
specific to the in-tree POCL/SPIR-V back-end anyway. They avoid pointer syntax
so they hold for both the typed pointers of LLVM 15 (Julia 1.10) and the opaque
pointers of later versions.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbbtGLjxXpt7kZj6h2yVdK
@giordano

Copy link
Copy Markdown
Collaborator

Also #754 (review)?

@github-actions

github-actions Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main c151dcc... main / c151dcc...
const/@Const/Float32/262144 0.344 ± 0.03 ms 0.345 ± 0.03 ms 0.997 ± 0.12
const/@Const/Float32/65536 0.123 ± 0.026 ms 0.124 ± 0.027 ms 0.993 ± 0.3
const/@Const/Float64/262144 0.435 ± 0.073 ms 0.435 ± 0.074 ms 1 ± 0.24
const/@Const/Float64/65536 0.166 ± 0.014 ms 0.15 ± 0.023 ms 1.11 ± 0.19
const/unmarked/Float32/262144 1.17 ± 0.031 ms 1.15 ± 0.037 ms 1.02 ± 0.043
const/unmarked/Float32/65536 0.331 ± 0.026 ms 0.328 ± 0.031 ms 1.01 ± 0.12
const/unmarked/Float64/262144 1.33 ± 0.041 ms 1.35 ± 0.044 ms 0.986 ± 0.044
const/unmarked/Float64/65536 0.397 ± 0.038 ms 0.392 ± 0.041 ms 1.01 ± 0.14
launch/3D static workgroup, dynamic ndrange 0.0749 ± 0.03 ms 0.0763 ± 0.025 ms 0.981 ± 0.51
launch/3D static workgroup, static ndrange 0.0733 ± 0.032 ms 0.0759 ± 0.025 ms 0.966 ± 0.53
launch/dynamic workgroup, dynamic ndrange 0.0764 ± 0.026 ms 0.0779 ± 0.022 ms 0.981 ± 0.44
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 0.0721 ± 0.032 ms 0.0737 ± 0.031 ms 0.979 ± 0.6
launch/static workgroup, dynamic ndrange 0.0725 ± 0.033 ms 0.0738 ± 0.03 ms 0.983 ± 0.6
launch/static workgroup, static ndrange 0.0737 ± 0.032 ms 0.0742 ± 0.03 ms 0.993 ± 0.58
partition/dynamic workgroup, dynamic ndrange 0.0585 ± 0.0014 μs 0.0628 ± 0.0013 μs 0.931 ± 0.03
partition/static workgroup, dynamic ndrange 0.0689 ± 0.012 μs 0.0654 ± 0.012 μs 1.05 ± 0.27
partition/static workgroup, static ndrange 2.47 ± 0.011 ns 2.47 ± 0.011 ns 1 ± 0.0063
saxpy/default/Float16/1024 0.0802 ± 0.014 ms 0.0804 ± 0.013 ms 0.997 ± 0.24
saxpy/default/Float16/1048576 0.781 ± 0.031 ms 0.785 ± 0.032 ms 0.995 ± 0.056
saxpy/default/Float16/16384 0.0655 ± 0.035 ms 0.066 ± 0.034 ms 0.992 ± 0.73
saxpy/default/Float16/2048 0.0813 ± 0.027 ms 0.0818 ± 0.024 ms 0.993 ± 0.44
saxpy/default/Float16/256 0.0795 ± 0.022 ms 0.0796 ± 0.011 ms 0.998 ± 0.3
saxpy/default/Float16/262144 0.239 ± 0.03 ms 0.24 ± 0.031 ms 0.998 ± 0.18
saxpy/default/Float16/32768 0.0752 ± 0.031 ms 0.0758 ± 0.031 ms 0.992 ± 0.58
saxpy/default/Float16/4096 0.0829 ± 0.032 ms 0.0827 ± 0.032 ms 1 ± 0.55
saxpy/default/Float16/512 0.0789 ± 0.011 ms 0.0798 ± 0.0084 ms 0.989 ± 0.17
saxpy/default/Float16/64 0.0785 ± 0.021 ms 0.08 ± 0.013 ms 0.981 ± 0.31
saxpy/default/Float16/65536 0.0965 ± 0.026 ms 0.098 ± 0.028 ms 0.984 ± 0.39
saxpy/default/Float32/1024 0.0782 ± 0.013 ms 0.0789 ± 0.014 ms 0.991 ± 0.24
saxpy/default/Float32/1048576 0.498 ± 0.027 ms 0.496 ± 0.026 ms 1.01 ± 0.075
saxpy/default/Float32/16384 0.0581 ± 0.03 ms 0.0585 ± 0.031 ms 0.994 ± 0.74
saxpy/default/Float32/2048 0.0772 ± 0.03 ms 0.078 ± 0.03 ms 0.989 ± 0.53
saxpy/default/Float32/256 0.0789 ± 0.013 ms 0.0794 ± 0.013 ms 0.993 ± 0.23
saxpy/default/Float32/262144 0.164 ± 0.03 ms 0.168 ± 0.031 ms 0.975 ± 0.25
saxpy/default/Float32/32768 0.0645 ± 0.027 ms 0.0654 ± 0.03 ms 0.986 ± 0.6
saxpy/default/Float32/4096 0.075 ± 0.031 ms 0.0784 ± 0.032 ms 0.957 ± 0.56
saxpy/default/Float32/512 0.0784 ± 0.012 ms 0.0791 ± 0.013 ms 0.992 ± 0.22
saxpy/default/Float32/64 0.0779 ± 0.023 ms 0.0788 ± 0.015 ms 0.988 ± 0.34
saxpy/default/Float32/65536 0.0788 ± 0.029 ms 0.0799 ± 0.03 ms 0.986 ± 0.52
saxpy/default/Float64/1024 0.0781 ± 0.02 ms 0.0788 ± 0.016 ms 0.991 ± 0.32
saxpy/default/Float64/1048576 0.603 ± 0.09 ms 0.575 ± 0.076 ms 1.05 ± 0.21
saxpy/default/Float64/16384 0.0583 ± 0.026 ms 0.0588 ± 0.028 ms 0.991 ± 0.65
saxpy/default/Float64/2048 0.0764 ± 0.031 ms 0.0773 ± 0.032 ms 0.989 ± 0.58
saxpy/default/Float64/256 0.0786 ± 0.016 ms 0.0795 ± 0.012 ms 0.988 ± 0.25
saxpy/default/Float64/262144 0.182 ± 0.035 ms 0.182 ± 0.036 ms 1 ± 0.28
saxpy/default/Float64/32768 0.0668 ± 0.026 ms 0.0674 ± 0.028 ms 0.991 ± 0.57
saxpy/default/Float64/4096 0.0664 ± 0.03 ms 0.0664 ± 0.032 ms 1 ± 0.66
saxpy/default/Float64/512 0.078 ± 0.02 ms 0.0791 ± 0.011 ms 0.986 ± 0.29
saxpy/default/Float64/64 0.0779 ± 0.021 ms 0.0793 ± 0.017 ms 0.982 ± 0.34
saxpy/default/Float64/65536 0.0836 ± 0.028 ms 0.084 ± 0.03 ms 0.996 ± 0.48
saxpy/static workgroup=(1024,)/Float16/1024 0.0768 ± 0.015 ms 0.0773 ± 0.019 ms 0.994 ± 0.31
saxpy/static workgroup=(1024,)/Float16/1048576 0.777 ± 0.029 ms 0.782 ± 0.03 ms 0.993 ± 0.054
saxpy/static workgroup=(1024,)/Float16/16384 0.0608 ± 0.03 ms 0.0612 ± 0.031 ms 0.993 ± 0.71
saxpy/static workgroup=(1024,)/Float16/2048 0.0784 ± 0.025 ms 0.079 ± 0.024 ms 0.993 ± 0.44
saxpy/static workgroup=(1024,)/Float16/256 0.0758 ± 0.025 ms 0.0763 ± 0.025 ms 0.994 ± 0.46
saxpy/static workgroup=(1024,)/Float16/262144 0.235 ± 0.03 ms 0.235 ± 0.031 ms 0.999 ± 0.18
saxpy/static workgroup=(1024,)/Float16/32768 0.0709 ± 0.028 ms 0.0715 ± 0.03 ms 0.992 ± 0.57
saxpy/static workgroup=(1024,)/Float16/4096 0.0786 ± 0.033 ms 0.0787 ± 0.034 ms 0.999 ± 0.61
saxpy/static workgroup=(1024,)/Float16/512 0.0763 ± 0.014 ms 0.0768 ± 0.014 ms 0.992 ± 0.26
saxpy/static workgroup=(1024,)/Float16/64 0.0747 ± 0.03 ms 0.0761 ± 0.024 ms 0.981 ± 0.5
saxpy/static workgroup=(1024,)/Float16/65536 0.0926 ± 0.021 ms 0.0934 ± 0.025 ms 0.992 ± 0.34
saxpy/static workgroup=(1024,)/Float32/1024 0.0757 ± 0.021 ms 0.0761 ± 0.012 ms 0.995 ± 0.32
saxpy/static workgroup=(1024,)/Float32/1048576 0.501 ± 0.026 ms 0.493 ± 0.024 ms 1.02 ± 0.072
saxpy/static workgroup=(1024,)/Float32/16384 0.0552 ± 0.026 ms 0.0556 ± 0.028 ms 0.993 ± 0.69
saxpy/static workgroup=(1024,)/Float32/2048 0.0738 ± 0.03 ms 0.0754 ± 0.029 ms 0.978 ± 0.55
saxpy/static workgroup=(1024,)/Float32/256 0.0758 ± 0.025 ms 0.076 ± 0.022 ms 0.997 ± 0.44
saxpy/static workgroup=(1024,)/Float32/262144 0.163 ± 0.029 ms 0.162 ± 0.029 ms 1 ± 0.26
saxpy/static workgroup=(1024,)/Float32/32768 0.0612 ± 0.025 ms 0.0615 ± 0.026 ms 0.996 ± 0.58
saxpy/static workgroup=(1024,)/Float32/4096 0.0717 ± 0.033 ms 0.0762 ± 0.033 ms 0.941 ± 0.59
saxpy/static workgroup=(1024,)/Float32/512 0.076 ± 0.02 ms 0.0765 ± 0.02 ms 0.992 ± 0.37
saxpy/static workgroup=(1024,)/Float32/64 0.0746 ± 0.03 ms 0.0762 ± 0.026 ms 0.978 ± 0.51
saxpy/static workgroup=(1024,)/Float32/65536 0.0758 ± 0.028 ms 0.0757 ± 0.028 ms 1 ± 0.53
saxpy/static workgroup=(1024,)/Float64/1024 0.0754 ± 0.024 ms 0.0762 ± 0.023 ms 0.99 ± 0.43
saxpy/static workgroup=(1024,)/Float64/1048576 0.595 ± 0.083 ms 0.569 ± 0.056 ms 1.05 ± 0.18
saxpy/static workgroup=(1024,)/Float64/16384 0.0557 ± 0.023 ms 0.0565 ± 0.026 ms 0.985 ± 0.61
saxpy/static workgroup=(1024,)/Float64/2048 0.0726 ± 0.031 ms 0.0753 ± 0.031 ms 0.964 ± 0.57
saxpy/static workgroup=(1024,)/Float64/256 0.0757 ± 0.024 ms 0.0764 ± 0.02 ms 0.991 ± 0.4
saxpy/static workgroup=(1024,)/Float64/262144 0.182 ± 0.035 ms 0.181 ± 0.035 ms 1.01 ± 0.27
saxpy/static workgroup=(1024,)/Float64/32768 0.0644 ± 0.023 ms 0.0649 ± 0.026 ms 0.993 ± 0.52
saxpy/static workgroup=(1024,)/Float64/4096 0.0591 ± 0.031 ms 0.057 ± 0.032 ms 1.04 ± 0.8
saxpy/static workgroup=(1024,)/Float64/512 0.0757 ± 0.021 ms 0.0764 ± 0.02 ms 0.992 ± 0.38
saxpy/static workgroup=(1024,)/Float64/64 0.0752 ± 0.03 ms 0.0764 ± 0.027 ms 0.985 ± 0.53
saxpy/static workgroup=(1024,)/Float64/65536 0.0811 ± 0.026 ms 0.0823 ± 0.028 ms 0.985 ± 0.46
time_to_load 0.81 ± 0.015 s 0.828 ± 0.017 s 0.978 ± 0.028
main c151dcc... main / c151dcc...
const/@Const/Float32/262144 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
const/@Const/Float32/65536 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
const/@Const/Float64/262144 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
const/@Const/Float64/65536 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
const/unmarked/Float32/262144 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
const/unmarked/Float32/65536 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
const/unmarked/Float64/262144 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
const/unmarked/Float64/65536 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
launch/3D static workgroup, dynamic ndrange 7 allocs: 0.297 kB 7 allocs: 0.297 kB 1
launch/3D static workgroup, static ndrange 8 allocs: 0.328 kB 8 allocs: 0.328 kB 1
launch/dynamic workgroup, dynamic ndrange 17 allocs: 0.469 kB 17 allocs: 0.469 kB 1
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
launch/static workgroup, dynamic ndrange 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
launch/static workgroup, static ndrange 4 allocs: 0.203 kB 4 allocs: 0.203 kB 1
partition/dynamic workgroup, dynamic ndrange 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
partition/static workgroup, dynamic ndrange 2 allocs: 32 B 2 allocs: 32 B 1
partition/static workgroup, static ndrange 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float16/1024 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/1048576 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/16384 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/2048 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/256 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float16/262144 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/32768 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/4096 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/512 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/64 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float16/65536 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/1024 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/1048576 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/16384 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/2048 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/256 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float32/262144 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/32768 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/4096 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/512 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/64 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float32/65536 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/1024 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/1048576 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/16384 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/2048 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/256 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float64/262144 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/32768 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/4096 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/512 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/64 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float64/65536 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/static workgroup=(1024,)/Float16/1024 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/1048576 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/16384 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/2048 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/256 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float16/262144 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/32768 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/4096 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/512 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/64 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float16/65536 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/1024 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/1048576 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/16384 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/2048 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/256 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float32/262144 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/32768 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/4096 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/512 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/64 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float32/65536 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/1024 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/1048576 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/16384 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/2048 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/256 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float64/262144 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/32768 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/4096 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/512 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/64 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float64/65536 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
time_to_load 0.201 k allocs: 11.8 kB 0.201 k allocs: 11.8 kB 1

Benchmark Plots

A plot of the benchmark results have been uploaded as an artifact to the workflow run for this PR.
Go to "Actions"->"Benchmark a pull request"->[the most recent run]->"Artifacts" (at the bottom).

`Pkg.test` defaults to `--check-bounds=yes`, which forces bounds checks on
regardless of `@inbounds`. Two of the checks assert that `@inbounds` removes
the out-of-bounds path, which under that flag is not merely untestable but
false, so CI failed everywhere while a direct `julia test/runtests.jl` passed.

Move the checks to test/codegen_checks.jl and run them from a subprocess that
inherits neither `--check-bounds` nor `--code-coverage`, following the existing
pattern in test/coverage.jl. Coverage instruments the very kernels being
inspected, and under `Pkg.test(coverage=true)` would also fold the subprocess
into the outer report.

codegen_checks.jl refuses to run unless bounds checking is on `auto`, so a
future regression in the flag handling fails loudly rather than quietly
asserting nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbbtGLjxXpt7kZj6h2yVdK
@codecov

codecov Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 66.09%. Comparing base (e6be186) to head (c151dcc).
⚠️ Report is 3 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##            main     #783       +/-   ##
==========================================
+ Coverage   0.70%   66.09%   +65.39%     
==========================================
  Files         21       23        +2     
  Lines       1839     1991      +152     
==========================================
+ Hits          13     1316     +1303     
+ Misses      1826      675     -1151     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vchuravy
vchuravy merged commit 0e46cf4 into main Sep 15, 2026
77 of 78 checks passed
@vchuravy
vchuravy deleted the vc/filecheck-codegen branch September 15, 2026 13:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants