Skip to content

Check the bounds of a partial workgroup without a branch per dimension - #844

Open
vchuravy wants to merge 1 commit into
mainfrom
vc/validindex-branchfree
Open

vchuravy wants to merge 1 commit into
mainfrom
vc/validindex-branchfree

Conversation

@vchuravy

@vchuravy vchuravy commented Oct 6, 2026

Copy link
Copy Markdown
Member

validindex combines the per-dimension bounds comparisons with all. Julia 1.10–1.12 lower that to one conditional branch per dimension; 1.13 emits a single and-chain. With the bounds check spread over several branches, PoCL does not hoist the index computation out of its loop over the work-items. For a linear launch that means the udiv/urem reconstructing the Cartesian index run once per work-item instead of once per workgroup.

This PR uses reduce(&, ...; init = true) instead, which is branch-free on every Julia version. init keeps the 0-dimensional case returning true, as all(()) did.

Impact

This showed up while re-measuring the WaterLily CPU reports (#696, #644) against main. WaterLily's BDIM! and scale_u! loop over a 4-D range (nx, ny, nz, 3). PoCL's grid is 3-D, so these kernels take the LinearLaunch path.

Kernel u[I] = u[I]*s + v[I] over a 64×64×64×3 range, workgroup size 64, 4 threads, Ryzen 9 5950X:

Julia 1.11 Julia 1.12 Julia 1.13
main 590 µs 583 µs 133 µs
this PR 153 µs 146 µs 133 µs

WaterLily v1.6.1 tgv 2^6 at 4 threads on Julia 1.12 goes from 0.748 to 0.555 s per 25 steps (KA 0.9.43: 0.656 s). That run used the same change without init = true; the generated code is the same for N ≥ 1.

Test

A new codegen check in test/codegen_checks.jl asserts that a kernel with a dynamic 3-D and 4-D ndrange has exactly one conditional branch. On main the 4-D check fails on Julia 1.10, 1.11 and 1.12, and passes on 1.13; with this change it passes on all four. The full test suite passes locally on Julia 1.10 and 1.12.

🤖 Generated with Claude Code

`validindex` combined the per-dimension comparisons with `all`, which
Julia 1.10-1.12 lower to a branch per dimension (1.13 to a single one).
With several branches PoCL doesn't hoist the index computation out of
its loop over the work-items. That made kernels with a linear launch
(e.g. a 4-D ndrange on the CPU backend) several times slower on those
Julia versions: a 64x64x64x3 kernel took 583 us on Julia 1.12 against
133 us on 1.13. Use `&` instead, which is branch-free everywhere.

Add a codegen check that the bounds check leaves a single conditional
branch, for a 3-D and a 4-D ndrange.

Assisted-by: Claude Code
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main 943a940... main / 943a940...
const/@Const/Float32/262144 0.535 ± 0.032 ms 0.531 ± 0.021 ms 1.01 ± 0.073
const/@Const/Float32/65536 0.176 ± 0.013 ms 0.175 ± 0.014 ms 1.01 ± 0.11
const/@Const/Float64/262144 0.913 ± 0.029 ms 0.902 ± 0.023 ms 1.01 ± 0.041
const/@Const/Float64/65536 0.376 ± 0.024 ms 0.374 ± 0.02 ms 1.01 ± 0.084
const/unmarked/Float32/262144 2.75 ± 0.034 ms 2.3 ± 0.033 ms 1.2 ± 0.023
const/unmarked/Float32/65536 0.605 ± 0.023 ms 0.606 ± 0.025 ms 0.998 ± 0.057
const/unmarked/Float64/262144 3.16 ± 0.029 ms 3.17 ± 0.034 ms 0.998 ± 0.014
const/unmarked/Float64/65536 0.828 ± 0.025 ms 0.825 ± 0.026 ms 1 ± 0.044
launch/3D static workgroup, dynamic ndrange 10.8 ± 0.63 μs 10.8 ± 1.2 μs 1 ± 0.12
launch/3D static workgroup, static ndrange 10.8 ± 42 μs 10.6 ± 0.79 μs 1.02 ± 3.9
launch/dynamic workgroup, dynamic ndrange 11.8 ± 0.47 μs 12.2 ± 41 μs 0.972 ± 3.2
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 12.2 ± 12 μs 11.6 ± 0.54 μs 1.05 ± 1
launch/static workgroup, dynamic ndrange 10.5 ± 0.5 μs 10.7 ± 0.74 μs 0.988 ± 0.083
launch/static workgroup, static ndrange 10.9 ± 41 μs 10.7 ± 0.92 μs 1.02 ± 3.9
partition/dynamic workgroup, dynamic ndrange 0.0598 ± 0.0012 μs 0.0614 ± 0.0011 μs 0.973 ± 0.026
partition/static workgroup, dynamic ndrange 0.0553 ± 0.012 μs 0.0566 ± 0.012 μs 0.977 ± 0.3
partition/static workgroup, static ndrange 1.55 ± 0.01 ns 1.55 ± 0.01 ns 1 ± 0.0091
saxpy/default/Float16/1024 0.0563 ± 0.0061 ms 0.0562 ± 0.0057 ms 1 ± 0.15
saxpy/default/Float16/1048576 1.5 ± 0.04 ms 1.52 ± 0.035 ms 0.987 ± 0.035
saxpy/default/Float16/16384 0.0734 ± 0.0092 ms 0.0777 ± 0.011 ms 0.944 ± 0.17
saxpy/default/Float16/2048 0.0592 ± 0.0045 ms 0.0585 ± 0.0049 ms 1.01 ± 0.12
saxpy/default/Float16/256 11.7 ± 0.67 μs 11.4 ± 0.62 μs 1.03 ± 0.082
saxpy/default/Float16/262144 0.419 ± 0.028 ms 0.428 ± 0.029 ms 0.978 ± 0.094
saxpy/default/Float16/32768 0.0945 ± 0.008 ms 0.0982 ± 0.013 ms 0.962 ± 0.15
saxpy/default/Float16/4096 0.0628 ± 0.0094 ms 0.0605 ± 0.0086 ms 1.04 ± 0.21
saxpy/default/Float16/512 0.0522 ± 0.042 ms 12.3 ± 41 μs 4.22 ± 14
saxpy/default/Float16/64 0.0531 ± 0.035 ms 11.4 ± 3.1 μs 4.67 ± 3.3
saxpy/default/Float16/65536 0.142 ± 0.013 ms 0.145 ± 0.017 ms 0.975 ± 0.14
saxpy/default/Float32/1024 0.0527 ± 0.038 ms 0.0539 ± 0.036 ms 0.977 ± 0.95
saxpy/default/Float32/1048576 0.828 ± 0.076 ms 0.836 ± 0.098 ms 0.991 ± 0.15
saxpy/default/Float32/16384 0.0603 ± 0.0075 ms 0.0623 ± 0.009 ms 0.968 ± 0.18
saxpy/default/Float32/2048 0.0567 ± 0.0041 ms 0.0579 ± 0.0051 ms 0.978 ± 0.11
saxpy/default/Float32/256 11.8 ± 0.24 μs 0.0542 ± 0.044 ms 0.217 ± 0.18
saxpy/default/Float32/262144 0.223 ± 0.034 ms 0.232 ± 0.037 ms 0.961 ± 0.21
saxpy/default/Float32/32768 0.0738 ± 0.0093 ms 0.0791 ± 0.0093 ms 0.932 ± 0.16
saxpy/default/Float32/4096 0.0571 ± 0.0059 ms 0.0585 ± 0.0052 ms 0.975 ± 0.13
saxpy/default/Float32/512 14.1 ± 5.4 μs 15.2 ± 4.6 μs 0.933 ± 0.46
saxpy/default/Float32/64 11.2 ± 0.53 μs 11.5 ± 0.93 μs 0.972 ± 0.092
saxpy/default/Float32/65536 0.0959 ± 0.012 ms 0.104 ± 0.014 ms 0.92 ± 0.17
saxpy/default/Float64/1024 0.0525 ± 0.012 ms 0.053 ± 0.017 ms 0.99 ± 0.39
saxpy/default/Float64/1048576 1.22 ± 0.11 ms 1.32 ± 0.23 ms 0.918 ± 0.18
saxpy/default/Float64/16384 0.0652 ± 0.0075 ms 0.0687 ± 0.0081 ms 0.948 ± 0.16
saxpy/default/Float64/2048 0.0575 ± 0.0068 ms 0.0576 ± 0.0052 ms 0.998 ± 0.15
saxpy/default/Float64/256 14.5 ± 2.7 μs 14.5 ± 2.6 μs 0.997 ± 0.26
saxpy/default/Float64/262144 0.288 ± 0.045 ms 0.313 ± 0.058 ms 0.92 ± 0.22
saxpy/default/Float64/32768 0.0805 ± 0.011 ms 0.0848 ± 0.013 ms 0.949 ± 0.19
saxpy/default/Float64/4096 0.0551 ± 0.0085 ms 0.0568 ± 0.0089 ms 0.971 ± 0.21
saxpy/default/Float64/512 15.8 ± 13 μs 20.8 ± 39 μs 0.757 ± 1.6
saxpy/default/Float64/64 11.2 ± 15 μs 11.4 ± 34 μs 0.984 ± 3.2
saxpy/default/Float64/65536 0.109 ± 0.016 ms 0.116 ± 0.019 ms 0.937 ± 0.21
saxpy/static workgroup=(1024,)/Float16/1024 0.0536 ± 0.004 ms 0.0559 ± 0.0044 ms 0.96 ± 0.11
saxpy/static workgroup=(1024,)/Float16/1048576 1.5 ± 0.041 ms 1.53 ± 0.04 ms 0.986 ± 0.037
saxpy/static workgroup=(1024,)/Float16/16384 0.0725 ± 0.0076 ms 0.0765 ± 0.01 ms 0.947 ± 0.16
saxpy/static workgroup=(1024,)/Float16/2048 0.0576 ± 0.0063 ms 0.0573 ± 0.0055 ms 1.01 ± 0.15
saxpy/static workgroup=(1024,)/Float16/256 0.0536 ± 0.0032 ms 11.8 ± 42 μs 4.55 ± 16
saxpy/static workgroup=(1024,)/Float16/262144 0.42 ± 0.028 ms 0.421 ± 0.028 ms 0.998 ± 0.093
saxpy/static workgroup=(1024,)/Float16/32768 0.0942 ± 0.0085 ms 0.096 ± 0.0093 ms 0.981 ± 0.13
saxpy/static workgroup=(1024,)/Float16/4096 0.0594 ± 0.0051 ms 0.0621 ± 0.0082 ms 0.956 ± 0.15
saxpy/static workgroup=(1024,)/Float16/512 15.9 ± 43 μs 0.0545 ± 0.0035 ms 0.293 ± 0.79
saxpy/static workgroup=(1024,)/Float16/64 11.7 ± 41 μs 11.7 ± 0.44 μs 1 ± 3.5
saxpy/static workgroup=(1024,)/Float16/65536 0.142 ± 0.012 ms 0.143 ± 0.013 ms 0.994 ± 0.12
saxpy/static workgroup=(1024,)/Float32/1024 21.7 ± 42 μs 21.7 ± 38 μs 1 ± 2.6
saxpy/static workgroup=(1024,)/Float32/1048576 0.852 ± 0.091 ms 0.86 ± 0.098 ms 0.99 ± 0.16
saxpy/static workgroup=(1024,)/Float32/16384 0.0607 ± 0.0072 ms 0.0631 ± 0.0072 ms 0.962 ± 0.16
saxpy/static workgroup=(1024,)/Float32/2048 0.0549 ± 0.0063 ms 0.054 ± 0.0036 ms 1.02 ± 0.13
saxpy/static workgroup=(1024,)/Float32/256 0.0499 ± 0.042 ms 11.5 ± 0.3 μs 4.35 ± 3.7
saxpy/static workgroup=(1024,)/Float32/262144 0.23 ± 0.029 ms 0.237 ± 0.03 ms 0.969 ± 0.17
saxpy/static workgroup=(1024,)/Float32/32768 0.0735 ± 0.0082 ms 0.0748 ± 0.0075 ms 0.982 ± 0.15
saxpy/static workgroup=(1024,)/Float32/4096 0.053 ± 0.0096 ms 0.0545 ± 0.0079 ms 0.973 ± 0.22
saxpy/static workgroup=(1024,)/Float32/512 15.7 ± 42 μs 16 ± 39 μs 0.983 ± 3.6
saxpy/static workgroup=(1024,)/Float32/64 12 ± 42 μs 11.7 ± 0.25 μs 1.02 ± 3.5
saxpy/static workgroup=(1024,)/Float32/65536 0.0975 ± 0.012 ms 0.0995 ± 0.01 ms 0.98 ± 0.16
saxpy/static workgroup=(1024,)/Float64/1024 0.0552 ± 0.0045 ms 0.0561 ± 0.0068 ms 0.983 ± 0.14
saxpy/static workgroup=(1024,)/Float64/1048576 1.27 ± 0.2 ms 1.25 ± 0.18 ms 1.02 ± 0.22
saxpy/static workgroup=(1024,)/Float64/16384 0.0669 ± 0.0082 ms 0.0676 ± 0.0077 ms 0.99 ± 0.17
saxpy/static workgroup=(1024,)/Float64/2048 0.0548 ± 0.0049 ms 0.0567 ± 0.0049 ms 0.967 ± 0.12
saxpy/static workgroup=(1024,)/Float64/256 0.0551 ± 0.0075 ms 0.0546 ± 0.046 ms 1.01 ± 0.85
saxpy/static workgroup=(1024,)/Float64/262144 0.29 ± 0.047 ms 0.306 ± 0.047 ms 0.949 ± 0.21
saxpy/static workgroup=(1024,)/Float64/32768 0.0822 ± 0.011 ms 0.085 ± 0.036 ms 0.967 ± 0.43
saxpy/static workgroup=(1024,)/Float64/4096 0.0559 ± 0.0074 ms 0.0562 ± 0.0078 ms 0.994 ± 0.19
saxpy/static workgroup=(1024,)/Float64/512 0.054 ± 0.0043 ms 0.0543 ± 0.041 ms 0.993 ± 0.75
saxpy/static workgroup=(1024,)/Float64/64 12.3 ± 40 μs 0.0538 ± 0.0023 ms 0.229 ± 0.74
saxpy/static workgroup=(1024,)/Float64/65536 0.11 ± 0.017 ms 0.117 ± 0.019 ms 0.944 ± 0.21
time_to_load 0.537 ± 0.0026 s 0.533 ± 0.014 s 1.01 ± 0.027
main 943a940... main / 943a940...
const/@Const/Float32/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float32/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float64/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float64/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float32/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float32/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float64/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float64/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
launch/3D static workgroup, dynamic ndrange 9 allocs: 0.219 kB 9 allocs: 0.219 kB 1
launch/3D static workgroup, static ndrange 9 allocs: 0.219 kB 9 allocs: 0.219 kB 1
launch/dynamic workgroup, dynamic ndrange 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
launch/static workgroup, dynamic ndrange 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
launch/static workgroup, static ndrange 5 allocs: 0.0938 kB 5 allocs: 0.0938 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 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/16384 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float16/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/32768 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float16/65536 12 allocs: 0.25 kB 8 allocs: 0.141 kB 1.78
saxpy/default/Float32/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float32/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float32/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float32/32768 12 allocs: 0.25 kB 8 allocs: 0.141 kB 1.78
saxpy/default/Float32/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float32/65536 12 allocs: 0.25 kB 8 allocs: 0.141 kB 1.78
saxpy/default/Float64/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float64/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float64/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float64/32768 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float64/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float64/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/16384 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float16/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/32768 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float16/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float32/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float32/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float32/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float32/32768 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float32/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float64/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float64/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float64/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float64/32768 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float64/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
time_to_load 0.2 k allocs: 11.8 kB 0.2 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).

@codecov

codecov Bot commented Oct 6, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 79.75%. Comparing base (0977a07) to head (943a940).

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #844   +/-   ##
=======================================
  Coverage   79.75%   79.75%           
=======================================
  Files          25       25           
  Lines        2139     2139           
=======================================
  Hits         1706     1706           
  Misses        433      433           

☔ 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.

This branch has not been deployed

No deployments
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.

1 participant