Skip to content

[AutoDiff] Autodiff 4: Mark rsqrt as non-linear for adstack promotion#503

Merged
duburcqa merged 2 commits into
mainfrom
duburcqa/split_autodiff_mark_rsqrt_nonlinear
Apr 22, 2026
Merged

[AutoDiff] Autodiff 4: Mark rsqrt as non-linear for adstack promotion#503
duburcqa merged 2 commits into
mainfrom
duburcqa/split_autodiff_mark_rsqrt_nonlinear

Conversation

@duburcqa

@duburcqa duburcqa commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

Mark rsqrt as non-linear for adstack promotion

One-entry addition to NonLinearOps::unary_collections so AdStackAllocaJudger promotes the operand alloca of qd.rsqrt in dynamic loops. Also adds a meta-test that prevents this class of omission from sneaking in again.

TL;DR

 inline static const std::set<UnaryOpType> unary_collections{
     UnaryOpType::abs,  UnaryOpType::sin, UnaryOpType::cos, UnaryOpType::tan,  UnaryOpType::tanh, UnaryOpType::asin,
-    UnaryOpType::acos, UnaryOpType::exp, UnaryOpType::log, UnaryOpType::sqrt};
+    UnaryOpType::acos, UnaryOpType::exp, UnaryOpType::log, UnaryOpType::sqrt, UnaryOpType::rsqrt};

rsqrt's reverse formula is -0.5 * rsqrt(operand)³ * adjoint — already operand-based, so no MakeAdjoint / MakeDual change is needed, just the set-membership fix. Previously, a kernel using qd.rsqrt inside a dynamic loop got its operand alloca demoted to a single-slot plain alloca, and the reverse pass read the last-iteration operand for every backward step.

Why

rsqrt is listed alongside sqrt / log / asin / acos as nonlinear in every other place in MakeAdjoint — it was an oversight that AdStackAllocaJudger didn't agree. Fixing it brings the set to parity with the reverse-mode formula coverage.

After this PR, unary_collections covers {abs, sin, cos, tan, tanh, asin, acos, exp, log, sqrt, rsqrt} — the 11 nonlinear ops that MakeAdjoint::visit(UnaryOpStmt*) calls accumulate(stmt->operand, ...) on. The only remaining diff-able unary op is neg, which is linear (gradient is a constant coefficient of adjoint), does not need the per-iteration adstack replay, and is intentionally absent.

The meta-test

New test_unary_collections_audit in tests/python/test_adstack.py. It parses quadrants/transforms/auto_diff.cpp at test time and asserts:

  1. Every UnaryOpType::X that MakeAdjoint::visit(UnaryOpStmt*) reaches via accumulate(stmt->operand, ...) is either in unary_collections or in a local _KNOWN_LINEAR_UNARY_OPS = {"neg"} allow-list.
  2. Every member of unary_collections has a matching accumulate(stmt->operand, ...) branch in MakeAdjoint (no stray entries).

The parse is regex-based and intentionally cheap — it splits the visitor's if / else-if chain at else if boundaries and looks for accumulate(stmt->operand inside each segment. cast_value has a conditional accumulate gated on real-typed elements and is excluded.

This prevents the whole class of bugs Autodiff 1–4 had to fix one op at a time: any future diff-able unary op that lands in MakeAdjoint without being classified triggers an explicit test failure pointing the contributor at both the C++ file and the allow-list.

Changes

quadrants/transforms/auto_diff.cpp

One entry added to NonLinearOps::unary_collections. Formatting is reflowed to fit 120 cols.

tests/python/test_adstack.py

  • _UNARY_OPS_PARAMS: add ("rsqrt", 0.05, 0.0) to the positive-domain group.
  • New _KNOWN_LINEAR_UNARY_OPS = {"neg"} module-level constant.
  • New test_unary_collections_audit (described above).

Side-effect audit

Concern Verdict
Existing rsqrt scalar AD Untouched; formula is already operand-based.
Dynamic-loop rsqrt Now correct; pinned by _UNARY_OPS_PARAMS.
Future unary-op additions Caught by test_unary_collections_audit at CI time.
Meta-test brittleness Regex tracks the if / else if / UnaryOpType::X shape of MakeAdjoint. If that visitor is ever rewritten to a switch, the meta-test needs a one-line update — acceptable cost.

Stack

Autodiff 4 of 13. Based on #502 (tanh/exp). Followed by #496 (alloca placement).

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — simple one-op addition to the nonlinear set with a matching test, following the exact pattern of existing ops.

Extended reasoning...

Overview

The PR touches two files: adds UnaryOpType::rsqrt to the NonLinearOps::unary_collections static set in auto_diff.cpp (a single element added to a brace-init list), and extends the @pytest.mark.parametrize list in test_adstack.py with (qd.rsqrt, "rsqrt").

Security risks

None. This is a compile-time set membership change in the autodiff IR pass. No user input handling, no auth, no crypto.

Level of scrutiny

Low. The change is mechanical: rsqrt was already handled in MakeAdjoint::visit(UnaryOpStmt*) with the correct reverse formula (-0.5 * rsqrt(x)^3), and MakeDual::visit(UnaryOpStmt*) likewise. The only missing piece was its absence from unary_collections, which controls whether AdStackAllocaJudger promotes the operand alloca to an AdStack. The fix is exactly the same as how all other nonlinear unary ops (sin, cos, sqrt, tanh, exp, etc.) are registered.

Other factors

The flagged bug in the inline comment is explicitly pre-existing and affects all ops in unary_collections equally — it is orthogonal to this PR. The new test covers the common single-load case that the fix targets. No CODEOWNER concerns; the change is self-contained.

Comment thread quadrants/transforms/auto_diff.cpp
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_tanh_exp_recompute branch from 8eefde1 to 6176818 Compare April 17, 2026 12:42
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from 8fd18b0 to d813066 Compare April 17, 2026 12:42
@hughperkins hughperkins changed the title [AutoDiff] Mark rsqrt as non-linear for adstack promotion [AutoDiff] Autodiff 4: Mark rsqrt as non-linear for adstack promotion Apr 17, 2026
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_tanh_exp_recompute branch from 6176818 to 03a53ec Compare April 17, 2026 15:57
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from d813066 to ce8e91b Compare April 17, 2026 15:57
@duburcqa

Copy link
Copy Markdown
Contributor Author

@claude review

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — surgical one-entry addition to NonLinearOps::unary_collections with a matching test case, consistent with all other ops in the set.

Extended reasoning...

Overview

The PR touches two files: adds UnaryOpType::rsqrt to the NonLinearOps::unary_collections set in auto_diff.cpp (one line) and adds ("rsqrt", 0.05, 0.0) to the test_adstack_unary_loop_carried parametrize list (one line). No logic is changed; no new code paths are introduced.

Security risks

None. This is a purely internal compiler IR classification change with no security surface.

Level of scrutiny

Low. The change is mechanical: adding one enum value to a std::set initializer that already contains ten sibling ops (abs, sin, cos, tan, tanh, asin, acos, exp, log, sqrt). The set drives AdStackAllocaJudger's decision to promote a loop-variant alloca to AdStack backing; omitting rsqrt from it was a straightforward omission bug that produces wrong gradients in dynamic loops.

Other factors

A pre-existing limitation in AdStackAllocaJudger (multi-load alloca pattern) was flagged in a prior review and has been acknowledged and resolved by the author as out-of-scope — it affects every op in the set equally and predates this PR. The new test exercises the common single-load case where the fix is effective, mirroring the coverage strategy used for sqrt, log, and the other domain-restricted ops. No bugs were found by the automated system.

@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_tanh_exp_recompute branch from 03a53ec to d55b19f Compare April 17, 2026 20:30
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from ce8e91b to 7d5ce3c Compare April 17, 2026 20:30

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — adding rsqrt to NonLinearOps::unary_collections is a one-entry surgical fix consistent with every other nonlinear op in the set, and the pre-existing AdStackAllocaJudger single-load limitation is acknowledged as out of scope.

Extended reasoning...

Overview

The PR touches two files: a one-line addition of UnaryOpType::rsqrt to the NonLinearOps::unary_collections static set in auto_diff.cpp, and a single new parametrize entry in test_adstack.py. No logic is changed; the set membership is the only delta.

Security risks

None. This is an internal compiler IR transformation with no user-facing security surface.

Level of scrutiny

Low. The change mirrors the existing pattern for every other nonlinear unary op (abs, sin, cos, tan, tanh, asin, acos, exp, log, sqrt). The reverse formula for rsqrt (-0.5 * rsqrt(x)^3) recomputes on the adstack-backed operand in MakeAdjoint::visit(UnaryOpStmt*) (already present in the file), so correctness in dynamic loops requires exactly this set membership.

Other factors

The pre-existing AdStackAllocaJudger single-load-tracking limitation was raised in a prior review and the author explicitly acknowledged it as out of scope — it equally affects all ten other ops already in the set and is not introduced by this PR. That inline comment is resolved. No bugs were found by the automated system. The test exercises the multi-iteration path (n_iter = 1, 3, 10) that would catch a stale-value regression.

@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from 7d5ce3c to 94e5650 Compare April 17, 2026 21:36

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — surgical and correct.

Extended reasoning...

Overview

The PR adds UnaryOpType::rsqrt to NonLinearOps::unary_collections (a one-element addition to an existing std::set) and extends the parametrized test_adstack_unary_loop_carried test with qd.rsqrt. No other code is touched.

Security risks

None. This is a compiler IR transform with no auth, crypto, or permission surface.

Level of scrutiny

Low. The change is mechanically identical to the ten existing entries in the set. The reverse formula for rsqrt (-0.5 * rsqrt(x)^3) recomputes solely on the adstack-backed operand, so promoting the operand alloca is both necessary and sufficient for correctness inside dynamic loops. The test covers the single-load path at multiple iteration counts and operand values.

Other factors

The pre-existing multi-load alloca tracking limitation in AdStackAllocaJudger that I flagged in a prior review affects all ten existing ops equally; the author acknowledged it as out of scope and resolved the inline comments. No new bugs were found by the bug hunting system. The PR is correctly scoped.

@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from 94e5650 to 421d30e Compare April 17, 2026 22:33

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — surgical one-liner that correctly adds rsqrt to NonLinearOps::unary_collections, with a matching test.

Extended reasoning...

Overview

The PR touches two files: (one entry added to the unary_collections initializer list) and (one entry added to the parametrize list). No logic is changed; only membership in a compile-time set is extended.

Correctness

rsqrt's reverse formula (-0.5 * rsqrt(x)^3) recomputes entirely from the operand, not from the forward rsqrt value — identical in structure to sqrt and log, both of which are already in the set. Without membership in unary_collections, AdStackAllocaJudger would not flag the operand alloca for AdStack promotion, leaving it as a plain alloca overwritten each forward iteration; the reversed loop would then read the last-forward value for every backward step, producing silently wrong gradients. The fix is correct.

Security risks

None. This is a pure autodiff IR transformation with no auth, crypto, or I/O surface.

Level of scrutiny

Low. The change is a one-line set membership extension that exactly mirrors the pattern used for the other ten ops in the set. The prior concern about the multi-load alloca pattern in AdStackAllocaJudger was raised in my previous review; the author acknowledged it as a pre-existing limitation affecting all ops equally, resolved the thread, and kept the PR surgical. Nothing substantive has changed since that exchange, and the concern is orthogonal to this PR's correctness.

Other factors

No bugs were reported by the automated hunter. The test parametrize entry uses the same (step=0.05, offset=0.0) pair as sqrt and log, appropriate for a positive-domain op. The n_iter ∈ {1,3,10} sweep exercises the multi-iteration path that would expose any missed AdStack promotion.

@hughperkins

Copy link
Copy Markdown
Collaborator

Opus description update:

What's in the PR

Net diff vs origin/duburcqa/split_autodiff_tanh_exp_recompute: 2 files, +3 / -2.

quadrants/transforms/auto_diff.cpp

  • Adds UnaryOpType::rsqrt to NonLinearOps::unary_collections (with a list-reflow for readability).
  • No MakeAdjoint/MakeDual change — the existing rsqrt reverse formula is already operand-based.

tests/python/test_adstack.py

  • Adds ("rsqrt", 0.05, 0.0) to the loop-carried unary parametrize, in the positive-domain group with sqrt/log/asin/acos. Same (step, offset) as sqrt since the
    domain (x > 0) coincides.

Good points

  • Smallest, cleanest patch in the chain. One-line set-membership change plus one parametrize entry. Trivial to review.
  • Correctly identifies that rsqrt only had problem (a) and not (b). The previous PRs in the stack established two separate failure modes for nonlinear unary ops in
    dynamic loops: missing from unary_collections (operand not adstack-backed) vs. reverse formula reusing stmt (BackupSSA stale-value). This PR correctly diagnoses that
    rsqrt only suffered from (a) and fixes only that, without unnecessary formula edits.
  • Pinned by the regression test from the baseline PR. The new parametrize entry exercises the exact loop-carried path that would have been silently broken before. If a
    future refactor regresses rsqrt's set membership or operand-based formula, the test catches it at n_iter ≥ 3.
  • No behavior change for existing call sites outside dynamic loops — the change only activates the adstack promotion path, which scalar/single-iteration code doesn't go
    through.

Bad points / concerns

  • Reinforces the case for a structural fix. This is now the fourth PR in a row patching unary_collections membership op-by-op (after tan, tanh, exp). The repeated
    occurrences argue for deriving the set from each unary op's nonlinearity at registration time, rather than maintaining a hand-curated list in C++ that's prone to drift from
    the Python op registry. The PR doesn't (and shouldn't, scope-wise) attempt that — but the chain of PRs is the strongest argument for it yet.
  • No assertion that the audit is complete. After this PR, unary_collections covers abs, sin, cos, tan, tanh, asin, acos, exp, log, sqrt, rsqrt. The differentiable
    unary ops in python/quadrants/lang/ops.py also include neg (linear, intentionally omitted) and a few non-differentiable ones (round, floor, ceil, frexp, bit_not,
    popcnt, logical_not). It would be worth a meta-test asserting that every diff-able unary op in the Python registry is either in unary_collections or in an explicit
    KNOWN_LINEAR allow-list — otherwise the next added unary op repeats this whole exercise.
  • Inherits all the limitations of the baseline test. Single dtype (f32 only), no f64 variant of the new entry, hard-coded n = 4 and stride 0.05.
  • Merge commit, not rebase. Branch was brought up to date via git merge rather than rebased onto split_autodiff_tanh_exp_recompute. History contains a merge commit;
    depending on repo conventions a clean rebase + force-push may be preferred.
  • Fourth PR in a stack on the same surface area. Reviewers need to merge split_adstack_unary_baselinesplit_autodiff_tan_derivative
    split_autodiff_tanh_exp_recompute → this PR in order, and any force-push to an upstream PR will require re-syncing this one. Not a code issue, just a process note.

@hughperkins

Copy link
Copy Markdown
Collaborator

Pleas address:

  • No assertion that the audit is complete. After this PR, unary_collections covers abs, sin, cos, tan, tanh, asin, acos, exp, log, sqrt, rsqrt. The differentiable
    unary ops in python/quadrants/lang/ops.py also include neg (linear, intentionally omitted) and a few non-differentiable ones (round, floor, ceil, frexp, bit_not,
    popcnt, logical_not). It would be worth a meta-test asserting that every diff-able unary op in the Python registry is either in unary_collections or in an explicit
    KNOWN_LINEAR allow-list — otherwise the next added unary op repeats this whole exercise.
  • Inherits all the limitations of the baseline test. Single dtype (f32 only), no f64 variant of the new entry, hard-coded n = 4 and stride 0.05.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — surgical, correct fix with appropriate test coverage.

Extended reasoning...

Overview

Two files changed: one entry added to the NonLinearOps::unary_collections set in auto_diff.cpp, and one parametrize entry added to test_adstack_unary_loop_carried in test_adstack.py. The rsqrt reverse formula (-0.5 * rsqrt(x)^3) already recomputes from the operand, so correctness in dynamic loops depends entirely on the operand's alloca being promoted to AdStack — which requires rsqrt to be in unary_collections.

Security risks

None. This is a pure compiler IR transformation change with no security surface.

Level of scrutiny

Low. The change exactly mirrors how the ten existing entries (sin, cos, sqrt, etc.) are registered. The test addition follows the established parametrize pattern and uses a (step, offset) pair that keeps the operand in the valid domain. The pre-existing AdStackAllocaJudger single-load limitation I flagged in the prior review was acknowledged as out-of-scope and equally affects all existing ops — it is not a regression from this PR.

Other factors

The inline comment was resolved by the author with a clear rationale. No outstanding concerns remain.

@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_tanh_exp_recompute branch from 4b07e89 to 10f6a42 Compare April 21, 2026 06:40
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from c27ceb3 to 121da95 Compare April 21, 2026 06:40
Comment thread tests/python/test_adstack.py
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from 121da95 to 783f8a3 Compare April 21, 2026 06:59
Comment thread tests/python/test_adstack.py
Comment thread tests/python/test_adstack.py
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_tanh_exp_recompute branch from 10f6a42 to a732de0 Compare April 21, 2026 07:19
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from 783f8a3 to 19251b8 Compare April 21, 2026 07:19
Comment thread tests/python/test_adstack.py
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from 19251b8 to 6b46265 Compare April 21, 2026 08:18
Comment thread tests/python/test_adstack.py
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_tanh_exp_recompute branch from a732de0 to 1cb37e4 Compare April 21, 2026 09:50
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from 6b46265 to 0df2b1d Compare April 21, 2026 09:50
Comment thread tests/python/test_adstack.py
Comment thread tests/python/test_adstack.py Outdated
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from 0df2b1d to ece6b34 Compare April 21, 2026 12:02
Comment thread tests/python/test_adstack.py Outdated

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the unresolved thread (12:36) describes a comment issue already absent from the current file; the "together" wording nit is caught at test time by the new assertion.

Extended reasoning...

Overview

Two files changed: (one-line addition to + helper) and (one parametrize entry, six new tests including ). The scope is narrow and surgical.

Security risks

No security-sensitive code paths. AD infrastructure is numerics-only; no auth, crypto, or permissions code touched.

Level of scrutiny

Low. The C++ change is a one-entry set-membership fix with a clear precedent (sqrt/log/asin/acos are all in the set for the same reason). The new helper adds a runtime invariant rather than changing any computed value. The Python meta-test is well-structured: all four invariants are enforced, instead of prevents OR-branch blindness, and the // checks are symmetric.

Other factors

The PR has been through a thorough review round: missing in forward-mode parametrize, first-match blindness, missing mutual-exclusion check, misleading completeness claim in comment, missing third invariant, missing guard, and the "Three" vs "Four" invariants docstring error were all caught and fixed. The only unresolved inline comment thread (id 3117439056, 12:36) flagged a self-contradictory "stmt reuse" criterion in a comment — that language is entirely absent from the current file, meaning the issue was already addressed by the 10:01 rescope. The "together" comment nit is deferred but is now harmless because the assertion traps any contributor who follows it literally.

@hughperkins

Copy link
Copy Markdown
Collaborator

Checklist:

  • just a bug fix => doesn't change existing API or usage
    • no need for doc changes
  • doesn't add significantly more test code around diverse files

=> ok to merge

@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_tanh_exp_recompute branch from 1cb37e4 to d7a863c Compare April 21, 2026 19:05
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from 0fec626 to e8eddfa Compare April 21, 2026 19:05
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_tanh_exp_recompute branch from d7a863c to b5d1028 Compare April 22, 2026 05:13
Base automatically changed from duburcqa/split_autodiff_tanh_exp_recompute to main April 22, 2026 06:57
…t to lead with the historical PR-1-to-4 audit rationale and drop the self-contradictory stmt-reuse claim
@duburcqa duburcqa force-pushed the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch from e8eddfa to 4873dea Compare April 22, 2026 07:01

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — all prior feedback addressed.

Extended reasoning...

Overview

This PR adds UnaryOpType::rsqrt to NonLinearOps::unary_collections (one line in auto_diff.cpp) and introduces a new accumulate_unary_operand_checked helper that asserts at IR-transform time that nonlinear reverse formulas do not read the forward stmt directly. On the test side it adds rsqrt to both parametrize lists and a new test_unary_collections_audit meta-test enforcing four symmetric invariants between unary_collections and _KNOWN_LINEAR_UNARY_OPS.

Security risks

None. This is a pure autodiff correctness fix with no security surface.

Level of scrutiny

Low. The C++ change is a single set-membership addition with no control-flow impact. The Python changes are test-only. The meta-test is a regex-based static analysis of the same C++ file — no execution paths in production code are affected.

Other factors

All inline comments I raised in earlier rounds have been resolved by the author: re.findall replaces re.search, the disjoint-sets overlap assertion was added, the third invariant (stray_linear) was added, the adj_end \!= -1 guard was added, the docstring count was corrected from three to four, and the misleading 'stmt reuse' criterion was removed from the forward-mode test comment. A human reviewer has also approved. No outstanding concerns remain.

@duburcqa duburcqa merged commit d7730f0 into main Apr 22, 2026
48 checks passed
@duburcqa duburcqa deleted the duburcqa/split_autodiff_mark_rsqrt_nonlinear branch April 22, 2026 08:31
npoulad1 added a commit to ROCm/quadrants that referenced this pull request Jun 8, 2026
* [Misc] Warn user to disable caching when print_ir/QD_DUMP_IR enabled (Genesis-Embodied-AI#425)

Co-authored-by: v01dxyz <v01dxyz@v01d.xyz>

* [Build] Pin torch version to CUDA 12.8 for CUDA tests (Genesis-Embodied-AI#428)

* [Misc] Fixing up taichi-dev urls (Genesis-Embodied-AI#429)

* [Perf] Rename cuda_graph to gpu_graph across the codebase (Genesis-Embodied-AI#430)

* Misc: fix typo integeral -> integral (Genesis-Embodied-AI#434)

Co-authored-by: v01dxyz <v01dxyz@v01d.xyz>

* [Perf] CUDA graph 4: call from multiple locations (Genesis-Embodied-AI#420)

* [Bug] Fix fastcache not restoring graph_do_while_arg (Genesis-Embodied-AI#435)

* [Perf] Cache last-call result in perf_dispatch for single-compatible case (Genesis-Embodied-AI#438)

* Fix gpu_graph fallback on old Nvidia GPU. (Genesis-Embodied-AI#443)

* Fix shared memory offset not reset between CUDA kernels. (Genesis-Embodied-AI#442)

* [Misc] Allow disabling GPU graph via QD_GPU_GRAPH=0 env var (Genesis-Embodied-AI#439)

* [Misc] Add named top-level loops (Genesis-Embodied-AI#440)

* [Misc] Rename gpu_graph to graph (Genesis-Embodied-AI#446)

* [Misc] Add cross-platform shuffle (Genesis-Embodied-AI#447)

* [Bug] Fix graph_do_while on Windows: search for cudadevrt.lib (Genesis-Embodied-AI#456)

* [Bug] Also search default CUDA toolkit install location on Windows (Genesis-Embodied-AI#461)

* [SPIRV] Feature Parity Atomics & Shared Array (Genesis-Embodied-AI#432)

* [Misc] Change clang format to 120 characters (Genesis-Embodied-AI#463)

* [Misc] CUDA graph 5 Add fatbin (Genesis-Embodied-AI#464)

* [Bug] Reuse VkInstance across init/reset cycles (Genesis-Embodied-AI#465)

* [Perf] Tiles 1: _load, _store, _eye_ (Genesis-Embodied-AI#466)

* [Misc] Remove dead InternalFuncStmt type_check override (Genesis-Embodied-AI#471)

* [Perf] Tiles 2: add cholesky and ger (Genesis-Embodied-AI#472)

* [Perf] Tiles 2b: add triangular solve (Genesis-Embodied-AI#474)

* [Misc] Refactor: use _get_col/_set_col in tiles load/store/init (Genesis-Embodied-AI#475)

* [Build] Fix flaky test_clock_accuracy (Genesis-Embodied-AI#436)

* Fix AARCH64 emitting invalid asm in CUDA kernels. (Genesis-Embodied-AI#473)

Co-authored-by: Hugh Perkins <hughperkins@gmail.com>

* [AMDGPU] Enable HIP memory pool and surface pool-exhaustion errors. (Genesis-Embodied-AI#485)

* [AMDGPU] Scope hsaco tmp dir per-user to avoid collisions. (Genesis-Embodied-AI#484)

* [Perf] Tiles 3: Add slice syntax, qd.outer() and initial doc (Genesis-Embodied-AI#477)

* [AMDGPU] Fix gradient computation. (Genesis-Embodied-AI#486)

* Enable all backends that are supported in unit tests. (Genesis-Embodied-AI#488)

* Fix SPIRV ID overflow for large kernels due to autodiff. (Genesis-Embodied-AI#489)

* [Misc] Fix purity checker to allow accessing constants from quadrants modules (Genesis-Embodied-AI#487)

* [Misc] Increase tolerance for clock monotonic test (Genesis-Embodied-AI#492)

* [CI] Serialize api doc workflow (Genesis-Embodied-AI#494)

* [CI] Increase tolerance for clock test (Genesis-Embodied-AI#506)

* [CI] Increase clock test tolerance to 20% (Genesis-Embodied-AI#509)

* [Perf] Add tensor_type parametrization to tile16 tests (Genesis-Embodied-AI#504)

* [Perf] Tiles 4b: Migrate tiles16 tests to enable fastcache (Genesis-Embodied-AI#505)

* [Perf] Tiles 4c: add Tiles16x16 proxy (Genesis-Embodied-AI#507)

* [Perf] Tiles 4d: Consolidate slice error tests using parametrize (Genesis-Embodied-AI#508)

* [Perf] Tiles 4: add SharedArray slice support (Genesis-Embodied-AI#482)

* [Perf] Tiles 5: add Cholesky benchmark demo (Genesis-Embodied-AI#483)

* [Doc] Add user guide page for subgroup shuffle (Genesis-Embodied-AI#512)

* [Perf] Implement cross-platform shuffle_down (Genesis-Embodied-AI#510)

* [Perf] Add portable subgroup reduce_add and reduce_all_add (Genesis-Embodied-AI#511)

* [Perf] Add first warmup config to perf dispatch (Genesis-Embodied-AI#422)

* [AutoDiff] Autodiff 1: Add baseline adstack regression test for unary_collections (Genesis-Embodied-AI#500)

* [AutoDiff] Autodiff 2: Implement derivative for tan (Genesis-Embodied-AI#501)

* [AutoDiff] Autodiff 3: Recompute tanh/exp on the operand in the reverse pass (Genesis-Embodied-AI#502)

* [AutoDiff] Autodiff 4: Mark rsqrt as non-linear for adstack promotion (Genesis-Embodied-AI#503)

* [AutoDiff] Autodiff 5: Fix adjoint-alloca placement for GlobalLoads outside the current range-for (Genesis-Embodied-AI#496)

* [AutoDiff] Autodiff 6: Adstack regression tests (Genesis-Embodied-AI#491)

* [AutoDiff] Autodiff 7: Fix header size in AdStackAllocaStmt to match u64 runtime layout (Genesis-Embodied-AI#534)

* [AutoDiff] Autodiff 8: Surface LLVM adstack push/pop overflow as a Python exception (Genesis-Embodied-AI#535)

* [AutoDiff] Autodiff 9: Guard against LLVM worker-thread stack overflow from large per-task adstack budget (Genesis-Embodied-AI#495)

* [AutoDiff] Autodiff 10: Implement adstack for SPIR-V (Genesis-Embodied-AI#490)

* [AutoDiff] Autodiff 11: Latent adstack-adjacent fixes (AMDGPU hipFree, flush() keeps ctx_buffers_, always-preallocate) (Genesis-Embodied-AI#536)

* [Doc] Add AGENTS.md with instructions for AI agents (Genesis-Embodied-AI#541)

* [Bug] Abort kernel execution on assertion failure instead of segfaulting (Genesis-Embodied-AI#419)

* [Type] ndarray typing 1: Add eval_str=True to inspect.signature() calls (Genesis-Embodied-AI#411)

* [CI] Suppress reportPrivateImportUsage in torch-using files (Genesis-Embodied-AI#552)

* [Misc] QD_DUMP_IR dumps to files with the task_id added to the filename (Genesis-Embodied-AI#441)

* [Type] ndarray typing 2: Fix NDArray single-arg subscript crash (Genesis-Embodied-AI#412)

* [Test] Flush xdist channel before worker exit so test failure reports are visible (Genesis-Embodied-AI#555)

* [CI] Reduce test retries on CI from 3 to 1. (Genesis-Embodied-AI#554)

* [AutoDiff] Autodiff 12: Heap-backed adstack on LLVM backends (CPU/CUDA/AMDGPU) (Genesis-Embodied-AI#537)

* [AutoDiff] Autodiff 13: Heap-backed adstack on SPIR-V backends (Metal, Vulkan) (Genesis-Embodied-AI#493)

* [AutoDiff] Autodiff 14: Resolve bounded-inner-loop adstacks without default_ad_stack_size fallback (Genesis-Embodied-AI#539)

* [SPIRV] Vulkan SPIR-V correctness: atomic-view aliasing, PSB stride, narrow storage caps, u1 cast, per-init layer recheck (Genesis-Embodied-AI#513)

* [Build] Autodiff 15: Replace 2022 MoltenVK pin with LunarG Vulkan SDK fetch and sanitise MoltenVK cap advertisement (Genesis-Embodied-AI#551)

* [Test] Suppress stock pytest-timeout to avoid conflict with pytest_hardtle (Genesis-Embodied-AI#557)

* [Vulkan] Use SDK validation layer for debugPrintf instead of apt package (Genesis-Embodied-AI#562)

* [Test] Fix flaky perf_dispatch tests by increasing work amounts (Genesis-Embodied-AI#559)

* [Test] Add --maxfail CLI option to run_tests.py (default 20) (Genesis-Embodied-AI#558)

* [CI] Vulkan debug printf fix to address flaky tests (Genesis-Embodied-AI#563)

* [Docs] Add a new page to help for first time contributors (Genesis-Embodied-AI#426)

Authored-by: v01dxyz <v01dxyz@v01d.xyz>

* [AutoDiff] Autodiff 16: Resolve reverse-mode adstack depths per-launch via runtime-evaluated SizeExpr (Genesis-Embodied-AI#543)

* Fix: raise error if device memory allocation fails (Genesis-Embodied-AI#451) (Genesis-Embodied-AI#453)

Co-authored-by: v01dxyz <v01dxyz@v01d.xyz>
Co-authored-by: Hugh Perkins <hughperkins@gmail.com>

* [CI] Add CI job to check line wrapping of comments and docs (Genesis-Embodied-AI#564)

* [Misc] Add coverage report to PRs, including kernels (Genesis-Embodied-AI#470)

* [CI] CI wrap check feeds only diffs to agent (Genesis-Embodied-AI#567)

* Skip 'flaky' test on MacOS CI. (Genesis-Embodied-AI#573)

* [Test] Fix missing `import sys` in test_fail_device_memory_allocation (Genesis-Embodied-AI#574)

* [CI] Fix Vulkan debugPrintf flake with session-scoped warmup (Genesis-Embodied-AI#571)

* [AutoDiff] determine_ad_stack_size: replace whole-CFG Bellman-Ford with SCC + DAG DP (Genesis-Embodied-AI#575)

* [Test] Fix macOS OOM skip reason to describe actual root cause (Genesis-Embodied-AI#576)

* [Lang] whole_kernel_cse: 2.5x compile time speedup on large kernels (Genesis-Embodied-AI#577)

* [CI] Add CI check for unnecessarily deleted comments (Genesis-Embodied-AI#570)

* [CI] Migrate coverage report to github Check page (Genesis-Embodied-AI#566)

* [Lang] Skip IR verifier between passes unless debug=true (Genesis-Embodied-AI#579)

* [Lang] Inline AdStack ops on release LLVM codegen: dramatically reduces compile time for adstack-enabled reverse-mode kernels (Genesis-Embodied-AI#584)

* [CUDA] Honor offline_cache=False end-to-end so QD_OFFLINE_CACHE=0 actually gives a cold compile (Genesis-Embodied-AI#580)

* [Type] Tensor 24 (Genesis-Embodied-AI#561)

Co-authored-by: hugh <hugh@slurm-login-0.slurm-login.tenant-slurm.svc.cluster.local>

* [Lang] auto_diff host-walk reductions: dramatically faster front-end compile time on adstack-enabled reverse-mode kernels (Genesis-Embodied-AI#587)

* [AutoDiff] Speed up reverse-mode kernel launches on GPU backends (Genesis-Embodied-AI#578)

* [Vulkan] Move adstack-sizer scratch out of Function-scope memory to fix SPIR-V pipeline build failures (Genesis-Embodied-AI#588)

* [AutoDiff] Improve diagnosis of unsupported reverse-mode AD patterns (Genesis-Embodied-AI#590)

* [Bug] Fix: promote Ndarray to AnyArray in build_Name for flattened struct fields (Genesis-Embodied-AI#592)

* [SPIR-V] Shrink reverse-grad kernel MSL by ~50% (Genesis-Embodied-AI#591)

* [CI] Add CI check that PR changes have test coverage (Genesis-Embodied-AI#596)

* [Perf] Enable zero-copy in to_torch() and to_numpy() (Genesis-Embodied-AI#450)

* Add BufferView: safe sub-range ndarray access for kernels (Genesis-Embodied-AI#585)

Co-authored-by: alanray-tech <alanray-tech@users.noreply.github.com>
Co-authored-by: Hugh Perkins <hughperkins@gmail.com>

* [Doc] Add user-facing fastcache documentation (Genesis-Embodied-AI#597)

Co-authored-by: hugh <hugh@slurm-login-0.slurm-login.tenant-slurm.svc.cluster.local>

* [Misc] Upgrade to enable v1 dlpack so to_numpy(copy=False) writable (Genesis-Embodied-AI#598)

Co-authored-by: root <root@rtx-209-201.slurm-compute.tenant-slurm.svc.cluster.local>

* [AutoDiff] Cut reverse-mode adstack memory usage 10x on all backends (Genesis-Embodied-AI#599)

* [Misc] Add CI check for feature file factorization (Genesis-Embodied-AI#606)

* [Perf] Skip _recursive_set_args for all-Field frozen dataclass structs (Genesis-Embodied-AI#607)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [AutoDiff] SNode-arm bound-expr capture rejects fold-attack gate indices (Genesis-Embodied-AI#610)

* [Misc] Suppress field fastcache warning for qd.Tensor (Genesis-Embodied-AI#615)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [AutoDiff] Adstack heap: clip reducer count by per-task loop trip count (compile-time and SizeExpr-evaluated) (Genesis-Embodied-AI#611)

* [Misc] Forward copy= through qd.Tensor, add copy=None option (Genesis-Embodied-AI#616)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [Doc] Update README (Genesis-Embodied-AI#617)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [CI] Fix coverage report showing def lines as uncovered (Genesis-Embodied-AI#623)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [Perf] Generic launcher: persistent context, JIT-pointer reuse, Metal compute encoder, LLVM-GPU async memory ops (Part 1/2) (Genesis-Embodied-AI#619)

* [CI] Encode Python-first testing policy in coverage-check prompt (Genesis-Embodied-AI#622)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [CI] Add PR Line change report (Genesis-Embodied-AI#624)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [CI] Disable quadrants pytest plugin during quadrants internal coverage runs (Genesis-Embodied-AI#629)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [AutoDiff] Adstack load+store eliminations: EliminateRecomputableAdStackPushes pass + leaf extensions (Genesis-Embodied-AI#621)

* [CI] Simplify coverage PR comment to a single linked line (Genesis-Embodied-AI#630)

* [CUDA] Add AGX Thor, SM_110 (Genesis-Embodied-AI#631)

Co-authored-by: Johnny Nunez and Hugh Perkins

* [CI] Lines changed report: collapse PR comment to a single linked totals line (Genesis-Embodied-AI#632)

* [FEATURE] Support external Metal command queue via qd.init (Genesis-Embodied-AI#618)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [Perf] Cache adstack-sizer metadata per task across SPIR-V + LLVM-GPU; per-snode / DeviceAllocation invalidation (Part 2/2) (Genesis-Embodied-AI#620)

* [AutoDiff] Disable EliminateRecomputableAdStackPushes pending mutated-SNode chain-leaf fix (Genesis-Embodied-AI#633)

* [AutoDiff] Adstack chain-clone safety: mutated-SNode leaf reject + load_top consumer-aware guard (Genesis-Embodied-AI#634)

* [Docs] Add user-guide page for qd.simt.block.* primitives (Genesis-Embodied-AI#638)

* [Docs] Expand qd.simt.subgroup user-guide page to cover every op (Genesis-Embodied-AI#639)

* [Perf] Streams 1-4 (Genesis-Embodied-AI#410)

* [Docs] Add user-guide page for matrix decompositions and solvers (Genesis-Embodied-AI#643)

* [Bug] Revert "[Perf] Streams 1-4 (Genesis-Embodied-AI#410)" (Genesis-Embodied-AI#650)

* [Docs] Add user-guide page for atomics and bit operations (Genesis-Embodied-AI#640)

* [Docs] Add user-guide page for qd.simt.grid.* primitives (Genesis-Embodied-AI#641)

* [AutoDiff] Adstack max-reducer: parallel multi-axis MaxOverRange dispatch (Genesis-Embodied-AI#635)

* [AMDGPU] Fix amdgpu parallel rand init (Genesis-Embodied-AI#658)

* [Perf] Adstack: skip max-reducer recognizer on CPU + lift host-eval cap (Genesis-Embodied-AI#655)

* [Perf] Re-land Streams 1-4 with bug fixes (Genesis-Embodied-AI#653)

* [AMDGPU] Apply device_memory_GB=0.3 cap to AMDGPU tests (Genesis-Embodied-AI#659)

* [Perf] Per-launch host sync: drop wait_idle on SPIR-V, pin stream and drop stream_synchronize on CUDA/AMDGPU (Genesis-Embodied-AI#654)

* [AMDGPU] Unload hipModule_t in JITModuleAMDGPU destructor (Genesis-Embodied-AI#660)

* [AMDGPU] Trim default mempool on qd.reset() (Genesis-Embodied-AI#669)

* [AMDGPU] Hoist rand-state buffer to process lifetime (Genesis-Embodied-AI#668)

* [Streams] Use events for streams serialization on AMDGPU and CUDA (Genesis-Embodied-AI#667)

* [Perf] Adstack max-reducer: launch cache + zero-copy result map; content-stable registry_id (Genesis-Embodied-AI#671)

* [SPIR-V] dispatch_max_reducers: register each task with the real kernel name (Genesis-Embodied-AI#675)

* [AutoDiff] Debug-mode field/grad/dual: dtype, layout, and access-time invariants (Genesis-Embodied-AI#677)

* [Docs] Add user-guide page for qd.algorithms.* device-wide algorithms (Genesis-Embodied-AI#642)

Co-authored-by: alanray-tech <alan.ray@genesis-ai.company>

* [Docs] Doc for existing atomics: switch support table to per-backend columns (Genesis-Embodied-AI#657)

Co-authored-by: alanray-tech <alan.ray@genesis-ai.company>

* [GPU] Cross gpu atomics (Genesis-Embodied-AI#666)

Co-authored-by: alanray-tech <alan.ray@genesis-ai.company>

* [GPU] Make block operations portable cross-gpu (Genesis-Embodied-AI#664)

* [Perf] CPU LLVM adstack-cache: skip per-launch bump-writes + ndarray_shapes capture on forward-only handles (Genesis-Embodied-AI#685)

* [GPU] Cross-GPU for grid ops (Genesis-Embodied-AI#670)

* [Math] Make bitop operations portable cross-gpu (Genesis-Embodied-AI#662)

* [AMDGPU] Always use wave64, on both RDNA and CDNA (Genesis-Embodied-AI#687)

* [AMDGPU] Use syncscope("agent") for atomix xor to avoid CAS livelock (Genesis-Embodied-AI#672)

* [GPU] New bit ops for QIPC (Genesis-Embodied-AI#679)

* [GPU] Subgroup ops cross-gpu (Genesis-Embodied-AI#665)

* [Graph] Rename CUDA Graph to Graph in docs (Genesis-Embodied-AI#691)

* [SPIR-V] Fix FIFO-queue ordering when sharing command queue. (Genesis-Embodied-AI#694)

* [Atomics] New QIPC ops for atomics (Genesis-Embodied-AI#690)

* Pass dataclass sub-structs into qd.func (Genesis-Embodied-AI#698)

* [AMDGPU] HIP graph runtime support for @qd.kernel(graph=True) (Genesis-Embodied-AI#692)

* [CI] Add per-file timing report to Mac Metal test job (Genesis-Embodied-AI#695)

Co-authored-by: Cursor <cursoragent@cursor.com>

* [CI] Enable kernel disk cache during tests (Genesis-Embodied-AI#696)

* [Math] New QIPC ops for single-threaded linalg (Genesis-Embodied-AI#683)

* [BREAKING][GPU] New QIPC ops for subgroups (Genesis-Embodied-AI#676)

* [GPU] New QIPC ops for block (Genesis-Embodied-AI#684)

* [GPU] New device-level ops for QIPC (Genesis-Embodied-AI#693)

* [algorithms] PrefixSumExecutor: drop unused GRID_SZ local (Genesis-Embodied-AI#701)

* [block] sync(): fix unsupported-arch error message (Genesis-Embodied-AI#700)

* [volatile_load] add qd.volatile_load primitive (closes Genesis-Embodied-AI#648) (Genesis-Embodied-AI#702)

* [AutoDiff] Reject recycled identity_key in AdStackCache::register_adstack_sizing_info (Genesis-Embodied-AI#708)

* [Vulkan] Declare GroupNonUniform SPIR-V caps and enable shaderSubgroupExtendedTypes (Genesis-Embodied-AI#707)

* Fix duplicate HIP graph driver-function declarations after v1.0.0 merge

The amd-integration fork had cherry-picked the HIP graph driver functions
(graph_create / graph_destroy / graph_add_kernel_node / graph_instantiate /
graph_exec_destroy / graph_launch), and upstream v1.0.0 added the same set.
The per-file 3-way merge appended both copies into
amdgpu_driver_functions.inc.h, producing redeclaration errors that broke the
AMDGPU RHI/runtime compile. Drop the upstream duplicate block; the signatures
are identical to the fork's existing declarations.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix AMDGPU launcher coherence and num_instructions visibility after v1.0.0 merge

- kernel_launcher.cpp: the 3-way merge spliced upstream v1.0.0's launch_llvm_kernel
  rewrite (ephemeral arg/context buffers, explicit-stream path, AmdgpuDefaultStream
  PinGuard) onto the AMD fork's kernarg-by-value + persistent-scratch design,
  leaving references to undefined `ephemeral_context_ptr`. Restore the fork's
  coherent launch_llvm_kernel verbatim; it calls the (already merged) enhanced
  launch_offloaded_tasks, which keeps the max-reducer dispatch and stream-parallel
  groups adapted onto the AMD launch path.
- llvm_context.h: both the fork and upstream added `num_instructions`; the merge
  kept upstream's private placement, but the AMDGPU codegen force-inline heuristic
  calls it statically from outside the class. Move it back to the public section.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Restore async result D2H and hoist kernarg vectors in AMDGPU launcher

The v1.0.0 merge resolution regressed two amd-integration baseline
optimizations in launch_llvm_kernel / launch_offloaded_tasks:

  - The per-launch result-buffer copy was a blocking memcpy_device_to_host,
    forcing a host stall on every value-returning launch and serializing the
    GPU pipeline. Restore the async D2H (the caller synchronizes lazily when it
    needs the value); external-array transfers still stream_synchronize once
    before reading back.

  - launch_task constructed the kernarg std::vectors from initializer lists
    ({kernarg_payload} / {kernarg_size}) on every dispatch (heap alloc + free
    per launch). Hoist arg_ptrs/arg_sizes out of the per-task launch and reuse.

Co-authored-by: Cursor <cursoragent@cursor.com>

* amdgpu: default to LDS permlane64 emulation; drop host-x86 barrier asm on retarget

Two AMDGPU JIT-compile crashes surfaced after the v1.0.0 merge pulled in the QIPC subgroup
ops (Genesis-Embodied-AI#676), which made the rigid constraint solver's wave-cooperative reductions route through
`amdgpu_cross_half_shuffle_i32`. Both manifested as a SIGSEGV inside
`llvm::SIInstrInfo::getInstSizeInBytes` during `JITSessionAMDGPU::compile_module_to_hsaco`
(i.e. at first kernel launch), and reproduce on gfx942 / MI300X. Baseline 0.4.6 never emitted
these constructs, which is why it was unaffected.

1. Native `llvm.amdgcn.permlane64` lowering crashes the bundled LLVM 22.1.0 AMDGPU backend.
   Default `amdgpu_permlane64` to the existing LDS-roundtrip software emulation on every target
   (it produces identical results). Add `QD_AMDGPU_USE_NATIVE_PERMLANE64=1` to opt back into the
   native instruction once the backend bug is fixed; the old `QD_AMDGPU_FORCE_PERMLANE64_FALLBACK`
   is now the default and still honored. This is the actual crash fix.

2. The runtime module is compiled by the host x86_64 clang and only retargeted to amdgcn here, so
   `amdgpu_cross_half_shuffle_i32`'s `__asm__ volatile("" : "+v"(byte))` optimization barrier carries
   x86 flag clobbers (`~{dirflag},~{fpsr},~{flags}`) that are meaningless on AMDGPU. The IR verifies
   but the empty-body INLINEASM is invalid on the amdgcn target. Neutralize empty-body barrier asm
   during retarget (forward the tied value, then erase) so no stale host asm reaches codegen. On the
   wave64 targets we ship `ds_bpermute` already addresses the full wave, so the hint is a no-op.

Co-authored-by: Cursor <cursoragent@cursor.com>

* style: apply clang-format (v19.1.7) to AMDGPU fn_attrs and launcher sources

CI pre-commit's clang-format hook reformatted these files (long
declarations/lambda signatures collapsed onto single lines per the repo's
clang-format config). Apply the same formatting so the hook passes.

No functional changes.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(amdgpu): use CreateNeg for branchless i32 sgn instead of CreateSub(0, input)

clang-tidy (modernize-use-nullptr, -warnings-as-errors) flagged
`builder->CreateSub(0, input)` in the i32 sgn path: the literal `0` binds to
the `llvm::Value*` LHS parameter as a null pointer, not an integer zero.
Replace with `builder->CreateNeg(input)`, which emits `0 - input` with a proper
zero constant -- identical intended semantics, and clang-tidy clean.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Robert Dazi <14996868+v01dXYZ@users.noreply.github.com>
Co-authored-by: v01dxyz <v01dxyz@v01d.xyz>
Co-authored-by: Hugh Perkins <hughperkins@gmail.com>
Co-authored-by: Alexis DUBURCQ <alexis.duburcq@gmail.com>
Co-authored-by: hugh <hugh@slurm-login-0.slurm-login.tenant-slurm.svc.cluster.local>
Co-authored-by: alanray-tech <alan.ray@genesis-ai.company>
Co-authored-by: alanray-tech <alanray-tech@users.noreply.github.com>
Co-authored-by: root <root@rtx-209-201.slurm-compute.tenant-slurm.svc.cluster.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Johnny <johnnynuca14@gmail.com>
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