Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3028,6 +3028,18 @@ make `core/AGENTS.md` a generated index over `AGENTS.d/` topic pages ([ADR-1454]
command it cannot read, so the lane cannot go blind silently again.


- **The SYCL clang-tidy lane measures the x86 SIMD and DNN sources again.**
Since the strict floating-point arguments became project-wide (ADR-1461),
151 translation units of an icx build carry them twice, and stock clang
answers the repeat with a driver warning that has no source location. The
ratchet treats such a warning as an unusable measurement, so
`make tidy-ratchet LANE=sycl` stopped with exit 4 and no baseline entry of
those files could be tightened. `scripts/ci/clang-tidy-sycl.sh` silences
that one driver note (`-Wno-overriding-option`); the compile commands and
every check stay as they were
(`T-SYCL-TIDY-OVERRIDING-OPTION-2026-10-02`).


- **A SYCL error while de-tiling a VA surface no longer ends the process.**
`vmaf_sycl_import_va_surface()` submitted its de-tile copy or kernel outside
any `try`, so a synchronous `sycl::exception` (a kernel the device cannot
Expand Down
10 changes: 10 additions & 0 deletions changelog.d/fixed/sycl-tidy-overriding-option.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
- **The SYCL clang-tidy lane measures the x86 SIMD and DNN sources again.**
Since the strict floating-point arguments became project-wide (ADR-1461),
151 translation units of an icx build carry them twice, and stock clang
answers the repeat with a driver warning that has no source location. The
ratchet treats such a warning as an unusable measurement, so
`make tidy-ratchet LANE=sycl` stopped with exit 4 and no baseline entry of
those files could be tightened. `scripts/ci/clang-tidy-sycl.sh` silences
that one driver note (`-Wno-overriding-option`); the compile commands and
every check stay as they were
(`T-SYCL-TIDY-OVERRIDING-OPTION-2026-10-02`).
14 changes: 14 additions & 0 deletions docs/development/oneapi-install.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,20 @@ For the `clang-tidy` lane there's a parallel wrapper —
`__SYCL_DEVICE_ONLY__=0` so SYCL TUs lint cleanly. See
[ADR-0217](../adr/0217-sycl-toolchain-cleanup.md).

The wrapper also adapts an icx compile database to stock clang: it rewrites
`-fp-model=` to `-ffp-model=` in a copy of `compile_commands.json`, and it
passes `-Wno-unknown-warning-option`, `-Wno-unknown-pragmas` and
`-Wno-overriding-option`. The last one is needed because a target that names
the strict floating-point arguments next to the project-wide ones compiles
with `-fp-model=precise -ffp-contract=off` twice; clang's driver comments on
the repeat with a warning that has no source location, and
`scripts/ci/tidy-ratchet.py` counts a warning it cannot place as a failed
translation unit. To check the wrapper after a toolchain change:

```bash
python3 -B -m unittest discover -s scripts/ci/tests -p 'test_tidy_ratchet.py'
```

## Verify the SYCL build picks up the new compiler

After installing a new oneAPI version:
Expand Down
9 changes: 9 additions & 0 deletions docs/rebase-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -58750,3 +58750,12 @@ The AVX-512 filter tables are file-level `dwt2_filter_lo` / `dwt2_filter_hi` (th
Kept: the `+0` start of every sum (signed-zero parity with `adm_dwt2_s()`), multiply then add with no fused form, the `float accum` sequences of the tail and of the horizontal pass, the tail bounds. Each function carries the GCC `optimize("-ffp-contract=off")` attribute, as `adm_dwt2_s()` and its two pass helpers do; a new helper needs it too. In `float_adm_neon.c` only declarations and row-pointer casts changed (`(ptrdiff_t)i * stride`).

`core/src/feature/adm_tools.c`: the comment above `adm_dwt2_vert_pass_s()` said the wavelet stays one function; it is three functions, and the comment now says so. The `NOLINTNEXTLINE(readability-function-size)` on `adm_dwt2_s()` suppressed nothing and is gone. No code changed in that file, nor in `x86/adm_avx2.c` / `x86/adm_avx512.c` (SPDX line only).
## SYCL tidy wrapper: `-Wno-overriding-option` (2026-10-02)

`fix/sycl-tidy-overriding-option`, `T-SYCL-TIDY-OVERRIDING-OPTION-2026-10-02`.

- `scripts/ci/clang-tidy-sycl.sh` passes `-extra-arg-before=-Wno-overriding-option`.
Keep it when the wrapper is touched: without it every translation unit whose
target repeats `vmaf_strict_fp_args` (151 on an icx build) is a compile
failure in the `sycl` tidy lane.
- No source, score, public C API, Netflix golden-data or FFmpeg patch impact.
3 changes: 3 additions & 0 deletions docs/state.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ _Updated: 2026-10-02 (ADR-1454 on `docs/agents-index-feature-cuda`, RC3: `T-AGEN
_Updated: 2026-10-02 (ADR-1454 on `docs/agents-index-feature-hip`, RC3: `T-AGENTS-INDEX-MIGRATION-2026-10-02` — `core/src/feature/hip/AGENTS.md` (87 990 bytes) is now an index of 8 608 bytes generated from 40 topic pages under `core/src/feature/hip/AGENTS.d/`; 3 files remain.)_
_Updated: 2026-10-02 (ADR-1454 on `docs/agents-index-feature-sycl`, RC3: `T-AGENTS-INDEX-MIGRATION-2026-10-02` — `core/src/feature/sycl/AGENTS.md` (81 518 bytes) is now an index of 9 873 bytes generated from 38 topic pages under `core/src/feature/sycl/AGENTS.d/`; 3 files remain.)_
_Updated: 2026-10-02 (`chore/ir-snapshots-refresh`): `T-IR-SNAPSHOTS-STALE-2026-10-02` opened and closed — three of the eight LLVM IR snapshots of `make ir-diff` (ADR-0918) had drifted behind their sources; the functions equal their scalar references on every measured frame, so the snapshots are regenerated. `make ir-diff` is not part of any gate._
_Updated: 2026-10-02 (`fix/sycl-tidy-overriding-option`, RC3: `T-SYCL-TIDY-OVERRIDING-OPTION-2026-10-02` found and closed — since ADR-1461 (PR #1829) made the strict FP arguments project-wide, 151 translation units of an icx build record `-fp-model=precise -ffp-contract=off` twice; stock clang's driver answers with a warning that has no source location, the ratchet fails closed on it, and `make tidy-ratchet LANE=sycl` exited 4. `scripts/ci/clang-tidy-sycl.sh` now passes `-Wno-overriding-option`.)_

_Updated: 2026-10-02 (`rc3-ledger-relabel`, ADR-1421): `T-STATE-LEDGER-RC-RELABEL-2026-10-01` closed — the disposition table and the open rows use the RC3 to RC8 labels (ids per label: RC3 30, RC5 1, RC6 0, RC7 40, RC8 7)._
_Updated: 2026-10-02 (`fix/windows-minmax-macro-and-test-paths`): `T-WINDOWS-SYCL-MINMAX-AND-TEST-PATH-KEYS-2026-10-02` opened and closed — the first hosted Windows runs on a master commit with the earlier fixes showed a `max()` macro clash in a SYCL header and two Python tests keyed by backslash paths._
_Updated: 2026-10-02 (`refactor/b5-hip-device-host-bodies`, RC3 standards batch B5: `T-TIDY-RATCHET-GPU-LANES-UNREPRODUCIBLE-2026-09-22` updated, still open — the hip clang-tidy lane is configured without hipcc and so lints the `-ENOSYS` stubs of 21 HIP host files instead of the bodies a device runs; a hipcc build on `ryzen-4090-arc` showed 35 findings there (`integer_cambi_hip.c` 24, `integer_psnr_hvs_hip.c` 11) and the lane itself 11 unrecorded ones in `cambi_hip_device.h`; all 46 are fixed, every HIP twin returns the values it returned before (17 800 of 17 800 on a gfx1036). `core/test/test_hip_cambi_device_math.c` keeps 11 unrecorded findings.)_
Expand Down Expand Up @@ -872,6 +874,7 @@ landed fix yet._
## Recently closed

| **T-IR-SNAPSHOTS-STALE-2026-10-02** — `make ir-diff` failed on master: three LLVM IR snapshots had drifted behind their sources | **FOUND while touching `psnr_hvs_avx2.c` (#1851) and FIXED on `chore/ir-snapshots-refresh` (2026-10-02, clang 22.1.8); an RC2-stabilisation item: no score is involved.** `make ir-diff` ([ADR-0918](adr/0918-llvm-ir-diff-harness.md)) compiles eight SIMD functions with `clang -O2 -mavx2 -mfma -emit-llvm` and compares the IR with `testdata/ir-snapshots/`. It is opt-in: no workflow, no pre-commit or pre-push hook and no preflight stage runs it, so drift goes unseen until somebody runs it by hand. On master `25fe95d73` it reported four drifts. `od_bin_fdct8x8_avx2` (four `assert()` line numbers) is regenerated by #1851. The other three, regenerated here: `ms_ssim_decimate_avx2`, two lines, the error return `-1` became `-ENOMEM` (#364, ADR-0877); `ssimulacra2_blur_plane_avx2`, ten lines, all `assert()` line numbers moved by edits above the function (#144, #360, #681, #1425, #1457, #1561); `ssimulacra2_edge_diff_map_avx2`, 329 lines, the function was rewritten to take the difference in double and to share its accumulation with the scalar tail (#681, then `5b164cb79` and `4d2f7c366` in #1425: ADR-1205, ADR-1207, ADR-1208), 303 IR lines before and 202 now, no fused multiply-add before or after. Regenerating is safe because the functions return their scalar references' bits: `ssimulacra2` and `float_ms_ssim` at `--precision max` on five fixtures (the Netflix 576x324 pair at 8 and 10 bits, both 1080p checkerboard pairs, 4 frames of BBB 3840x2160; 61 frames) are identical at host, AVX2-only (`--cpumask 48`) and scalar (`--cpumask 63`) dispatch, with a GCC 16.2.1 and with a clang 22.1.8 build, and `test_feature_isa_invariance`, `test_ssimulacra2_simd` and `test_ms_ssim_decimate` pass. After this change and #1851, `make ir-diff` reports eight of eight snapshots matching. Not changed: the gate stays opt-in, as ADR-0918 decided. |
| **T-SYCL-TIDY-OVERRIDING-OPTION-2026-10-02** — the SYCL clang-tidy lane reported 151 translation units as compile failures after ADR-1461 | **FOUND while measuring `core/src/feature/x86/motion_avx2.c` in the `sycl` lane on master `513d2a6fc` and FIXED on `fix/sycl-tidy-overriding-option` (2026-10-02).** [ADR-1461](adr/1461-strict-fp-every-translation-unit.md) (PR #1829) made `vmaf_strict_fp_args` a project argument. Targets that also name it (the x86 SIMD libraries, `core/src/dnn/`, the tests that link them: 151 of the 1 706 entries of an icx compile database on `ryzen-4090-arc`) now compile with `-fp-model=precise -ffp-contract=off -fp-model=precise -ffp-contract=off`. icx accepts the repeat. `scripts/ci/clang-tidy-sycl.sh` rewrites `-fp-model=` to clang's `-ffp-model=` in a copy of the database, and stock clang's driver then prints `warning: overriding '-ffp-model=precise' option with '-ffp-contract=off' [clang-diagnostic-overriding-option]`, a diagnostic without a file or a line. `scripts/ci/tidy-ratchet.py` treats a warning it cannot place as an unusable translation unit (it fails closed), so each of the 151 was a compile failure, `make tidy-ratchet LANE=sycl` exited 4, and a scoped baseline write for any of them was refused. The lane's own SYCL sources carry the pair once and were not affected, which is why the SYCL kernel work of the same day did not see it. The flag order the build uses is the intended one (contraction off last), so nothing is wrong with the compile commands: the wrapper now passes `-Wno-overriding-option`, next to the two driver suppressions it already had. Verified on `ryzen-4090-arc`: `vif_avx2.c`, `convolution_avx.c`, `psnr_avx2.c` and `motion_avx2.c` are 4 compile failures with the old wrapper and 0 with the new one. `scripts/ci/tests/test_tidy_ratchet.py` (`SyclWrapperDriverWarnings`) has three cases: the ratchet's parser marks the driver warning as a failure (why the wrapper must silence it), the wrapper hands the suppression to clang-tidy, and real clang-tidy, when installed, measures a unit built with the repeated pair without the warning; the second and the third fail on the old wrapper. | [ADR-1461](adr/1461-strict-fp-every-translation-unit.md), [ADR-1290](adr/1290-sycl-tidy-lane-compile-database.md) | `fix/sycl-tidy-overriding-option` | 2026-10-02 | fixed |
| **T-STATE-LEDGER-RC-RELABEL-2026-10-01** — the ledger carried the ADR-1352 candidate labels after ADR-1421 replaced them | **FIXED on `rc3-ledger-relabel` (2026-10-02).** The disposition rows "RC3 performance and backend acceleration" (59 ids) and "RC4 training and model validation" (7 ids) are split by the reading ADR-1421 gives them: RC3 (wrong or inexact scores, outputs or options a twin lacks, scratch memory), RC5 (duplication), RC6 (capability table; no row yet), RC7 (correct scores, throughput, host residuals, tuning) and RC8 (training and model validation). Ids per label after the split: RC3 30, RC5 1, RC6 0, RC7 40, RC8 7. Every id of the old rows moved to exactly one new label; the open rows that carried an ADR-1352 phase word (`RC3` for performance, `RC4` for training) carry the new label; closed rows and dated `_Updated:` notes are unchanged. Open rows of 2026-09-29 to 2026-10-02 that no disposition listed were added to their label (and `T-AGENTS-INDEX-MIGRATION-2026-10-02`, which no candidate owns, to Explicitly deferred). The interim reading paragraph is gone and the classification list uses ADR-1421's definitions. `scripts/dev/resolve-state-md-conflict.py` keys disposition rows by their bold label whatever it says, so it needed no change; its tests and `docs/development/ci.md` use the new label names. | [ADR-1421](adr/1421-rc3-rc8-candidate-map.md) | `rc3-ledger-relabel` | 2026-10-02 | fixed |
| **T-WINDOWS-SYCL-MINMAX-AND-TEST-PATH-KEYS-2026-10-02** — Windows MSVC+SYCL does not compile three SYCL sources; two Python contract tests fail on Windows | **FOUND in the hosted Windows jobs on master `27c50dd5c` (the first master commit whose Windows jobs ran after #1827, #1841, #1842 and #1843) and FIXED on `fix/windows-minmax-macro-and-test-paths` (2026-10-02).** (1) `core/src/feature/sycl/sycl_exact_fp.h:250` wrote `std::numeric_limits<float>::max()`. `<windows.h>` defines `max()` as a function-like macro, so `Windows MSVC+SYCL` stopped with `too few arguments provided to function-like macro invocation` in `integer_ciede_sycl`, `integer_ms_ssim_sycl` and `integer_ssim_sycl`. Now `(std::numeric_limits<float>::max)()`; `sycl_float_vif_math.h` had the same spelling with `min()` and is changed too. (2) `test_sycl_sub_group_size_contract.py` and `test_hip_strict_fp_policy.py` keyed their source dictionaries by `str(path.relative_to(root))`, which has backslashes on Windows, and read them with `'dir/file'` literals: `KeyError` in `Windows ARM64 MSVC`'s fast suite (2 of 224 tests; the build itself passed there for the first time since #1702). Now `.as_posix()`; `test_hip_clear_after_upload_contract.py` had the same key and is changed too. Guard: two checks added to the `msvcism` preflight stage (the SYCL `numeric_limits` spelling; a dictionary assignment keyed by `str(path.relative_to(...))` in a `core/test` Python test), which the merge train runs per landing. Seen while adding them and fixed here: the stage's designated-initializer check for CUDA device code filtered `changed_sources()`, which lists no `.cu` / `.cuh` file, so it never saw one; it has its own list now (0 hits in the 24 device files on master). Not verified here: a Windows build or test run; the hosted jobs on the merge commit are the confirmation. | [ADR-1142](adr/1142-whole-codebase-standards.md), [ADR-1234](adr/1234-local-preflight-gate.md) | `fix/windows-minmax-macro-and-test-paths` | 2026-10-02 | fixed |
| **T-MSVC-NULLPTR-IN-C-FEATURE-SOURCES-2026-10-02** — `nullptr` in seven C feature sources that the Windows MSVC builds compile | **FOUND by comparing every C source on master with the last commit that had a green Windows build (`72e17417a`) and FIXED on `fix/c-sources-null-for-msvc` (2026-10-02).** The clang-tidy cleanups #1813, #1815, #1817 and #1820 applied `modernize-use-nullptr` to C translation units: `core/src/feature/ssim.c` (4 uses), `ms_ssim.c` (4), `integer_motion_v2.c` (3), `float_ssim.c`, `float_ms_ssim.c`, `float_vif.c` and `integer_motion.c` (2 each), 19 uses in all, besides `common/blur_array.c` (`T-MSVC-NULLPTR-IN-C-BLUR-ARRAY-2026-10-02`). MSVC's C mode rejects the keyword (C2065; ADR-1138). A hosted Windows MSVC job on a pull request reported `integer_motion.c`; `scripts/dev/preflight.sh --full --stage msvcism` had found the class but printed only its first five hits, which is why the first fix covered one file. Fix: `NULL` again in all seven, each inside a `NOLINTBEGIN(modernize-use-nullptr)` block citing ADR-1138; the scan now prints up to 60 hits. C sources that already used the keyword at `72e17417a` are unchanged: they are not part of a Windows build (`core/src/mcp/`) or guard the spelling by `_MSC_VER` (`cambi.c`). Guard: the merge train runs the `msvcism` stage on every stack that changes C or C++ sources. Not verified here: an MSVC build. | [ADR-1138](adr/1138-c-translation-units-keep-null.md), [ADR-1142](adr/1142-whole-codebase-standards.md) | `fix/c-sources-null-for-msvc` | 2026-10-02 | fixed |
Expand Down
14 changes: 14 additions & 0 deletions scripts/ci/AGENTS.d/sycl-tidy-lane.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,17 @@ hook; an unwired regression test protects no CI lane.
| Script | Workflow lane(s) that invoke it | What couples them |
| --- | --- | --- |
| `test_sycl_tidy_workflow_contract.py` | `rule-enforcement.yml` — `Verify SYCL required clang-tidy contract`; `.pre-commit-config.yaml` — `test-sycl-tidy-workflow-contract` | Enforces that `Tidy SYCL` in `lint-and-format.yml` is a strict-must-report, non-advisory required gate (`# required-aggregator`, no `continue-on-error`, full `.h`/`.cpp`/`.hpp` SYCL source and test coverage in every event branch). Uses the shared aggregator harness to prove failure or absence blocks merge while success passes. |

## The wrapper silences one driver note

`clang-tidy-sycl.sh` passes `-Wno-overriding-option`. An icx build records
`-fp-model=precise -ffp-contract=off` twice on every target that names
`vmaf_strict_fp_args` next to the project-wide arguments (ADR-1461); after the
wrapper's `-fp-model=` -> `-ffp-model=` rewrite, stock clang's driver prints
`warning: overriding '-ffp-model=precise' option with '-ffp-contract=off'`
without a source location. The ratchet fails closed on a warning it cannot
place, so the unit becomes a compile failure and the lane exits 4
(`T-SYCL-TIDY-OVERRIDING-OPTION-2026-10-02`). Do not drop the flag, and do not
"fix" it by reordering the build's arguments: contraction-off last is the
order ADR-1461 requires. `SyclWrapperDriverWarnings` in
`tests/test_tidy_ratchet.py` holds it.
15 changes: 15 additions & 0 deletions scripts/ci/clang-tidy-sycl.sh
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,20 @@ esac
# -extra-arg-before=-Wno-unknown-pragmas
# — same rationale for icpx pragmas
# (`#pragma clang fp ...` etc).
# -extra-arg-before=-Wno-overriding-option
# — a target that names the strict FP
# arguments next to the project-wide ones
# (ADR-1461) compiles with `-fp-model=precise
# -ffp-contract=off` twice. icx accepts the
# repeat; stock clang's driver answers
# `warning: overriding '-ffp-model=precise'
# option with '-ffp-contract=off'`, a
# diagnostic without a source location. The
# ratchet fails closed on a warning it cannot
# place, so 151 translation units (the x86
# SIMD libraries) were compile failures and
# the lane exited 4. The flag order is right
# as built; only the driver note is silenced.
# ---------------------------------------------------------------------
# ---------------------------------------------------------------------
# Translate icx-only driver flags that stock clang rejects outright.
Expand Down Expand Up @@ -126,4 +140,5 @@ exec "$CLANG_TIDY_BIN" \
"-extra-arg-before=-isystem$SYCL_INCLUDE_BASE/sycl" \
"-extra-arg-before=-Wno-unknown-warning-option" \
"-extra-arg-before=-Wno-unknown-pragmas" \
"-extra-arg-before=-Wno-overriding-option" \
"$@"
4 changes: 3 additions & 1 deletion scripts/ci/source-adr-citations.json
Original file line number Diff line number Diff line change
Expand Up @@ -9340,9 +9340,11 @@
"core/src/metal/meson.build": 1,
"core/test/meson.build": 4,
"core/test/test_strict_fp_compiler_args.py": 4,
"scripts/ci/clang-tidy-sycl.sh": 1,
"scripts/ci/golden-arm64-preflight.sh": 1,
"scripts/ci/setup-golden-build.sh": 1,
"scripts/ci/tests/test_golden_gate_makefile_contract.py": 1
"scripts/ci/tests/test_golden_gate_makefile_contract.py": 1,
"scripts/ci/tests/test_tidy_ratchet.py": 1
},
"target": "1461-strict-fp-every-translation-unit.md"
},
Expand Down
Loading
Loading