Skip to content

ci: qualify an explicit native Release producer profile instead of inheriting local profiling defaults #604

Description

@davidgmbb

Confirmed configuration mismatch on the critical path

Research snapshot: main 14da1343e96ea08007842bc9a67202e36c9ee02c, tree 250ac2b8d77eb48012e5db052a50d35c96207f62 (2026-09-13 Mexico City / 2026-09-14 UTC).

Current native CI steps generate the shared mode/differential producer with:

"$driver" generate --cc clang --config Release --linker DEFAULT

The missing-CMake-cache recovery path uses the same command. Neither supplies --ci or an explicit producer profiling policy.

I read the actual successful Intel macOS native job 103816332108, not just workflow names. Its log confirms:

BUSTER_CI: OFF
BUSTER_UNITY_BUILD: ON
BUSTER_INCLUDE_TESTS: ON
BUSTER_DEBUG_INFO: ON
BUSTER_FRAME_POINTERS: ON
BUSTER_SANITIZE: OFF
BUSTER_LTO: OFF

Host: macos-26-intel, Intel Core i7-8700B, four logical CPUs, 14 GiB RAM, AppleClang 21.0.0.21000101. The documented build policy deliberately enables debug information/frame pointers for local profiling, but disables those defaults in CI; CI also has a different optimized Release policy. This native lane currently inherits the local policy.

Observed cost, not an established fix

In first-attempt successful run 34791451301:

  • Native job: 1,758 seconds / 29m18s.
  • Execution-mode matrix step: 261 seconds / 4m21s.
  • Log interval from machine-info immediately before the build (00:04:06 UTC) to completed producer link (00:07:54 UTC): approximately 229 seconds. Ninja reports one unity object compile and one link. This is a build interval, not an isolated compiler-process measurement.
  • The actual 24-leg mode matrix reports only 4.947165 seconds, with zero failures.
  • The differential step's subsequent producer build says ninja: no work to do; modes and differential already share this producer correctly.

The cold producer build therefore dominates the mode step, rather than the 24 mode legs. No fraction of those 229 seconds has yet been proven removable by changing debug information or optimization policy. #413's older 137.708-second CI-profile compile is on a different source/measurement configuration and is NOT a valid before/after comparison with this run.

Focused work

Make the native producer's intended build profile explicit and qualify a cheaper profile where it preserves the required diagnostic and correctness contract.

  1. Capture actual CMake caches and exact compile/link commands for the existing native producer and canonical CI Release producer on the same source/toolchain. Inventory every difference; do not blindly append --ci, because it is broader than a debug-information switch.
  2. First isolate profiling overhead from optimization changes: compare the current optimized unity build against explicit debug-info/frame-pointer choices while keeping optimization and semantic flags identical. Retain enough diagnostics/backtrace capability for CI failures; line-tables-only is an option to evaluate, not an assumed equivalent replacement for full debugger information.
  3. Separately evaluate alignment with the established optimized CI Release profile only if justified by its coverage/diagnostic contract and resulting compiler throughput. No blanket -O0/-O1, global deoptimization, removal of tests, or splitting the Release compiler into multiple translation units/objects.
  4. Make normal generation and missing-graph recovery use the same qualified policy. Keep one shared producer for modes and differential; do not introduce extra producer builds or stale cross-run compiler caches.
  5. Keep native build policy in build.c/CMake and the existing workflow. Preserve mode/differential execution after an independent preceding failure where currently required.

Acceptance

  • At least three equivalent successful, uninstrumented cold builds per candidate/profile on the matching hosted runners; report compile, link, bootstrap/configure, mode execution and full native-job wall time separately, plus peak RSS, executable size and exact flags.
  • Preserve the single optimized unity object, tests-enabled producer, semantic/warning flags, all current mode/target/configuration cases, independent reference execution, sanitizers, negative controls, evidence integrity and fail-closed completion.
  • Record differences between native execution, link-only checks and diagnostic controls; unchanged aggregate counts alone are not sufficient coverage proof.
  • Run complete mode/differential/self-host and applicable platform correctness gates on the exact submitted source tree. Measure the resulting compiler's workload throughput so cheaper host compilation does not hide a materially slower compiler.
  • Exercise missing-cache recovery and failure/cancellation paths. No profiling policy drift between the two generation sites.
  • Keep the local profiling defaults intact. If full debug information is a required property of this lane and no acceptable lower-cost profile wins, retain that evidence and leave the policy unchanged.

Relationship to existing work

#413 owns source-level reduction of Apple Clang's optimized unity compile cost. This issue owns the separate, verified native-workflow producer-profile mismatch and its qualification; coordinate the two, and do not attribute flag changes to a source optimization. #408 owns the much larger differential execution tail. #333 owns combination partitioning. None of these measurements justifies deleting coverage or advertising a whole-workflow speedup.

Targeted CI/profiling issue and open-PR searches, current #413 (no comments), and current workflow/build documentation found no dedicated ticket for this producer-profile mismatch; this was not an exhaustive remote-branch/session audit. No code, workflow, repository settings or host configuration was changed, and no new validation run was dispatched during this research.

Reference for debug-info tradeoffs: Clang's documented debug-information modes.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions