Skip to content

macOS: two float32 tests fail under AppleClang 21 / Xcode 26.5 (Float32Parity.ToneRowWithNarrowbandGuard, itu_echo.EchoStability<float>) #31

Description

@tap

The macOS AppleClang CI job fails two tests. It is a toolchain/runner-image regression, not a code change — main last passed on the same tree four days earlier. Filing this so the evidence does not stay buried in a comment on an unrelated PR (#30).

The failure

99% tests passed, 2 tests failed out of 181
The following tests FAILED:
  114 - itu_echo.EchoStability<float>            (Failed)
  179 - Float32Parity.ToneRowWithNarrowbandGuard (Failed)
tests/test_float32.cpp:166: Failure
Expected: (max_level_dbm0a(rr.out, r.rs.fs, static_cast<size_t>(10.0 * r.rs.fs), rr.out.size())) < (r.gate),
  actual: 42.337837234992982 vs -55
fs 16000

Full log: macOS AppleClang job 90074362335 (the itu_echo assertion detail is in there too).

Not a code change

The run above is from PR #30, whose entire diff is one file — .github/pull_request_template.md, 40 insertions, no C++. Its base commit is 0682238, which is also the current main HEAD, and main's own last CI run on that exact commit ("Bump TapHouse drift pin to v5", 2026-07-23) concluded success. Same tree: green on 2026-07-23, red on 2026-07-27.

main has not been re-run since, so it is untested rather than known-good on the new toolchain. Re-running it would make that explicit.

Environment change

The macOS runners now report AppleClang 21.0.0.21000101 / Xcode 26.5 and ship CMake 4. The image move is independently corroborated: the same update broke configure in tap/AmbiTap-Max#18 and tap/MuTap-Max#14 with Compatibility with CMake < 3.5 has been removed from CMake, which required a min-api pin bump.

Scope

Green in the same run: Linux Clang, Linux GCC, Windows MSVC, Hexagon cross (QEMU), Cortex-M55 cross (QEMU), ASan + UBSan, Instruction-count ratchet, Suppressor branch-free/branchy parity, clang-format, drift.

It is also not a blanket AppleClang 21 problem across the family — tap/AmbiTap#24's build-test (macos-appleclang) job is green on the same runners today, as are SampleRateTap's jobs. What is distinctive here is that MuTap carries the family's tightest numerical assertions (measured ITU-T thresholds).

This is probably not floating-point drift

42.34 dBm0(A) against a −55 dBm0(A) gate is roughly a 97 dB miss. That is far too large for single-precision rounding differences. It reads more like the narrowband guard or the suppressor not engaging at all under this build than a threshold that needs widening. Please resist retuning the gate until the mechanism is understood — these thresholds are the ITU-T compliance evidence.

Leading hypothesis: the vDSP float32 FFT backend

Both failing tests are on the float32 path, and macOS is the only platform where the float32 FFT backend differs. Per DspTap's CMakeLists.txt, TAP_DSP_FFT_ACCELERATE defaults ON for Apple and routes the float32 real FFT through Apple's vDSP instead of Ooura; Linux and Windows use Ooura. Double is untouched (always Ooura), and the documented contract is that "on the float32 path vDSP agrees with Ooura to single-precision rounding (not bit-identical)".

vDSP is SDK-provided, so an Xcode 26.5 bump can change its numerics without any compiler codegen change being involved.

One-flag bisection — highest-value next step. Build macOS with the Apple backend forced off and re-run the two tests:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DTAP_DSP_FFT_ACCELERATE=OFF
cmake --build build
ctest --test-dir build --output-on-failure -R 'Float32Parity.ToneRowWithNarrowbandGuard|itu_echo.EchoStability'
  • Tests pass → it is vDSP, and the float32 vDSP/Ooura agreement contract is broken on the new SDK.
  • Tests still fail → it is AppleClang 21 codegen; next probe -ffp-contract=off and compare -O0/-O1/-O2, since FMA contraction in the suppressor's recursions is the usual suspect.

Related context

This repo pins submodules/dsptap at 9cbfbca, which is 11 commits behind DspTap main (dfbe18d). So the vDSP backend MuTap actually compiles is not the one DspTap's own green macos-vdsp job certifies. That does not explain a failure that appeared this week — the pin has not moved — but it does mean DspTap's green macOS CI is not evidence about the code path failing here, and a pin bump is worth trying as part of the investigation.

Suggested next steps

  1. Re-run main's CI to confirm the failure is independent of any PR.
  2. Run the -DTAP_DSP_FFT_ACCELERATE=OFF bisection above on a Mac with Xcode 26.5.
  3. Before adjusting any threshold, instrument whether the narrowband guard / suppressor gain is actually engaging on the failing run — the magnitude suggests a state problem, not a tolerance problem.
  4. Consider bumping submodules/dsptap so the backend under test matches the one DspTap certifies.

Not reproducible outside macOS: Linux Clang and Linux GCC both pass, so this needs a Mac on the new toolchain.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions