Conversation
eriknw
marked this pull request as ready for review
August 4, 2026 16:07
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
2 times, most recently
from
August 5, 2026 00:06
f226963 to
4a76f9e
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 5, 2026 03:18
4a76f9e to
50e6f33
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 5, 2026 17:44
50e6f33 to
575d24e
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 5, 2026 18:03
575d24e to
7241dac
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 5, 2026 18:05
7241dac to
d3e8959
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 6, 2026 07:59
d3e8959 to
6e582a3
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 6, 2026 15:39
6e582a3 to
72f6462
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 6, 2026 15:41
72f6462 to
8f797a7
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
2 times, most recently
from
August 6, 2026 20:41
39529a9 to
4a8f82f
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 7, 2026 02:48
4a8f82f to
9ca1b59
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 7, 2026 05:09
9ca1b59 to
d436a59
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
August 26, 2026 17:30
d436a59 to
be64cbc
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
2 times, most recently
from
September 18, 2026 03:46
70aea20 to
7bb5368
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
September 18, 2026 17:34
7bb5368 to
6fb13a0
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
September 18, 2026 17:39
6fb13a0 to
b62039e
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
September 23, 2026 16:22
b62039e to
8524eec
Compare
eriknw
removed this pull request from stack #627
September 23, 2026 18:18
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
September 23, 2026 18:19
8524eec to
8e9dd0d
Compare
eriknw
added this pull request to stack #634
September 23, 2026 18:19
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
September 24, 2026 20:06
8e9dd0d to
aedd50d
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
2 times, most recently
from
September 25, 2026 03:33
0672951 to
ddcb7b2
Compare
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
2 times, most recently
from
September 26, 2026 05:23
5c10d71 to
2e422db
Compare
Each auto-lifted UDT operator carries both a JIT C definition and a Numba cfunc, and SuiteSparse chooses between them per call depending on whether a C compiler is available. A result measured on one path is not evidence about the other, so a machine with a compiler and a machine without run different code, and a single-path test reports on whichever the runner happened to get. `udt_op_path` parametrizes over both and pins `jit_c_control` for the duration of the test. Two details there are load-bearing: - It sets the control rather than reading whatever is in effect. SuiteSparse demotes `on` to `load` after a failed compile, and a demoted control routes to the cfunc silently, so a `jit` cell would run the cfunc and pass. - It re-reads the control before restoring it and fails the test when it was demoted mid-test. No assertion inside the test can see that happen. `_jit_can_compile` memoizes whether a usable compiler exists. It deliberately does not consult `jit_c_control`, which is the per-test state the fixture owns; folding the two together is what let a demoted control go unnoticed. This adds no production code and no test cells. A parametrized fixture creates cells only for tests that request it, and nothing requests it yet, so the suite count is unchanged. It lands on its own so that each commit which goes on to consume it carries only its own change in operator semantics.
The gate read jit_c_control == 'on' as the success flag of the JIT probe that importing graphblas.ss used to run. "Stop `gb.ss` import from turning the SuiteSparse JIT on" (#630) now sits below this branch and took that probe out of the import, so what the gate saw depended on whether anything had enabled the JIT before the fixture first asked. test_ssjit.py does so when it is collected. Without it, as when test_op.py runs on its own, the control still reads SuiteSparse's default 'run', and on a machine with a working compiler the fixture's first consumer (next branch up) skipped its jit case as "JIT compilation not available" and ran only the cfunc. _enable_jit_for_udt is the call the UDT auto-lift path makes, and it does a real compile once per process, so the gate asks it instead and no longer depends on collection order. This change was part of #630 while that PR sat above this one.
eriknw
force-pushed
the
12-udt-dual-path-harness
branch
from
September 26, 2026 05:25
2e422db to
2d6467e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Each auto-lifted UDT operator carries both a JIT C definition and a Numba
cfunc, and SuiteSparse chooses between them per call depending on whether a C
compiler is available. A result measured on one path is not evidence about
the other, so a machine with a compiler and a machine without run different
code, and a single-path test reports on whichever the runner happened to get.
udt_op_pathparametrizes over both and pinsjit_c_controlfor theduration of the test. Two details there are load-bearing:
demotes
ontoloadafter a failed compile, and a demoted control routesto the cfunc silently, so a
jitcell would run the cfunc and pass.demoted mid-test. No assertion inside the test can see that happen.
_jit_can_compilememoizes whether a usable compiler exists. It deliberatelydoes not consult
jit_c_control, which is the per-test state the fixtureowns; folding the two together is what let a demoted control go unnoticed.
This adds no production code and no test cells. A parametrized fixture
creates cells only for tests that request it, and nothing requests it yet, so
the suite count is unchanged. It lands on its own so that each commit which
goes on to consume it carries only its own change in operator semantics.
_jit_can_compileasks_enable_jit_for_udt(), the call the UDT auto-lift path makes, which does one real compile per process. Importinggraphblas.ssno longer probes the compiler (#630 now sits below this PR), so readingjit_c_control == 'on'as the probe's answer skipped thejitcells whenever nothing had enabled the JIT first.Stack created with GitHub Stacks CLI • Give Feedback 💬