Rules catalog
All rules grouped by category. Each entry links to the dedicated rule page, which includes the GPU-mechanism reasoning and (where applicable) the quick-fix rewrite.
Status: v0.5.6 shipped — 154 rules ship end-to-end across the categories below. The catalog also lists ~30 doc-only stubs for rules queued in ADR 0007 / ADR 0010 / ADR 0011 that have not landed yet — those pages document design intent ahead of code. See ROADMAP for the phase-by-phase plan.
Total rules documented: 210
Legend
| Severity | Meaning |
|---|---|
error | Correctness issue or undefined behaviour. Blocks CI when mode is deny. |
warn | Performance anti-pattern or code smell. Default for most rules. |
info | Style or modernisation hint. Never blocks CI. |
| Applicability | Meaning |
|---|---|
machine-applicable | The fix can be applied automatically and is always correct. |
suggestion | A fix is shown but requires human intent-verification before applying. |
none | No automated fix; the diagnostic only explains the problem. |
Math
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
acos-without-saturate | warn | machine-applicable | 4 |
countbits-vs-manual-popcount | warn | suggestion | 2 |
cross-with-up-vector | warn | machine-applicable | 2 |
div-without-epsilon | warn | machine-applicable | 4 |
dot-on-axis-aligned-vector | warn | machine-applicable | 2 |
dot4add-opportunity | warn | suggestion | 8 |
firstbit-vs-log2-trick | warn | machine-applicable | 2 |
inv-sqrt-to-rsqrt | warn | machine-applicable | 2 |
isnormal-pre-sm69 | error | suggestion | 3 |
isspecialfloat-implicit-fp16-promotion | warn | suggestion | 3 |
length-comparison | warn | machine-applicable | 2 |
length-then-divide | warn | machine-applicable | 2 |
lerp-extremes | warn | machine-applicable | 2 |
lerp-on-bool-cond | warn | machine-applicable | 2 |
manual-distance | warn | machine-applicable | 2 |
manual-mad-decomposition | warn | suggestion | 2 |
manual-reflect | warn | machine-applicable | 2 |
manual-refract | warn | suggestion | 2 |
manual-smoothstep | warn | machine-applicable | 2 |
manual-step | warn | machine-applicable | 2 |
mul-identity | warn | machine-applicable | 2 |
pow-base-two-to-exp2 | warn | machine-applicable | 2 |
pow-const-squared | warn | machine-applicable | 2 |
pow-integer-decomposition | warn | suggestion | 2 |
pow-to-mul | warn | machine-applicable | 2 |
precise-missing-on-iterative-refine | warn | suggestion | 4 |
redundant-unorm-snorm-conversion | warn | suggestion | 2 |
repeated-pure-intrinsic | warn | suggestion | 4 |
select-vs-lerp-of-constant | warn | machine-applicable | 2 |
sin-cos-pair | warn | machine-applicable | 2 |
sqrt-of-potentially-negative | warn | machine-applicable | 4 |
wavereadlaneat-constant-zero-to-readfirst | warn | machine-applicable | 2 |
Saturate / redundancy
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
clamp01-to-saturate | warn | machine-applicable | 2 |
redundant-abs | warn | machine-applicable | 2 |
redundant-normalize | warn | machine-applicable | 2 |
redundant-saturate | warn | machine-applicable | 2 |
redundant-transpose | warn | machine-applicable | 2 |
Bindings
Texture / sampling
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
anisotropy-without-anisotropic-filter | warn | suggestion | 3 |
bgra-rgba-swizzle-mismatch | warn | suggestion | 3 |
comparison-sampler-without-comparison-op | warn | suggestion | 3 |
gather-channel-narrowing | note | machine-applicable | 3 |
gather-cmp-vs-manual-pcf | warn | suggestion | 3 |
manual-srgb-conversion | warn | suggestion | 3 |
mip-clamp-zero-on-mipped-texture | warn | suggestion | 3 |
samplecmp-vs-manual-compare | warn | suggestion | 3 |
samplegrad-with-constant-grads | warn | machine-applicable | 3 |
samplelevel-with-zero-on-mipped-tex | warn | suggestion | 3 |
texture-array-known-slice-uniform | note | suggestion | 3 |
texture-as-buffer | note | suggestion | 3 |
texture-lod-bias-without-grad | warn | suggestion | 3 |
Workgroup / groupshared
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
compute-dispatch-grid-shape-vs-quad | warn | suggestion | 3 |
groupshared-16bit-unpacked | warn | suggestion | 3 |
groupshared-atomic-replaceable-by-wave | warn | suggestion | 4 |
groupshared-dead-store | warn | suggestion | 4 |
groupshared-first-read-without-barrier | error | none | 4 |
groupshared-overwrite-before-barrier | warn | suggestion | 4 |
groupshared-stride-32-bank-conflict | warn | suggestion | 4 |
groupshared-stride-non-32-bank-conflict | warn | suggestion | 4 |
groupshared-too-large | warn | none | 3 |
groupshared-union-aliased | warn | suggestion | 3 |
groupshared-volatile | warn | machine-applicable | 2 |
groupshared-when-registers-suffice | warn | suggestion | 7 |
groupshared-write-then-no-barrier-read | error | none | 4 |
interlocked-bin-without-wave-prereduce | warn | suggestion | 4 |
interlocked-float-bit-cast-trick | warn | suggestion | 4 |
numthreads-not-wave-aligned | warn | suggestion | 3 |
numthreads-too-small | warn | none | 3 |
numwaves-anchored-cap | warn | suggestion | 8 |
wave-prefix-sum-vs-scan-with-atomics | warn | suggestion | 4 |
wavesize-attribute-missing | warn | suggestion | 3 |
Control flow
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
barrier-in-divergent-cf | error | none | 4 |
branch-on-uniform-missing-attribute | warn | suggestion | 4 |
cbuffer-load-in-loop | warn | machine-applicable | 4 |
clip-from-non-uniform-cf | warn | suggestion | 4 |
derivative-in-divergent-cf | error | none | 4 |
discard-then-work | warn | none | 4 |
early-z-disabled-by-conditional-discard | warn | suggestion | 4 |
flatten-on-uniform-branch | warn | suggestion | 4 |
forcecase-missing-on-ps-switch | warn | suggestion | 4 |
groupshared-uninitialized-read | error | none | 4 |
loop-attribute-conflict | warn | suggestion | 2 |
loop-invariant-sample | warn | suggestion | 4 |
manual-wave-reduction-pattern | warn | suggestion | 4 |
quadany-quadall-opportunity | warn | suggestion | 4 |
redundant-computation-in-branch | warn | machine-applicable | 4 |
sample-in-loop-implicit-grad | warn | suggestion | 4 |
small-loop-no-unroll | warn | suggestion | 4 |
wave-active-all-equal-precheck | warn | suggestion | 4 |
wave-intrinsic-helper-lane-hazard | warn | none | 4 |
wave-intrinsic-non-uniform | error | none | 4 |
wavereadlaneat-constant-non-zero-portability | warn | suggestion | 3 |
Mesh / amplification
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
as-payload-over-16k | error | none | 3 |
dispatchmesh-grid-too-small-for-wave | warn | suggestion | 8 |
dispatchmesh-not-called | error | none | 4 |
mesh-numthreads-over-128 | error | none | 3 |
mesh-output-decl-exceeds-256 | error | none | 3 |
meshlet-vertex-count-bad | warn | suggestion | 7 |
output-count-overrun | warn | suggestion | 7 |
primcount-overrun-in-conditional-cf | error | none | 4 |
setmeshoutputcounts-in-divergent-cf | error | none | 4 |
Ray tracing (DXR)
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
anyhit-heavy-work | warn | suggestion | 4 |
inline-rayquery-when-pipeline-better | warn | suggestion | 4 |
missing-accept-first-hit | warn | suggestion | 7 |
missing-ray-flag-cull-non-opaque | warn | suggestion | 3 |
oversized-ray-payload | warn | suggestion | 7 |
pipeline-when-inline-better | warn | suggestion | 4 |
ray-flag-force-opaque-with-anyhit | warn | suggestion | 8 |
recursion-depth-not-declared | warn | suggestion | 7 |
tracerray-conditional | warn | suggestion | 4 |
triangle-object-positions-without-allow-data-access-flag | warn | suggestion | 8 |
Work graphs
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
mesh-node-missing-output-topology | error | none | 3 |
mesh-node-not-leaf | error | none | 3 |
mesh-node-uses-vertex-shader-pipeline | error | none | 3 |
nodeid-implicit-mismatch | error | none | 3 |
outputcomplete-missing | error | none | 4 |
quad-or-derivative-in-thread-launch-node | error | none | 4 |
Shader execution reordering (SER)
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
coherence-hint-encodes-shader-type | warn | suggestion | 4 |
coherence-hint-redundant-bits | warn | machine-applicable | 4 |
fromrayquery-invoke-without-shader-table | error | none | 4 |
hitobject-construct-outside-allowed-stages | error | none | 3 |
hitobject-invoke-after-recursion-cap | error | none | 4 |
hitobject-passed-to-non-inlined-fn | error | none | 4 |
hitobject-stored-in-memory | error | none | 3 |
maybereorderthread-outside-raygen | error | none | 3 |
maybereorderthread-without-payload-shrink | warn | suggestion | 7 |
reordercoherent-uav-missing-barrier | error | none | 4 |
ser-coherence-hint-bits-overflow | warn | machine-applicable | 8 |
ser-trace-then-invoke-without-reorder | warn | suggestion | 4 |
Cooperative vectors
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
coopvec-base-offset-misaligned | error | none | 3 |
coopvec-fp8-with-non-optimal-layout | error | none | 3 |
coopvec-non-optimal-matrix-layout | warn | suggestion | 3 |
coopvec-non-uniform-matrix-handle | warn | suggestion | 4 |
coopvec-stride-mismatch | error | none | 3 |
coopvec-transpose-without-feature-check | warn | suggestion | 3 |
Long vectors
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
long-vector-bytebuf-load-misaligned | warn | suggestion | 3 |
long-vector-in-cbuffer-or-signature | error | suggestion | 3 |
long-vector-non-elementwise-intrinsic | error | none | 2 |
long-vector-typed-buffer-load | error | suggestion | 3 |
Opacity micromaps
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
omm-allocaterayquery2-non-const-flags | error | none | 3 |
omm-rayquery-force-2state-without-allow-flag | error | suggestion | 3 |
omm-traceray-force-omm-2state-without-pipeline-flag | error | none | 3 |
Sampler feedback
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
feedback-every-sample | warn | suggestion | 4 |
feedback-write-wrong-stage | error | none | 3 |
sampler-feedback-without-streaming-flag | warn | suggestion | 3 |
Variable-rate shading
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
sv-depth-vs-conservative-depth | warn | suggestion | 3 |
vrs-incompatible-output | warn | suggestion | 3 |
vrs-rate-conflict-with-target | warn | suggestion | 8 |
vrs-without-perprimitive-or-screenspace-source | warn | suggestion | 8 |
Wave / helper lane
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
quadany-quadall-non-quad-stage | error | none | 3 |
quadany-replaceable-with-derivative-uniform-branch | warn | suggestion | 4 |
startvertexlocation-not-vs-input | error | none | 3 |
wave-reduction-pixel-without-helper-attribute | warn | suggestion | 4 |
waveops-include-helper-lanes-on-non-pixel | error | machine-applicable | 3 |
wavesize-fixed-on-sm68-target | warn | suggestion | 3 |
wavesize-range-disordered | error | machine-applicable | 2 |
Packed math
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
manual-f32tof16 | warn | machine-applicable | 7 |
min16float-in-cbuffer-roundtrip | warn | suggestion | 7 |
min16float-opportunity | note | suggestion | 7 |
pack-clamp-on-prove-bounded | warn | suggestion | 7 |
pack-then-unpack-roundtrip | warn | machine-applicable | 7 |
unpack-then-repack | warn | suggestion | 7 |
Memory / IR-level
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
live-state-across-traceray | warn | none | 7 |
redundant-texture-sample | warn | none | 7 |
sample-use-no-interleave | warn | suggestion | 8 |
scratch-from-dynamic-indexing | warn | none | 7 |
vgpr-pressure-warning | warn | none | 7 |
Numerical / misc
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
compare-equal-float | warn | machine-applicable | 2 |
comparison-with-nan-literal | error | machine-applicable | 2 |
redundant-precision-cast | warn | machine-applicable | 2 |
blackwell
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
coopvec-fp4-fp6-blackwell-layout | warn | suggestion | 8 |
linalg
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
linalg-matrix-element-type-mismatch | warn | suggestion | 8 |
linalg-matrix-non-optimal-layout | warn | suggestion | 8 |
rdna4
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
oriented-bbox-not-set-on-rdna4 | warn | suggestion | 8 |
rga-pressure-bridge-stub | note | none | 8 |
wave64-on-rdna4-compute-misses-dynamic-vgpr | warn | suggestion | 8 |
slang-language
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
slang-associatedtype-shadowing-builtin | warn | none | 8 |
slang-generic-without-constraint | warn | suggestion | 8 |
slang-interface-conformance-missing-method | error | none | 8 |
slang-module-import-without-use | warn | suggestion | 8 |
sm6_10
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
cluster-id-without-cluster-geometry-feature-check | warn | suggestion | 8 |
getgroupwaveindex-without-wavesize-attribute | warn | suggestion | 8 |
groupshared-over-32k-without-attribute | warn | machine-applicable | 8 |
reference-data-type-not-supported-pre-sm610 | warn | suggestion | 8 |
xe2
| Rule | Severity | Applicability | Phase |
|---|---|---|---|
wavesize-32-on-xe2-misses-simd16 | warn | suggestion | 8 |
For contributors adding a new rule: start from docs/rules/_template.md. The catalog above is generated from each page's YAML front-matter at build time — keep id, category, severity, applicability, and phase accurate and the entry will appear automatically.