From 91686d67bbcf8d5c38a02a5095c8f81f722cf25d Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Fri, 7 Aug 2026 09:45:07 -1000 Subject: [PATCH 01/15] Widen the LLVM object cache key, and show what the optimizer is doing Three gaps that make the LLVM backend hard to work on. The object cache key covered the instruction words, chunk ranges and target triple, but not the pass pipeline, optimisation level, LLVM version or target CPU/feature string. Editing the pipeline therefore reused objects built with the old one and reported them as the new result. Those inputs are now named constants that feed both codegen and dolllvm_codegen_fingerprint(), which the key hashes -- so there is one place to change them and no way to change them without invalidating the cache. On Windows every chunk's progress line was printed before any work began, so the log looked complete while the build sat still and named nothing. Lines now come from inside the job, and completion carries elapsed seconds: the stuck chunk is the one with no Finished line. DOLRECOMP_LLVM_TRACE_PASSES registers a pass-instrumentation callback that names each pass and IR unit as it starts, flushed. instcombine failing to converge on a recompiled Gekko function previously spun for 49 minutes at 1.00 core and consumed 18.9 CPU-hours without ever revealing which function it was on. --- src/app/pipeline.c | 37 +++++++++++-- src/backend/llvm/llvm_backend.cpp | 92 +++++++++++++++++++++++++------ src/backend/llvm/llvm_backend.h | 6 ++ 3 files changed, 112 insertions(+), 23 deletions(-) diff --git a/src/app/pipeline.c b/src/app/pipeline.c index dfb421b..98922fa 100644 --- a/src/app/pipeline.c +++ b/src/app/pipeline.c @@ -55,6 +55,9 @@ static u32 c_chunk_instructions(void) { #define DOLLLVM_DEFAULT_WORKER_BATCH 4u // v6 carries the execution budget across generated function calls. #define DOLLLVM_CACHE_VERSION "dolllvm-v6" +// The LLVM optimisation level used for generated objects. Named so it can be +// folded into the cache key; changing it must not reuse cached objects. +#define DOLLLVM_OPT_LEVEL 2 typedef struct { const PPCInst* insts; @@ -207,6 +210,14 @@ static u64 llvm_job_hash(const LLVMChunkJob* job) { if (dolllvm_effective_triple(getenv("DOLRECOMP_LLVM_TARGET"), triple, sizeof(triple))) hash = hash_bytes(hash, triple, strlen(triple)); + // LLVM version, target CPU and features, and the pass pipeline. Without + // these a codegen experiment reuses objects built with the old settings + // and reports them as its result. + char codegen[1024]; + if (dolllvm_codegen_fingerprint(codegen, sizeof(codegen))) + hash = hash_bytes(hash, codegen, strlen(codegen)); + u32 opt_level = (u32)DOLLLVM_OPT_LEVEL; + hash = hash_bytes(hash, &opt_level, sizeof(opt_level)); for (u32 i = 0; i < job->count; i++) { hash = hash_bytes(hash, &job->insts[i].address, sizeof(job->insts[i].address)); @@ -282,6 +293,13 @@ static int emit_llvm_chunk_job(const void* data, void* user) { (void)user; if (reuse_llvm_object(job)) return 1; +#ifdef _WIN32 + // See run_llvm_chunk_jobs: on Windows this is the only live progress. + printf("[%u/%u] Emitting LLVM object %s\n", job->index, job->total, + job->name); + fflush(stdout); + time_t started = time(NULL); +#endif char temp_path[1440]; #ifdef _WIN32 int process_id = _getpid(); @@ -303,7 +321,7 @@ static int emit_llvm_chunk_job(const void* data, void* user) { } DolLLVMOptions options = {0}; options.target_triple = getenv("DOLRECOMP_LLVM_TARGET"); - options.optimization_level = 2; + options.optimization_level = DOLLLVM_OPT_LEVEL; options.verify = 1; options.function_ranges = job->ranges; options.function_range_count = job->range_count; @@ -334,6 +352,12 @@ static int emit_llvm_chunk_job(const void* data, void* user) { } if (!ok) remove(temp_path); +#ifdef _WIN32 + printf("[%u/%u] %s LLVM object %s (%llds)\n", job->index, job->total, + ok ? "Finished" : "FAILED", job->name, + (long long)(time(NULL) - started)); + fflush(stdout); +#endif return ok; } @@ -354,11 +378,12 @@ static int run_llvm_chunk_jobs(const LLVMChunkJob* jobs, u32 count, u32 requested_jobs) { u32 workers = effective_chunk_jobs(count, requested_jobs); #ifdef _WIN32 - for (u32 i = 0; i < count; i++) { - printf("[%u/%u] Emitting LLVM object %s\n", - jobs[i].index, jobs[i].total, jobs[i].name); - fflush(stdout); - } + // Progress is reported from inside the job, not dumped up front. The + // Windows path used to print every line before starting any work, so a + // chunk that hung produced a complete-looking log and no indication of + // which chunk was stuck -- one such hang ran 49 minutes with nothing to + // point at. A start line, and a done line carrying elapsed seconds, means + // the stuck chunk is the one with no matching completion. return run_parallel_jobs(jobs, sizeof(*jobs), count, workers, emit_llvm_chunk_job, NULL); #else diff --git a/src/backend/llvm/llvm_backend.cpp b/src/backend/llvm/llvm_backend.cpp index 05ecf2f..920fad9 100644 --- a/src/backend/llvm/llvm_backend.cpp +++ b/src/backend/llvm/llvm_backend.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -23,6 +24,10 @@ #include #include #include +#include + +#include +#include namespace { @@ -34,6 +39,28 @@ static std::string resolveTriple(const char *requested) { : llvm::sys::getDefaultTargetTriple(); } +// Everything below feeds both codegen and the object cache key. Changing any of +// it must invalidate cached objects, so keep them named rather than inline: the +// fingerprint is built from these same constants, and an edit that misses the +// key produces a build that silently reuses objects from the old settings and +// reports them as a result. +static constexpr const char *kTargetCPU = "generic"; +static constexpr const char *kTargetFeatures = ""; + +// instcombine's fixpoint check is a self-diagnostic for the pass, not a +// correctness property of the IR. Recompiled Gekko functions contain long +// straight-line integer and condition-flag sequences that can still be changing +// after one iteration, which makes the pass call report_fatal_error and take the +// whole recompilation down. Suppressing the check leaves the optimization +// itself intact. +static constexpr const char *kPassPipeline = + "function(mem2reg,early-cse,instcombine," + "simplifycfg,sccp," + "correlated-propagation,jump-threading,gvn,dse,adce,loop-simplify," + "loop-rotate,loop-mssa(licm),loop-vectorize,slp-vectorizer,vector-" + "combine," + "tailcallelim),cgscc(inline),ipsccp,globaldce"; + static CodeGenOptLevel codegenLevel(int level) { if (level <= 0) return CodeGenOptLevel::None; @@ -52,8 +79,8 @@ static TargetMachine *targetMachine(const Target *target, if (!cachedMachine || cachedTriple != tripleName || cachedOpt != opt) { TargetOptions options; cachedMachine.reset(target->createTargetMachine( - tripleName, "generic", "", options, Reloc::PIC_, std::nullopt, - codegenLevel(opt))); + tripleName, kTargetCPU, kTargetFeatures, options, Reloc::PIC_, + std::nullopt, codegenLevel(opt))); cachedTriple = tripleName; cachedOpt = opt; } @@ -129,27 +156,44 @@ extern "C" bool dolllvm_emit_object(const DolIRModule *source, llvm::FunctionAnalysisManager fam; llvm::CGSCCAnalysisManager cgam; llvm::ModuleAnalysisManager mam; - llvm::PassBuilder passBuilder(machine); + + // DOLRECOMP_LLVM_TRACE_PASSES names the last pass and IR unit to start. + // Without it an optimizer that fails to converge is indistinguishable from + // one that is merely slow: the historical instcombine hang on this title + // spun for 49 minutes at 1.00 core with nothing identifying the function. + // Each line is flushed, so the last line printed is where it stopped. + llvm::PassInstrumentationCallbacks callbacks; + const bool tracePasses = getenv("DOLRECOMP_LLVM_TRACE_PASSES") != nullptr; + if (tracePasses) { + callbacks.registerBeforeNonSkippedPassCallback( + [](llvm::StringRef pass, llvm::Any ir) { + // Any holds a pointer to the IR unit, so any_cast on + // the Any* yields const T *const *. + std::string unit = ""; + const llvm::Function *const *fn = + llvm::any_cast(&ir); + const llvm::Module *const *mod = + llvm::any_cast(&ir); + if (fn && *fn) + unit = (*fn)->getName().str(); + else if (mod && *mod) + unit = (*mod)->getName().str(); + fprintf(stderr, "dolllvm: pass %s on %s\n", pass.str().c_str(), + unit.c_str()); + fflush(stderr); + }); + } + llvm::PassBuilder passBuilder(machine, llvm::PipelineTuningOptions(), + std::nullopt, + tracePasses ? &callbacks : nullptr); passBuilder.registerModuleAnalyses(mam); passBuilder.registerCGSCCAnalyses(cgam); passBuilder.registerFunctionAnalyses(fam); passBuilder.registerLoopAnalyses(lam); passBuilder.crossRegisterProxies(lam, fam, cgam, mam); llvm::ModulePassManager passes; - std::string pipeline = - // instcombine's fixpoint check is a self-diagnostic for the pass, not a - // correctness property of the IR. Recompiled Gekko functions contain - // long straight-line integer and condition-flag sequences that can still - // be changing after one iteration, which makes the pass call - // report_fatal_error and take the whole recompilation down. Suppressing - // the check leaves the optimization itself intact. - "function(mem2reg,early-cse,instcombine," - "simplifycfg,sccp," - "correlated-propagation,jump-threading,gvn,dse,adce,loop-simplify," - "loop-rotate,loop-mssa(licm),loop-vectorize,slp-vectorizer,vector-" - "combine," - "tailcallelim),cgscc(inline),ipsccp,globaldce"; - if (llvm::Error error = passBuilder.parsePassPipeline(passes, pipeline)) { + if (llvm::Error error = + passBuilder.parsePassPipeline(passes, kPassPipeline)) { fprintf(diagnostics, "dolllvm: cannot construct optimization pipeline: %s\n", llvm::toString(std::move(error)).c_str()); @@ -226,3 +270,17 @@ extern "C" bool dolllvm_object_matches_triple(const char *path, return magic[0] == 0x7F && magic[1] == 'E' && magic[2] == 'L' && magic[3] == 'F'; } + +extern "C" bool dolllvm_codegen_fingerprint(char *out, size_t size) { + if (!out || size == 0) + return false; + // Every codegen-affecting input the object cache key would otherwise miss. + // The triple is hashed separately by the caller, which already had it. + const std::string fingerprint = std::string(LLVM_VERSION_STRING) + "|" + + kTargetCPU + "|" + kTargetFeatures + "|" + + "pic|small|" + kPassPipeline; + if (fingerprint.size() + 1 > size) + return false; + memcpy(out, fingerprint.c_str(), fingerprint.size() + 1); + return true; +} diff --git a/src/backend/llvm/llvm_backend.h b/src/backend/llvm/llvm_backend.h index 51743e2..8617066 100644 --- a/src/backend/llvm/llvm_backend.h +++ b/src/backend/llvm/llvm_backend.h @@ -31,6 +31,12 @@ bool dolllvm_effective_triple(const char* requested, char* out, size_t size); // Validate an object's magic against the effective target triple. bool dolllvm_object_matches_triple(const char* path, const char* requested); +// Every codegen-affecting input that is not already in the object cache key: +// LLVM version, target CPU and feature string, relocation and code model, and +// the pass pipeline. Hash this alongside the instruction words, or a codegen +// change silently reuses objects built with the old settings. +bool dolllvm_codegen_fingerprint(char* out, size_t size); + #ifdef __cplusplus } #endif From ca4be35c45dc67ef6e294afc67849e50f814c864 Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Fri, 7 Aug 2026 15:51:18 -1000 Subject: [PATCH 02/15] Keep the vectorizers, and say why in the pipeline itself Measured: dropping loop-vectorize, slp-vectorizer and vector-combine costs 27% throughput on Mario Kart and makes the module 4.6% *larger*. They are worth 1.37x. The intuition that they cannot pay off against CPU "generic" with an empty feature string is simply wrong. SSE2 is part of the x86-64 baseline ABI, so 128-bit vectors are always available, and Gekko paired-singles are inherently 2-wide f32 pairs -- ps_add, ps_mul, psq_l/psq_st map almost directly onto SSE2 pairs. SLP has real work here, not speculative widening. The comment now records the measurement so this is not retried. Also stop hiding cache reuse. On Windows the reuse path returned before the progress print, so a resumed build logged nothing for the objects it reused and was indistinguishable from a full regeneration -- which is exactly the thing that must not be assumed when checking whether a codegen change was tested. --- src/app/pipeline.c | 11 ++++++++++- src/backend/llvm/llvm_backend.cpp | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/app/pipeline.c b/src/app/pipeline.c index 98922fa..a6dd584 100644 --- a/src/app/pipeline.c +++ b/src/app/pipeline.c @@ -291,8 +291,17 @@ static void cache_llvm_object(const LLVMChunkJob* job) { static int emit_llvm_chunk_job(const void* data, void* user) { const LLVMChunkJob* job = (const LLVMChunkJob*)data; (void)user; - if (reuse_llvm_object(job)) + if (reuse_llvm_object(job)) { +#ifdef _WIN32 + // Say so. A silent reuse is indistinguishable from a regeneration in + // the log, and "the cache was hit" is exactly the thing that must not + // be assumed when checking whether a codegen change was really tested. + printf("[%u/%u] Reusing cached LLVM object %s\n", job->index, + job->total, job->name); + fflush(stdout); +#endif return 1; + } #ifdef _WIN32 // See run_llvm_chunk_jobs: on Windows this is the only live progress. printf("[%u/%u] Emitting LLVM object %s\n", job->index, job->total, diff --git a/src/backend/llvm/llvm_backend.cpp b/src/backend/llvm/llvm_backend.cpp index 920fad9..1e2fd55 100644 --- a/src/backend/llvm/llvm_backend.cpp +++ b/src/backend/llvm/llvm_backend.cpp @@ -53,6 +53,13 @@ static constexpr const char *kTargetFeatures = ""; // after one iteration, which makes the pass call report_fatal_error and take the // whole recompilation down. Suppressing the check leaves the optimization // itself intact. +// +// Do not remove the vectorizers. Measured (LLVM-EXPERIMENTS E001): dropping +// loop-vectorize, slp-vectorizer and vector-combine costs **-27%** throughput +// and makes the module 4.6% *larger*. The intuition that they cannot pay off +// against CPU "generic" with an empty feature string is wrong -- SSE2 is part +// of the x86-64 baseline, and Gekko paired-singles are inherently 2-wide f32 +// pairs, so SLP has real work to do at that baseline. static constexpr const char *kPassPipeline = "function(mem2reg,early-cse,instcombine," "simplifycfg,sccp," From 43522497476c14b4759f690589f2c27ea432e0f7 Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Fri, 7 Aug 2026 16:40:07 -1000 Subject: [PATCH 03/15] Size LLVM chunks for the register allocator, not for the C backend A chunk becomes exactly one LLVM function -- every generated object carries precisely two symbols, func_X and func_X_budget, whatever the guest function boundaries are. So DOLRECOMP_LLVM_CHUNK_INSTRUCTIONS is really "how many basic blocks must the register allocator keep the entire promoted guest register file live across", and at the inherited 1024 that was far past what 16 x86-64 registers hold: 43% of every generated function was stack spill traffic. Measured on Mario Kart, one variable, separate output root per arm: chunk objects .text vs C speed vs 1024 1024 726 1,012,522,870 16.2x 0.3288 256 2,902 450,227,766 7.2x 0.4404 +33.9% 128 5,803 345,215,974 5.5x 0.5192 +57.9% 64 11,604 274,... 0.5267 (+1.4% over 128, ranges overlap) Monotonic to 128 with disjoint ranges at every step, and generation cost fell 18x along the way (24.9 -> 1.4 CPU-hours), which confirms per-function compile cost is superlinear in block count. 64 is not a proven gain: +1.4% with overlapping ranges, so 128 is the setting. 128 was previously unreachable -- it was the validator's floor, and the curve had not turned there. The LLVM floor is now 32 so the optimum can actually be found per title; the C path keeps its own 128 floor and its separately measured 1024 optimum, which is a different effect (instruction cache, not register pressure). There is a real minimum somewhere below: a call leaving the chunk returns through the dispatcher instead of branching. This is a curve to sweep, not a constant to copy. --- src/app/pipeline.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/app/pipeline.c b/src/app/pipeline.c index a6dd584..a17989d 100644 --- a/src/app/pipeline.c +++ b/src/app/pipeline.c @@ -51,7 +51,12 @@ static u32 c_chunk_instructions(void) { } #ifdef DOLRECOMP_ENABLE_LLVM -#define DOLLLVM_DEFAULT_CHUNK_INSTRUCTIONS 1024u +// 128, measured. A chunk is one LLVM function, so this is the block count the +// register allocator keeps the whole guest register file live across. Against +// the previous 1024 default this is +57.9% throughput and -66% .text on Mario +// Kart; 64 gains a further 1.4% but its range overlaps 128's, so it is not a +// proven gain. See docs/LLVM-EXPERIMENTS.md E002-E004. +#define DOLLLVM_DEFAULT_CHUNK_INSTRUCTIONS 128u #define DOLLLVM_DEFAULT_WORKER_BATCH 4u // v6 carries the execution budget across generated function calls. #define DOLLLVM_CACHE_VERSION "dolllvm-v6" @@ -73,6 +78,25 @@ typedef struct { char cache_path[1400]; } LLVMChunkJob; +// The floor is 32, not the 128 the C path uses. +// +// A chunk becomes exactly one LLVM function, so this value is the number of +// basic blocks the register allocator has to keep the whole promoted guest +// register file live across -- and that scope is what drives the generated +// code size. Measured on Mario Kart (LLVM-EXPERIMENTS E002/E003), against the +// 1024 default: +// +// 1024 .text 1,012,522,870 speed 0.3288 +// 256 .text 450,227,766 speed 0.4404 +33.9% +// 128 .text 345,215,974 speed 0.5192 +57.9% +// +// monotonic, with disjoint confidence ranges at every step, so 128 was the +// binding constraint rather than the optimum. Smaller chunks do eventually +// cost -- a call that leaves the chunk returns through the dispatcher instead +// of branching -- so this is a curve with a minimum, not a free win. Sweep it +// per title rather than assuming this one's answer. +#define DOLLLVM_MIN_CHUNK_INSTRUCTIONS 32u + static u32 llvm_chunk_instructions(void) { const char* configured = getenv("DOLRECOMP_LLVM_CHUNK_INSTRUCTIONS"); if (!configured || !configured[0]) @@ -80,10 +104,12 @@ static u32 llvm_chunk_instructions(void) { char* end = NULL; errno = 0; unsigned long value = strtoul(configured, &end, 10); - if (errno || !end || *end || value < 128u || value > 4096u) { + if (errno || !end || *end || value < DOLLLVM_MIN_CHUNK_INSTRUCTIONS || + value > 4096u) { fprintf(stderr, - "warning: DOLRECOMP_LLVM_CHUNK_INSTRUCTIONS must be 128..4096; " + "warning: DOLRECOMP_LLVM_CHUNK_INSTRUCTIONS must be %u..4096; " "using %u\n", + DOLLLVM_MIN_CHUNK_INSTRUCTIONS, DOLLLVM_DEFAULT_CHUNK_INSTRUCTIONS); return DOLLLVM_DEFAULT_CHUNK_INSTRUCTIONS; } From c409f3990982004e43b83f242762592cd01f5a31 Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Fri, 7 Aug 2026 16:55:16 -1000 Subject: [PATCH 04/15] Make the LLVM target CPU selectable, and keep the portable default DOLRECOMP_LLVM_CPU and DOLRECOMP_LLVM_FEATURES override the target machine; "native" resolves through sys::getHostCPUName(), which createTargetMachine does not do itself. Both feed the codegen fingerprint, so switching target cannot reuse objects built for another one -- verified: the znver5 run rebuilt 5803/5803 objects with zero reuse. Measured on this 9950X3D, chunk 128, against generic: generic speed 0.5192 (0.4852-0.5437) module 349,250,048 znver5 speed 0.5160 (0.4909-0.5359) module 331,272,192 -0.6% with overlapping ranges, so no proven gain; the module is 5.1% smaller, which is real. Default stays generic, which is also the portable choice, so nothing is traded. The mechanism is clean and worth recording: Gekko paired-singles are exactly 2 x f32 = 64 bits, and SSE2's 128-bit registers already hold them with room to spare. E001 showed removing vectorization costs 27%; E005 shows widening beyond SSE2 buys nothing. Vectorization at the baseline is essential, above it is not. --- src/backend/llvm/llvm_backend.cpp | 38 ++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/backend/llvm/llvm_backend.cpp b/src/backend/llvm/llvm_backend.cpp index 1e2fd55..8535de8 100644 --- a/src/backend/llvm/llvm_backend.cpp +++ b/src/backend/llvm/llvm_backend.cpp @@ -40,12 +40,38 @@ static std::string resolveTriple(const char *requested) { } // Everything below feeds both codegen and the object cache key. Changing any of -// it must invalidate cached objects, so keep them named rather than inline: the -// fingerprint is built from these same constants, and an edit that misses the +// it must invalidate cached objects, so keep it reachable from one place: the +// fingerprint is built from these same accessors, and an edit that misses the // key produces a build that silently reuses objects from the old settings and // reports them as a result. -static constexpr const char *kTargetCPU = "generic"; -static constexpr const char *kTargetFeatures = ""; +// +// DOLRECOMP_LLVM_CPU and DOLRECOMP_LLVM_FEATURES override the target machine's +// CPU and feature string; "native" resolves to the host. The default stays +// "generic" with no features, which is the portable x86-64 baseline -- a +// released module must run on any x86-64 host, so raising the target has to +// stay opt-in. +// +// That baseline already includes SSE2, which is not incidental here: E001 +// measured the vectorizers as worth 1.37x precisely because Gekko +// paired-singles are 2-wide f32 pairs that map onto SSE2. So a wider target is +// a live hypothesis rather than a long shot. +static constexpr const char *kDefaultTargetCPU = "generic"; +static constexpr const char *kDefaultTargetFeatures = ""; + +static std::string targetCPU() { + const char *cpu = getenv("DOLRECOMP_LLVM_CPU"); + if (!cpu || !cpu[0]) + return kDefaultTargetCPU; + // createTargetMachine does not expand "native" itself. + if (!strcmp(cpu, "native")) + return llvm::sys::getHostCPUName().str(); + return cpu; +} + +static std::string targetFeatures() { + const char *features = getenv("DOLRECOMP_LLVM_FEATURES"); + return features ? features : kDefaultTargetFeatures; +} // instcombine's fixpoint check is a self-diagnostic for the pass, not a // correctness property of the IR. Recompiled Gekko functions contain long @@ -86,7 +112,7 @@ static TargetMachine *targetMachine(const Target *target, if (!cachedMachine || cachedTriple != tripleName || cachedOpt != opt) { TargetOptions options; cachedMachine.reset(target->createTargetMachine( - tripleName, kTargetCPU, kTargetFeatures, options, Reloc::PIC_, + tripleName, targetCPU(), targetFeatures(), options, Reloc::PIC_, std::nullopt, codegenLevel(opt))); cachedTriple = tripleName; cachedOpt = opt; @@ -284,7 +310,7 @@ extern "C" bool dolllvm_codegen_fingerprint(char *out, size_t size) { // Every codegen-affecting input the object cache key would otherwise miss. // The triple is hashed separately by the caller, which already had it. const std::string fingerprint = std::string(LLVM_VERSION_STRING) + "|" + - kTargetCPU + "|" + kTargetFeatures + "|" + + targetCPU() + "|" + targetFeatures() + "|" + "pic|small|" + kPassPipeline; if (fingerprint.size() + 1 > size) return false; From 57461c0775c6dd2e842755fd5e41e693d30f784b Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Sat, 8 Aug 2026 11:51:42 -1000 Subject: [PATCH 05/15] Preserve ps1 across scalar FP work in the DolIR builder The lockstep verifier (C003) found the LLVM backend diverging from the interpreter on ps1 -- the high slot of a paired-single register -- 2,180 times against the C backend's 70, with native values carrying 0x4330000000000000, the int-to-double conversion bias. Two sites in the DolIR builder splat a scalar result into both slots of the pair where Gekko writes ps0 only: - lower_float_memory wrote ps1 for every float load. Gekko splits them: lfs fills both slots (Interpreter::lfs -> Fill), lfd writes ps0 and preserves ps1 (Interpreter::lfd -> SetPS0). The guest's int-to-double idiom is stw/stw/lfd, which is exactly where the bias came from. - fmr, fneg, fabs, fnabs and fsel wrote ps1. All five are SetPS0-only in Interpreter_FloatMisc. The C emitter has always had both guards (emit_fload/emit_floadx take the ps1 write under `if (single)`, and the FMR/FNEG/FABS/FNABS/FSEL cases write ctx->fpr alone), which is why C does not show this class. DolIR is consumed by the LLVM pipeline only, so nothing here changes C codegen. Bumps DOLLLVM_CACHE_VERSION to v7: default LLVM codegen changes, so every cached v6 object is stale. --- src/app/pipeline.c | 7 ++++++- src/ir/dolir_builder.c | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/app/pipeline.c b/src/app/pipeline.c index a17989d..559b165 100644 --- a/src/app/pipeline.c +++ b/src/app/pipeline.c @@ -59,7 +59,12 @@ static u32 c_chunk_instructions(void) { #define DOLLLVM_DEFAULT_CHUNK_INSTRUCTIONS 128u #define DOLLLVM_DEFAULT_WORKER_BATCH 4u // v6 carries the execution budget across generated function calls. -#define DOLLLVM_CACHE_VERSION "dolllvm-v6" +// Any change that alters generated code must bump this, because +// llvm_job_hash() omits the pass pipeline, opt level and LLVM version. +// v7: ps1 preservation fix in dolir_builder (lfd and fmr/fneg/fabs/fnabs/fsel +// no longer splat into the high paired-single slot). Default codegen changed, +// so every cached object from v6 is stale. +#define DOLLLVM_CACHE_VERSION "dolllvm-v7" // The LLVM optimisation level used for generated objects. Named so it can be // folded into the cache key; changing it must not reuse cached objects. #define DOLLLVM_OPT_LEVEL 2 diff --git a/src/ir/dolir_builder.c b/src/ir/dolir_builder.c index e463bc7..93cdc6a 100644 --- a/src/ir/dolir_builder.c +++ b/src/ir/dolir_builder.c @@ -798,7 +798,15 @@ static bool lower_float_memory(Builder* b) { if (single) value = unary(b, DOLIR_OP_FPEXT, DOLIR_TYPE_F64, value); set_fpr(b, i->rD, value); - set_ps1(b, i->rD, value); + // Gekko splits the float loads: lfs fills BOTH slots of the pair + // (Interpreter::lfs -> Fill), while lfd writes ps0 only and leaves + // ps1 architecturally intact (Interpreter::lfd -> SetPS0) for a + // later ps_ op or psq_st to read. Splatting unconditionally left + // the int-to-double bias (0x4330000000000000) from the guest's + // stw/stw/lfd conversion idiom sitting in ps1. The C emitter has + // always had this guard -- see emit_fload/emit_floadx. + if (single) + set_ps1(b, i->rD, value); } else { DolIRValue value = fpr(b, i->rS); if (single) @@ -974,8 +982,10 @@ static bool lower_float(Builder* b) { } default: return false; } + // fmr, fneg, fabs, fnabs and fsel are all ps0-only on Gekko -- + // Interpreter_FloatMisc uses SetPS0 for every one of them -- so ps1 is + // preserved across them. The C emitter never wrote ps1 here either. set_fpr(b, i->rD, value); - set_ps1(b, i->rD, value); if (i->rc) set_cr1_from_fpscr(b); return true; From 2f00fd7e426ae45d9b4e6542de78e94cc4bb65b3 Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Sat, 8 Aug 2026 16:07:25 -1000 Subject: [PATCH 06/15] Make the generated dispatcher lookup O(1) behind DOLRECOMP_DISPATCH_LOOKUP dolrecomp_find_original emits a chain of range tests, collapsing only consecutive equal-stride chunks into an indexed jump table. That is 2 tests on a fixed-128 plan and 2,089 (E008b) or 5,224 (E008a) on a control-flow-aligned one, taken on every dispatch into the module -- and the two E008 arms rank by chain length exactly as they rank by measured slowness. No throughput number from an irregular-boundary plan is interpretable until that is fixed. DOLRECOMP_DISPATCH_LOOKUP=indexed emits a 4 KiB page index over the covered guest range instead. The page selects a small window of runs and the window is walked forward, so the walk is bounded by the runs that intersect one page rather than by the chunk count: 2 for fixed-128, 7 for E008b, 20 for E008a. The default stays linear, and the linear path is unchanged rather than merely intended to be: re-emitting the recorded plans of E:\mpo (the 726-chunk C build behind the pinned 760c208d module), E:\ml16, E:\ml10 and E:\ml9 through the refactored emitter reproduces each archived lookup byte for byte. Correctness of the new form is checked against the old one over the real plans by scripts/check-dispatch-lookup.py, which parses both emitted lookups back into resolvers and sweeps every aligned address in the covered range plus a 64 KiB margin, and a sample of unaligned ones: 916,518 addresses agree on all four plans, 742,616 of them resolving to a chunk. --- src/backend/dispatch.c | 278 +++++++++++++++++++++++++++++++++++++++-- tests/test_dispatch.c | 54 ++++++++ 2 files changed, 324 insertions(+), 8 deletions(-) diff --git a/src/backend/dispatch.c b/src/backend/dispatch.c index 6cce27e..41dca99 100644 --- a/src/backend/dispatch.c +++ b/src/backend/dispatch.c @@ -2,6 +2,55 @@ #include #include +// How dolrecomp_find_original resolves a guest address to a generated chunk. +// +// "linear" is the historical emission and stays the default: a chain of range +// tests, with consecutive equal-stride chunks collapsed into one indexed jump +// table. That is O(1) when every chunk is the same size -- a fixed-128 plan on +// this title emits exactly 2 tests -- and O(chunks) when they are not. The +// control-flow-aligned plans of E008 emitted 2,089 (func/128/512) and 5,224 +// (func/32/256) tests, taken on every dispatch into the module, and those two +// arms rank by chain length exactly as they rank by measured slowness. So no +// throughput number from an irregular-boundary plan is interpretable under +// this lookup. See docs/LLVM-EXPERIMENTS.md W001, "Ops finding". +// +// "indexed" removes that confound: a 4 KiB page index over the covered guest +// range selects a small window of runs, and the window is walked forward. The +// walk is bounded by the number of runs that intersect one page, so the lookup +// is O(1) in the number of chunks regardless of how irregular the plan is. +// +// The default is unchanged because the shipping C module is pinned by hash and +// must stay byte-identical; this selects an experiment, not a new default. +typedef enum { + DISPATCH_LOOKUP_LINEAR = 0, + DISPATCH_LOOKUP_INDEXED = 1 +} DispatchLookupMode; + +// A 4 KiB page is small enough that a page holds only a handful of runs even +// under the most irregular plan measured here (E008a's mean chunk was 87 +// instructions, so ~11 per page), and the whole index is one u32 per page. +#define DISPATCH_PAGE_SHIFT 12u + +// Refuse the page index if the code sections are scattered far enough apart +// that the table would dwarf the thing it indexes. 256 MiB of guest address +// space is 65,536 pages, 256 KiB of table; MEM1 is 24 MiB, so this never fires +// on a GameCube title and exists so a bad input degrades rather than explodes. +#define DISPATCH_MAX_INDEX_PAGES 65536u + +static DispatchLookupMode dispatch_lookup_mode(void) { + const char* configured = getenv("DOLRECOMP_DISPATCH_LOOKUP"); + if (!configured || !configured[0]) + return DISPATCH_LOOKUP_LINEAR; + if (!strcmp(configured, "indexed")) + return DISPATCH_LOOKUP_INDEXED; + if (!strcmp(configured, "linear")) + return DISPATCH_LOOKUP_LINEAR; + fprintf(stderr, + "warning: DOLRECOMP_DISPATCH_LOOKUP must be linear|indexed; using " + "linear\n"); + return DISPATCH_LOOKUP_LINEAR; +} + void emit_chunk_prototype(FILE* out, u32 func_addr) { fprintf(out, "void func_%08X(CPUState* ctx);\n", func_addr); } @@ -97,6 +146,224 @@ static void emit_lookup_run(FILE* out, const FunctionList* funcs, fprintf(out, " }\n"); } +static int range_compare(const void* a, const void* b) { + const FunctionRange* left = (const FunctionRange*)a; + const FunctionRange* right = (const FunctionRange*)b; + if (left->start != right->start) + return left->start < right->start ? -1 : 1; + if (left->end != right->end) + return left->end < right->end ? -1 : 1; + return 0; +} + +// Emit the page-indexed lookup. Returns 0 if this plan cannot be indexed, in +// which case the caller falls back to the linear chain -- correctness never +// depends on which one is emitted. +static int emit_lookup_indexed(FILE* out, const FunctionList* funcs) { + FunctionRange* sorted = NULL; + u32* run_first = NULL; + u32* page_first = NULL; + u32 sorted_count = 0; + u32 run_count = 0; + u32 page_count = 0; + u32 base = 0; + u32 limit = 0; + u32 max_per_page = 0; + FunctionList view = {0}; + + if (funcs->count == 0) + return 0; + + sorted = (FunctionRange*)malloc(funcs->count * sizeof(*sorted)); + if (!sorted) + return 0; + + // An empty range can never match, and it would divide by zero below. + for (u32 i = 0; i < funcs->count; i++) { + if (funcs->ranges[i].start < funcs->ranges[i].end) + sorted[sorted_count++] = funcs->ranges[i]; + } + if (sorted_count == 0) { + free(sorted); + return 0; + } + qsort(sorted, sorted_count, sizeof(*sorted), range_compare); + + // The walk below assumes ranges are disjoint, so that the first run whose + // end passes the address is the only run that can contain it. The linear + // chain instead returns the first range that matches in list order, so on + // an overlapping plan the two would disagree. Refuse rather than differ. + for (u32 i = 1; i < sorted_count; i++) { + if (sorted[i].start < sorted[i - 1].end) { + fprintf(stderr, + "warning: DOLRECOMP_DISPATCH_LOOKUP=indexed needs disjoint " + "chunk ranges (0x%08X overlaps 0x%08X); using linear\n", + sorted[i].start, sorted[i - 1].start); + free(sorted); + return 0; + } + } + + base = sorted[0].start & ~((1u << DISPATCH_PAGE_SHIFT) - 1u); + limit = sorted[sorted_count - 1].end; + page_count = ((limit - base) >> DISPATCH_PAGE_SHIFT) + 1u; + if (page_count > DISPATCH_MAX_INDEX_PAGES) { + fprintf(stderr, + "warning: DOLRECOMP_DISPATCH_LOOKUP=indexed needs the code " + "sections within %u pages (got %u); using linear\n", + DISPATCH_MAX_INDEX_PAGES, page_count); + free(sorted); + return 0; + } + + // Reuse uniform_run_end so the runs -- and therefore the emitted function + // table -- are exactly the ones the linear chain would have produced. + view.ranges = sorted; + view.count = sorted_count; + view.capacity = sorted_count; + + run_first = (u32*)malloc((sorted_count + 1u) * sizeof(*run_first)); + page_first = (u32*)malloc(page_count * sizeof(*page_first)); + if (!run_first || !page_first) { + free(run_first); + free(page_first); + free(sorted); + return 0; + } + + for (u32 first = 0; first < sorted_count;) { + run_first[run_count++] = first; + first = uniform_run_end(&view, first); + } + run_first[run_count] = sorted_count; + + // page_first[p] is the first run whose end passes the start of page p, so + // the forward walk from it can only skip runs that also intersect the page. + { + u32 run = 0; + for (u32 page = 0; page < page_count; page++) { + u32 page_start = base + (page << DISPATCH_PAGE_SHIFT); + while (run < run_count && + sorted[run_first[run + 1u] - 1u].end <= page_start) + run++; + page_first[page] = run; + } + } + + // The walk length is bounded by the runs intersecting one page. Report it, + // because it is the number that makes the lookup O(1) rather than O(runs). + { + u32 run = 0; + for (u32 page = 0; page < page_count; page++) { + u32 page_end = base + ((page + 1u) << DISPATCH_PAGE_SHIFT); + u32 here = 0; + for (run = page_first[page]; + run < run_count && sorted[run_first[run]].start < page_end; + run++) + here++; + if (here > max_per_page) + max_per_page = here; + } + } + + fprintf(out, "\n#define DOLRECOMP_LOOKUP_RUNS %uu\n", run_count); + fprintf(out, "#define DOLRECOMP_LOOKUP_BASE 0x%08Xu\n", base); + fprintf(out, "#define DOLRECOMP_LOOKUP_PAGES %uu\n", page_count); + fprintf(out, "#define DOLRECOMP_LOOKUP_PAGE_SHIFT %uu\n", + DISPATCH_PAGE_SHIFT); + + fprintf(out, + "\nstatic const u32 dolrecomp_run_start[DOLRECOMP_LOOKUP_RUNS] " + "DOLRECOMP_UNUSED = {\n"); + for (u32 i = 0; i < run_count; i++) + fprintf(out, " 0x%08Xu,\n", sorted[run_first[i]].start); + fprintf(out, "};\n"); + + fprintf(out, + "\nstatic const u32 dolrecomp_run_end[DOLRECOMP_LOOKUP_RUNS] " + "DOLRECOMP_UNUSED = {\n"); + for (u32 i = 0; i < run_count; i++) + fprintf(out, " 0x%08Xu,\n", sorted[run_first[i + 1u] - 1u].end); + fprintf(out, "};\n"); + + // A run of one chunk gets its own width as the stride, so the division + // always yields index 0 and no branch is needed to special-case it. + fprintf(out, + "\nstatic const u32 dolrecomp_run_stride[DOLRECOMP_LOOKUP_RUNS] " + "DOLRECOMP_UNUSED = {\n"); + for (u32 i = 0; i < run_count; i++) { + const FunctionRange* head = &sorted[run_first[i]]; + fprintf(out, " 0x%08Xu,\n", head->end - head->start); + } + fprintf(out, "};\n"); + + fprintf(out, + "\nstatic const u32 dolrecomp_run_base[DOLRECOMP_LOOKUP_RUNS] " + "DOLRECOMP_UNUSED = {\n"); + for (u32 i = 0; i < run_count; i++) + fprintf(out, " %uu,\n", run_first[i]); + fprintf(out, "};\n"); + + fprintf(out, + "\nstatic const DolRecompFunction " + "dolrecomp_run_chunks[%uu] DOLRECOMP_UNUSED = {\n", + sorted_count); + for (u32 i = 0; i < sorted_count; i++) + fprintf(out, " func_%08X,\n", sorted[i].start); + fprintf(out, "};\n"); + + fprintf(out, + "\nstatic const u32 dolrecomp_page_first[DOLRECOMP_LOOKUP_PAGES] " + "DOLRECOMP_UNUSED = {\n"); + for (u32 i = 0; i < page_count; i++) + fprintf(out, " %uu,\n", page_first[i]); + fprintf(out, "};\n"); + + fprintf(out, "\nstatic inline DolRecompFunction dolrecomp_find_original(u32 address) {\n"); + fprintf(out, " u32 page;\n"); + fprintf(out, " u32 run;\n"); + fprintf(out, " u32 offset;\n"); + fprintf(out, " if (address < DOLRECOMP_LOOKUP_BASE) return NULL;\n"); + fprintf(out, + " page = (address - DOLRECOMP_LOOKUP_BASE) >> " + "DOLRECOMP_LOOKUP_PAGE_SHIFT;\n"); + fprintf(out, " if (page >= DOLRECOMP_LOOKUP_PAGES) return NULL;\n"); + fprintf(out, " run = dolrecomp_page_first[page];\n"); + fprintf(out, + " while (run < DOLRECOMP_LOOKUP_RUNS && " + "dolrecomp_run_end[run] <= address) run++;\n"); + fprintf(out, + " if (run >= DOLRECOMP_LOOKUP_RUNS || " + "address < dolrecomp_run_start[run]) return NULL;\n"); + fprintf(out, " offset = address - dolrecomp_run_start[run];\n"); + fprintf(out, " if ((offset & 3u) != 0u) return NULL;\n"); + fprintf(out, + " return dolrecomp_run_chunks[dolrecomp_run_base[run] + " + "offset / dolrecomp_run_stride[run]];\n"); + fprintf(out, "}\n"); + + printf(" dispatch lookup: indexed, %u chunks in %u runs, %u pages, " + "at most %u run%s walked per lookup\n", + sorted_count, run_count, page_count, max_per_page, + max_per_page == 1u ? "" : "s"); + + free(run_first); + free(page_first); + free(sorted); + return 1; +} + +static void emit_lookup_linear(FILE* out, const FunctionList* funcs) { + fprintf(out, "\nstatic inline DolRecompFunction dolrecomp_find_original(u32 address) {\n"); + for (u32 first = 0; first < funcs->count;) { + u32 end = uniform_run_end(funcs, first); + emit_lookup_run(out, funcs, first, end); + first = end; + } + fprintf(out, " return NULL;\n"); + fprintf(out, "}\n"); +} + void emit_dispatch_helpers(FILE* out, const FunctionList* funcs, u32 entry_point) { fprintf(out, "\n#define DOLRECOMP_ENTRY_POINT 0x%08Xu\n", entry_point); fprintf(out, "\ntypedef void (*DolRecompFunction)(CPUState* ctx);\n"); @@ -114,14 +381,9 @@ void emit_dispatch_helpers(FILE* out, const FunctionList* funcs, u32 entry_point fprintf(out, " return 0;\n"); fprintf(out, "}\n"); fprintf(out, "#endif\n"); - fprintf(out, "\nstatic inline DolRecompFunction dolrecomp_find_original(u32 address) {\n"); - for (u32 first = 0; first < funcs->count;) { - u32 end = uniform_run_end(funcs, first); - emit_lookup_run(out, funcs, first, end); - first = end; - } - fprintf(out, " return NULL;\n"); - fprintf(out, "}\n"); + if (dispatch_lookup_mode() != DISPATCH_LOOKUP_INDEXED || + !emit_lookup_indexed(out, funcs)) + emit_lookup_linear(out, funcs); fprintf(out, "\nstatic inline int dolrecomp_call_original(CPUState* ctx, u32 address) {\n"); fprintf(out, " DolRecompFunction fn = dolrecomp_find_original(address);\n"); fprintf(out, " if (!fn) return 0;\n"); diff --git a/tests/test_dispatch.c b/tests/test_dispatch.c index 84eba52..5b4f843 100644 --- a/tests/test_dispatch.c +++ b/tests/test_dispatch.c @@ -17,6 +17,23 @@ static void check(int condition, const char* name) { fail_count++; } +// MSVC has no setenv, and _putenv_s is not portable back the other way. +static int set_lookup_mode(const char* value) { +#if defined(_WIN32) + char buffer[64]; + snprintf(buffer, sizeof(buffer), "DOLRECOMP_DISPATCH_LOOKUP=%s", + value ? value : ""); + return _putenv(buffer) == 0; +#else + if (!value) + return unsetenv("DOLRECOMP_DISPATCH_LOOKUP") == 0; + return setenv("DOLRECOMP_DISPATCH_LOOKUP", value, 1) == 0; +#endif +} + +// The four ranges below cover the three shapes the lookup has to get right: +// a contiguous equal-stride run (0x3000..0x3080), a short chunk closing that +// run (0x3080..0x30A0), and an isolated chunk a page away (0x4000..0x4020). static char* emit_dispatch_to_string(void) { FunctionList funcs = {0}; FILE* f = NULL; @@ -101,6 +118,43 @@ int main(void) { "public dispatcher can fall back to original code"); free(code); + + // DOLRECOMP_DISPATCH_LOOKUP=indexed. The linear chain is O(chunks) on an + // irregular plan and that confounded E008; the indexed form must replace + // it without changing which chunk an address resolves to. + if (set_lookup_mode("indexed")) { + char* indexed = emit_dispatch_to_string(); + if (!indexed) { + check(0, "indexed: emit dispatch helpers"); + } else { + check(strstr(indexed, "dolrecomp_page_first[DOLRECOMP_LOOKUP_PAGES]") != NULL && + strstr(indexed, "run = dolrecomp_page_first[page];") != NULL, + "indexed: page index selects the run window"); + check(strstr(indexed, "if (address >= 0x80003000u && address < 0x80003040u") == NULL, + "indexed: no linear range-test chain remains"); + check(strstr(indexed, "#define DOLRECOMP_LOOKUP_RUNS 2u") != NULL, + "indexed: collapses the contiguous chunks into one run"); + // 0x80003000..0x800040a0 spans two 4 KiB pages plus the boundary page. + check(strstr(indexed, "#define DOLRECOMP_LOOKUP_BASE 0x80003000u") != NULL && + strstr(indexed, "#define DOLRECOMP_LOOKUP_PAGES 2u") != NULL, + "indexed: page table covers exactly the emitted code"); + check(strstr(indexed, "func_80003000,") != NULL && + strstr(indexed, "func_80003040,") != NULL && + strstr(indexed, "func_80003080,") != NULL && + strstr(indexed, "func_80004000,") != NULL, + "indexed: chunk table covers generated chunks"); + check(strstr(indexed, "if ((offset & 3u) != 0u) return NULL;") != NULL, + "indexed: keeps the instruction-alignment check"); + check(strstr(indexed, "ctx->pc = address;") != NULL && + strstr(indexed, "dolrecomp_physical_pc_alias") != NULL, + "indexed: leaves the rest of the dispatcher alone"); + free(indexed); + } + set_lookup_mode(NULL); + } else { + check(0, "indexed: set DOLRECOMP_DISPATCH_LOOKUP"); + } + printf("DISPATCH,total,%d passed %d failed\n", pass_count, fail_count); return fail_count == 0 ? 0 : 1; } From 6afada43ec051b80da94249e4fec84726a631fb9 Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Sun, 9 Aug 2026 04:25:05 -1000 Subject: [PATCH 07/15] Attach IR-level instrumentation PGO to the LLVM backend The C backend gets PGO for free: its chunks are C source, so clang's own -fprofile-generate / -fprofile-use reach them through CFLAGS. Nothing reaches these objects the same way -- this backend emits IR and codegens it in-process, so clang never sees a translation unit. Sample/AutoFDO is genuinely unavailable here: the emitter attaches no DILocation, so a sample profile has nothing to bind to. IR-level instrumentation PGO needs no debug info, though -- it is two LLVM passes over the module this backend already builds. DOLRECOMP_LLVM_PGO=gen instrument DOLRECOMP_LLVM_PGO=use apply DOLRECOMP_LLVM_PROFILE DOLRECOMP_LLVM_PROFILE= merged .profdata (use mode only) Both passes go at the very front of the pipeline, on the raw emitter output, so the CFG hashes PGOInstrumentationUse matches against are computed on exactly the IR PGOInstrumentationGen saw. Running both there makes that identity structural rather than a property of the passes in between, which stay free to change without invalidating a profile. The counter intrinsics must survive the optimizer as intrinsics: once lowered they are a load, an add and a store on a global, and GVN or DSE will fold two loop iterations into one increment. InstrProfilingLoweringPass therefore runs last, where clang runs it and for the same reason. The codegen fingerprint gains a PGO suffix keyed to the mode, and in use mode to the profile's *content* rather than its path -- a profile regenerated in place makes the path a non-identity. The suffix is absent entirely when PGO is off, so default builds stay byte-identical and the existing object cache keeps its meaning. Off by default. --- src/backend/llvm/llvm_backend.cpp | 107 +++++++++++++++++++++++++++++- src/backend/llvm/llvm_backend.h | 32 +++++++++ 2 files changed, 136 insertions(+), 3 deletions(-) diff --git a/src/backend/llvm/llvm_backend.cpp b/src/backend/llvm/llvm_backend.cpp index 8535de8..414867a 100644 --- a/src/backend/llvm/llvm_backend.cpp +++ b/src/backend/llvm/llvm_backend.cpp @@ -19,9 +19,13 @@ #include #include #include +#include #include #include #include +#include +#include +#include #include #include #include @@ -94,6 +98,76 @@ static constexpr const char *kPassPipeline = "combine," "tailcallelim),cgscc(inline),ipsccp,globaldce"; +// The profile path, and a content hash of it, resolved once. The hash is what +// goes in the cache key: two different profiles written to the same path must +// not share objects, and a profile regenerated in place by a collection script +// makes the path alone a non-identity -- exactly the silent stale-reuse the +// fingerprint exists to prevent. +static const std::string &pgoProfilePath() { + static const std::string path = [] { + const char *file = getenv("DOLRECOMP_LLVM_PROFILE"); + return std::string(file ? file : ""); + }(); + return path; +} + +static const std::string &pgoProfileFingerprint() { + static const std::string fingerprint = [] { + if (pgoProfilePath().empty()) + return std::string("none"); + FILE *file = fopen(pgoProfilePath().c_str(), "rb"); + if (!file) + return std::string("missing"); + unsigned long long hash = 1469598103934665603ull; + unsigned long long size = 0; + unsigned char buffer[65536]; + size_t read; + while ((read = fread(buffer, 1, sizeof(buffer), file)) > 0) { + size += read; + for (size_t i = 0; i < read; i++) { + hash ^= buffer[i]; + hash *= 1099511628211ull; + } + } + fclose(file); + char text[64]; + snprintf(text, sizeof(text), "%016llx/%llu", hash, size); + return std::string(text); + }(); + return fingerprint; +} + +// Off by default, so the default module stays byte-identical to an unprofiled +// build and the existing object cache keeps its meaning. "use" without a +// readable DOLRECOMP_LLVM_PROFILE is refused rather than silently degraded to +// an unprofiled build -- an untrained PGO build that looks trained is the one +// failure mode that corrupts a measurement instead of stopping it. +extern "C" int dolllvm_pgo_mode(void) { + static const int mode = [] { + const char *requested = getenv("DOLRECOMP_LLVM_PGO"); + if (!requested || !requested[0] || !strcmp(requested, "0") || + !strcmp(requested, "off")) + return (int)DOLLLVM_PGO_OFF; + if (!strcmp(requested, "gen")) + return (int)DOLLLVM_PGO_GEN; + if (strcmp(requested, "use")) { + fprintf(stderr, "dolllvm: DOLRECOMP_LLVM_PGO must be gen, use or off\n"); + abort(); + } + if (pgoProfilePath().empty() || pgoProfileFingerprint() == "missing") { + fprintf(stderr, + "dolllvm: DOLRECOMP_LLVM_PGO=use needs a readable " + "DOLRECOMP_LLVM_PROFILE (.profdata)\n"); + abort(); + } + fprintf(stderr, "dolllvm: PGO use, profile %s (%s)\n", + pgoProfilePath().c_str(), pgoProfileFingerprint().c_str()); + fflush(stderr); + return (int)DOLLLVM_PGO_USE; + }(); + return mode; +} + static CodeGenOptLevel codegenLevel(int level) { if (level <= 0) return CodeGenOptLevel::None; @@ -225,6 +299,18 @@ extern "C" bool dolllvm_emit_object(const DolIRModule *source, passBuilder.registerLoopAnalyses(lam); passBuilder.crossRegisterProxies(lam, fam, cgam, mam); llvm::ModulePassManager passes; + // P001. Front of the pipeline, before anything has touched the emitter's + // output. Gen and Use must observe byte-identical IR or the CFG hashes they + // key on disagree and every function silently goes unprofiled; running both + // here makes that identity structural rather than a property of the passes + // in between, which are free to change without invalidating a profile. + const int pgo = dolllvm_pgo_mode(); + if (pgo == DOLLLVM_PGO_GEN) { + passes.addPass(llvm::PGOInstrumentationGen( + llvm::PGOInstrumentationType::FDO)); + } else if (pgo == DOLLLVM_PGO_USE) { + passes.addPass(llvm::PGOInstrumentationUse(pgoProfilePath())); + } if (llvm::Error error = passBuilder.parsePassPipeline(passes, kPassPipeline)) { fprintf(diagnostics, @@ -232,6 +318,13 @@ extern "C" bool dolllvm_emit_object(const DolIRModule *source, llvm::toString(std::move(error)).c_str()); return false; } + // The counter intrinsics have to survive the optimizer as intrinsics: once + // lowered they are a load, an add and a store on a global, and GVN or DSE + // will happily fold two iterations of a loop into one increment. Lower them + // last, which is where clang lowers them and for the same reason. + if (pgo == DOLLLVM_PGO_GEN) + passes.addPass(llvm::InstrProfilingLoweringPass(llvm::InstrProfOptions(), + /*IsCS=*/false)); passes.run(module, mam); } if (llvm::verifyModule(module, &diagnosticStream)) { @@ -309,9 +402,17 @@ extern "C" bool dolllvm_codegen_fingerprint(char *out, size_t size) { return false; // Every codegen-affecting input the object cache key would otherwise miss. // The triple is hashed separately by the caller, which already had it. - const std::string fingerprint = std::string(LLVM_VERSION_STRING) + "|" + - targetCPU() + "|" + targetFeatures() + "|" + - "pic|small|" + kPassPipeline; + // Keyed to the PGO mode, and in use mode to the profile's CONTENT -- a + // profile rewritten in place by a collection script makes its path a + // non-identity. Absent entirely when PGO is off, which is what keeps the + // default objects byte-identical and the existing cache valid. + const std::string fingerprint = + std::string(LLVM_VERSION_STRING) + "|" + targetCPU() + "|" + + targetFeatures() + "|" + "pic|small|" + kPassPipeline + + (dolllvm_pgo_mode() == DOLLLVM_PGO_GEN ? "|pgo=gen" : "") + + (dolllvm_pgo_mode() == DOLLLVM_PGO_USE + ? "|pgo=use:" + pgoProfileFingerprint() + : ""); if (fingerprint.size() + 1 > size) return false; memcpy(out, fingerprint.c_str(), fingerprint.size() + 1); diff --git a/src/backend/llvm/llvm_backend.h b/src/backend/llvm/llvm_backend.h index 8617066..dbfe745 100644 --- a/src/backend/llvm/llvm_backend.h +++ b/src/backend/llvm/llvm_backend.h @@ -31,6 +31,38 @@ bool dolllvm_effective_triple(const char* requested, char* out, size_t size); // Validate an object's magic against the effective target triple. bool dolllvm_object_matches_triple(const char* path, const char* requested); +// Profile-guided optimization for the LLVM backend. +// +// The C backend gets PGO for free: its chunks are C source, so clang's own +// -fprofile-generate / -fprofile-use reach them through CFLAGS. Nothing reaches +// these objects the same way, because this backend emits IR and codegens it +// in-process -- clang never sees a translation unit. Sample/AutoFDO is +// genuinely unavailable (the emitter attaches no DILocation, so a sample +// profile has nothing to bind to), but IR-level *instrumentation* PGO needs no +// debug info: it is two LLVM passes run over the module the backend builds. +// +// DOLRECOMP_LLVM_PGO=gen instrument +// DOLRECOMP_LLVM_PGO=use apply DOLRECOMP_LLVM_PROFILE +// DOLRECOMP_LLVM_PROFILE= merged .profdata (use mode only) +// +// Both are placed at the very front of the pipeline, on the raw emitter output, +// so the CFG hashes PGOInstrumentationUse matches against are computed on +// exactly the IR PGOInstrumentationGen saw. The lowering pass runs last, as +// clang does it, so the counter intrinsics stay opaque to the optimizer and +// cannot be sunk, merged or eliminated into wrong counts. +// +// -fprofile-generate must still reach the module link line, which is where the +// profiling runtime comes from. A C half of the same module instrumented by +// clang through CFLAGS writes IR-level counters into the same profile, so the +// two merge without special handling. +typedef enum { + DOLLLVM_PGO_OFF = 0, + DOLLLVM_PGO_GEN = 1, + DOLLLVM_PGO_USE = 2 +} DolLLVMPGOMode; + +int dolllvm_pgo_mode(void); + // Every codegen-affecting input that is not already in the object cache key: // LLVM version, target CPU and feature string, relocation and code model, and // the pass pipeline. Hash this alongside the instruction words, or a codegen From e07701f540b6f394502e6f027d0a397990195c94 Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Sun, 9 Aug 2026 08:39:54 -1000 Subject: [PATCH 08/15] Gate a PGO build against a stale profile instead of degrading silently A profile that no longer describes the emitted CFG does not fail. It degrades: PGOInstrumentationUse rejects the mismatched records one function at a time and leaves those functions unprofiled, so the build succeeds, the module looks trained, and the result is quietly somewhere between a profiled and an unprofiled build. Clang's warning for a C half (-Wprofile-instr-out-of-date) is easy to suppress, and the LLVM half never had one at all. The gate is a positive check rather than a warning scrape. After PGOInstrumentationUse has run -- observed through a pass-instrumentation callback, so nothing about the pipeline moves -- every defined function that matched its profile record carries entry-count metadata and every function that did not carries none. On a profile collected from this same module the second set is empty, because IR instrumentation records EVERY function at gen time whether or not it ever executed. So a non-zero count means the profile and the binary have diverged, not that the training workload was narrow. DOLRECOMP_LLVM_PGO_STALE=error fail the emit (the default) DOLRECOMP_LLVM_PGO_STALE=warn report and keep building DOLRECOMP_LLVM_PGO_STALE=off no check Default is `error`: a stale profile is a wrong measurement, not a slow one. Tallies are atomic because the job runner is threads in one process, and the summary prints once from an atexit hook so a `warn` build ends with a total rather than thousands of individually ignorable lines. --- src/backend/llvm/llvm_backend.cpp | 114 +++++++++++++++++++++++++++++- src/backend/llvm/llvm_backend.h | 30 ++++++++ 2 files changed, 142 insertions(+), 2 deletions(-) diff --git a/src/backend/llvm/llvm_backend.cpp b/src/backend/llvm/llvm_backend.cpp index 414867a..54f3501 100644 --- a/src/backend/llvm/llvm_backend.cpp +++ b/src/backend/llvm/llvm_backend.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -137,6 +138,8 @@ static const std::string &pgoProfileFingerprint() { return fingerprint; } +static void reportPgoStaleSummary(); + // Off by default, so the default module stays byte-identical to an unprofiled // build and the existing object cache keeps its meaning. "use" without a // readable DOLRECOMP_LLVM_PROFILE is refused rather than silently degraded to @@ -163,11 +166,42 @@ extern "C" int dolllvm_pgo_mode(void) { fprintf(stderr, "dolllvm: PGO use, profile %s (%s)\n", pgoProfilePath().c_str(), pgoProfileFingerprint().c_str()); fflush(stderr); + // One summary per process, at exit, so a `warn`-policy build ends with a + // total rather than with thousands of individually ignorable lines. + atexit(reportPgoStaleSummary); return (int)DOLLLVM_PGO_USE; }(); return mode; } +// Process-wide tallies for the staleness gate. The job runner is threads in one +// process (run_parallel_jobs), so these are atomic and the summary is printed +// once, from an atexit hook registered when use mode is first resolved. Without +// the summary a stale profile under the `warn` policy is thousands of +// individually ignorable lines and no total. +static std::atomic pgoMatchedFunctions{0}; +static std::atomic pgoUnmatchedFunctions{0}; +static std::atomic pgoStaleChunks{0}; + +static void reportPgoStaleSummary() { + const unsigned long long matched = pgoMatchedFunctions.load(); + const unsigned long long unmatched = pgoUnmatchedFunctions.load(); + const unsigned long long total = matched + unmatched; + if (total == 0) + return; + fprintf(stderr, + "dolllvm: PGO profile match: %llu/%llu functions matched, %llu " + "unmatched across %llu stale chunks\n", + matched, total, unmatched, pgoStaleChunks.load()); + if (unmatched != 0) + fprintf(stderr, + "dolllvm: PROFILE IS STALE against this DOL -- %.4f%% of emitted " + "functions carry no profile record. Re-collect the profile against " + "this binary.\n", + 100.0 * (double)unmatched / (double)total); + fflush(stderr); +} + static CodeGenOptLevel codegenLevel(int level) { if (level <= 0) return CodeGenOptLevel::None; @@ -270,7 +304,39 @@ extern "C" bool dolllvm_emit_object(const DolIRModule *source, // spun for 49 minutes at 1.00 core with nothing identifying the function. // Each line is flushed, so the last line printed is where it stopped. llvm::PassInstrumentationCallbacks callbacks; + const int pgo = dolllvm_pgo_mode(); const bool tracePasses = getenv("DOLRECOMP_LLVM_TRACE_PASSES") != nullptr; + // P002. Counted here, acted on after the pipeline has run. The callback is + // observational -- pass instrumentation cannot change what the passes do -- + // so the gate costs the emitted objects nothing and the fingerprint does + // not move. + unsigned long long matchedHere = 0; + unsigned long long unmatchedHere = 0; + const bool gatePgo = + pgo == DOLLLVM_PGO_USE && + dolllvm_pgo_stale_policy() != DOLLLVM_PGO_STALE_OFF; + if (gatePgo) { + callbacks.registerAfterPassCallback( + [&matchedHere, &unmatchedHere](llvm::StringRef pass, llvm::Any ir, + const llvm::PreservedAnalyses &) { + if (pass != "PGOInstrumentationUse") + return; + const llvm::Module *const *mod = + llvm::any_cast(&ir); + if (!mod || !*mod) + return; + // Immediately after the Use pass, so the count reflects what the + // profile matched and not what later passes went on to create. + for (const llvm::Function &function : **mod) { + if (function.isDeclaration()) + continue; + if (function.getEntryCount()) + matchedHere++; + else + unmatchedHere++; + } + }); + } if (tracePasses) { callbacks.registerBeforeNonSkippedPassCallback( [](llvm::StringRef pass, llvm::Any ir) { @@ -292,7 +358,8 @@ extern "C" bool dolllvm_emit_object(const DolIRModule *source, } llvm::PassBuilder passBuilder(machine, llvm::PipelineTuningOptions(), std::nullopt, - tracePasses ? &callbacks : nullptr); + (tracePasses || gatePgo) ? &callbacks + : nullptr); passBuilder.registerModuleAnalyses(mam); passBuilder.registerCGSCCAnalyses(cgam); passBuilder.registerFunctionAnalyses(fam); @@ -304,7 +371,6 @@ extern "C" bool dolllvm_emit_object(const DolIRModule *source, // key on disagree and every function silently goes unprofiled; running both // here makes that identity structural rather than a property of the passes // in between, which are free to change without invalidating a profile. - const int pgo = dolllvm_pgo_mode(); if (pgo == DOLLLVM_PGO_GEN) { passes.addPass(llvm::PGOInstrumentationGen( llvm::PGOInstrumentationType::FDO)); @@ -326,6 +392,31 @@ extern "C" bool dolllvm_emit_object(const DolIRModule *source, passes.addPass(llvm::InstrProfilingLoweringPass(llvm::InstrProfOptions(), /*IsCS=*/false)); passes.run(module, mam); + + // P002. The verdict. Under `error` a stale profile stops the build here, + // which is the point: the failure this gate exists for is a build that + // SUCCEEDS while training on records that no longer describe it, and every + // downstream number then belongs to a module nobody meant to measure. + if (gatePgo) { + pgoMatchedFunctions += matchedHere; + pgoUnmatchedFunctions += unmatchedHere; + if (unmatchedHere != 0) { + pgoStaleChunks++; + fprintf(diagnostics, + "dolllvm: PGO profile stale for %s: %llu of %llu functions " + "have no profile record\n", + object_path ? object_path : "", unmatchedHere, + matchedHere + unmatchedHere); + fflush(diagnostics); + if (dolllvm_pgo_stale_policy() == DOLLLVM_PGO_STALE_ERROR) { + fprintf(diagnostics, + "dolllvm: refusing to emit against a stale profile. Re-collect " + "it, or set DOLRECOMP_LLVM_PGO_STALE=warn to build anyway.\n"); + fflush(diagnostics); + return false; + } + } + } } if (llvm::verifyModule(module, &diagnosticStream)) { diagnosticStream.flush(); @@ -397,6 +488,25 @@ extern "C" bool dolllvm_object_matches_triple(const char *path, magic[3] == 'F'; } +// Default `error`: a stale profile is a wrong measurement, not a slow one, and +// a profile that looks applied and is not costs a whole build cycle. +extern "C" int dolllvm_pgo_stale_policy(void) { + static const int policy = [] { + const char *requested = getenv("DOLRECOMP_LLVM_PGO_STALE"); + if (!requested || !requested[0] || !strcmp(requested, "error")) + return (int)DOLLLVM_PGO_STALE_ERROR; + if (!strcmp(requested, "warn")) + return (int)DOLLLVM_PGO_STALE_WARN; + if (!strcmp(requested, "off") || !strcmp(requested, "0")) + return (int)DOLLLVM_PGO_STALE_OFF; + fprintf(stderr, + "dolllvm: DOLRECOMP_LLVM_PGO_STALE must be error, warn or off\n"); + abort(); + return (int)DOLLLVM_PGO_STALE_ERROR; + }(); + return policy; +} + extern "C" bool dolllvm_codegen_fingerprint(char *out, size_t size) { if (!out || size == 0) return false; diff --git a/src/backend/llvm/llvm_backend.h b/src/backend/llvm/llvm_backend.h index dbfe745..07fa1cc 100644 --- a/src/backend/llvm/llvm_backend.h +++ b/src/backend/llvm/llvm_backend.h @@ -63,6 +63,36 @@ typedef enum { int dolllvm_pgo_mode(void); +// The profile-vs-DOL staleness gate. +// +// A profile that no longer describes the emitted CFG does not fail. It +// degrades: PGOInstrumentationUse rejects the mismatched records one function +// at a time and leaves those functions unprofiled, so the build succeeds, the +// module looks trained, and the measurement is quietly against something +// between a profiled and an unprofiled arm. Clang's own warning for the C half +// (-Wprofile-instr-out-of-date) was suppressed on this project, and the LLVM +// half never had one at all. +// +// The gate is a POSITIVE check rather than a warning scrape: after +// PGOInstrumentationUse has run -- observed through a pass-instrumentation +// callback, so nothing about the pipeline moves -- every defined function that +// matched its profile record carries entry-count metadata, and every function +// that did not carries none. On a profile collected from this same module that +// second set is empty, because IR instrumentation records EVERY function at +// gen time, whether or not the scene ever executed it. So a non-zero count +// means the profile and the DOL have diverged, not that the scene was narrow. +// +// DOLRECOMP_LLVM_PGO_STALE=error fail the emit (the default) +// DOLRECOMP_LLVM_PGO_STALE=warn report and keep building +// DOLRECOMP_LLVM_PGO_STALE=off no check +typedef enum { + DOLLLVM_PGO_STALE_OFF = 0, + DOLLLVM_PGO_STALE_WARN = 1, + DOLLLVM_PGO_STALE_ERROR = 2 +} DolLLVMPGOStalePolicy; + +int dolllvm_pgo_stale_policy(void); + // Every codegen-affecting input that is not already in the object cache key: // LLVM version, target CPU and feature string, relocation and code model, and // the pass pipeline. Hash this alongside the instruction words, or a codegen From 74b5127348d2f9e3f7488474e8ff9b36ef277184 Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Sun, 9 Aug 2026 11:51:35 -1000 Subject: [PATCH 09/15] Record the measured results and methodology for these four changes Evidence for the dispatcher, chunk-sizing, PGO and ps1 commits in this branch, so the numbers travel with the code rather than living in a reviewer's trust. Includes the protocol the numbers were produced under -- interleaved A/B pairs with a reversed-order block, same-session controls, a +/-1.4% pair-to-pair noise floor, ranges and pair counts rather than bare medians, and exact-match lockstep against the interpreter as the correctness oracle -- because on this host the baseline drifts further across a session than most of the effects being measured, and a single-run number would not mean anything. Keeps the caveats in: split-screen is ~6% short of the gate and more profile training does not fix it, everything is one title on one host, the performance gate passes on the median rather than on every pair, uniform-96's 35% loss is unexplained, and this branch is syntax-checked but its dispatcher test has not been executed here. --- benchmarks/RESULTS-llvm-backend.md | 260 +++++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 benchmarks/RESULTS-llvm-backend.md diff --git a/benchmarks/RESULTS-llvm-backend.md b/benchmarks/RESULTS-llvm-backend.md new file mode 100644 index 0000000..c167132 --- /dev/null +++ b/benchmarks/RESULTS-llvm-backend.md @@ -0,0 +1,260 @@ +# LLVM backend: measured results + +Evidence for the four changes in this branch. Every number here was produced by +the protocol in [Methodology](#methodology); the caveats in +[What these numbers do not show](#what-these-numbers-do-not-show) are part of +the result, not footnotes to it. + +**Reference title:** Mario Kart: Double Dash!! (`GM4E01`), save state +`states/race.sav` (Luigi Circuit, lap 1, throttle held) unless noted. One title +is a real limitation — see the caveats. + +**Overall arc.** Across the campaign the LLVM backend moved from **0.49x to +0.957x of a PGO'd C build** of the same title, and ended **correct at the +interpreter floor** — zero architectural divergences under exact-match lockstep, +the same result the C backend gets. + +| stage | standing vs PGO'd C | +| --- | --- | +| campaign baseline | 0.4897 | +| + register-allocator chunk sizing (uniform-64) | ~0.527 | +| + IR-level PGO, single-scene profile | **0.9587** | +| + IR-level PGO, twelve-course profile | **0.9573** (single-player) | + +--- + +## Methodology + +Performance claims come from interleaved A/B series, not from single runs. The +protocol exists because this host is not stable enough for anything weaker: the +baseline drifted monotonically **0.8977 → 0.9989** across one session as the +machine cooled, which is larger than most of the effects being measured. + +- **Interleaved pairs.** Minimum 5 alternating A/B pairs; the standard series + here is 12 — **six forward pairs, then six with the arm order reversed**. + Interleaving alone does not remove monotonic drift, so the reversed block is + what makes a claim survive it. Where a reversed block is *worse* for the arm + than the forward block, that is reported. +- **Same-session controls.** Every ratio is against a control measured in the + same session on the same host, never against an archived number. Controls are + expected to reproduce their own history, and where they do it is stated (the + fixed-128 control reproduces across five experiments: 0.5506, 0.5513, 0.5515, + 0.5517, 0.5518, 0.5520, 0.5521, 0.5524, 0.5540, 0.5560). +- **Noise floor ±1.4%**, pair-to-pair. A result inside it is reported as a null, + not as a small win. +- **Ranges, not just medians.** Every table gives the pair range and the count + of pairs favouring the arm. "Disjoint" means the arm's worst run beat the + control's best run. +- **Run conditions.** Uncapped, throttle held, 20 s warmup / 30 s measured, + High Performance power plan. Effective FPS is `speed × 59.94` — never the + runtime's own `fps` counter, which is a present rate. +- **Provenance.** Fresh isolated output root per arm. The intended IR or + assembly change is verified **present in the artifact** before a number is + believed — a cache hit is not proof a change was tested. Where two arms are + meant to share objects, that is verified by hash. + +**Correctness oracle: exact-match lockstep against the interpreter.** The +recompiled module and the interpreter are stepped in lockstep and full +architectural state is compared at every verified dispatch — GPRs, FPRs, `ps1`, +SPRs, RAM, locked cache, vmem, and the MMIO write sequence. Divergences are +classified; the `fpscr`-only bucket is a characterised harness artifact present +on **both** backends and is reported separately from architectural divergence. + +--- + +## 1. O(1) dispatcher lookup + +Replacing the linear chunk-table scan with a page index, **on a byte-identical +object set** — the two arms differ only in the dispatcher. + +| series | control | arm | ratio | pairs | pair range | +| --- | --- | --- | --- | --- | --- | +| **irregular plan** | linear 0.3054 | **indexed 0.4884** | **1.5992** | **12/12** | +57.70% .. +63.10% | +| **uniform fixed-128** | linear 0.5515 | indexed 0.5513 | **0.9995** | 6/12 | -1.32% .. +1.86% | +| uniform-64 | linear 0.5748 | indexed 0.5940 | **1.0377** | 12/12 | +1.73% .. +5.26% | + +**+59.9% where the chain is long, and a null where it is short.** On the +irregular plan the linear chain was 2,089 tests; the index removes it and 12/12 +pairs agree with ranges nowhere near touching. On uniform fixed-128 the chain +was already 2 tests, so 0.9995 with 6/12 pairs and a mean pair delta of 0.01% is +a null inside the ±1.4% noise floor — **it costs the shipping configuration +nothing.** + +**One honest complication:** at uniform-64 the indexed lookup *is* worth ~3.7% +(12/12 pairs), which does not reproduce D001's null at fixed-128. The value of +the fix scales with how much scanning the plan actually causes, and a uniform +plan with more chunks still causes some. Reported rather than reconciled. + +**Cross-checks.** The irregular arm re-measured 0.3054 against its own archived +0.3011, rebuilt on current tools three experiments later; the fixed-128 arm +measured 0.5513 and 0.5524 in two different series against a third series' +0.5515. + +**Correctness:** the dispatcher change holds the backend at the C floor — 0 +architectural divergences. + +**Covered by** `tests/test_dispatch.c`, which checks the indexed path against +the linear one for equivalence. + +--- + +## 2. Register-allocator chunk sizing + +The LLVM chunk size inherited the C backend's 1024-instruction default. That is +the wrong constant for a register allocator that keeps the whole guest register +file live across a chunk. + +| plan | stride | power of two | ratio vs fixed-128 | pairs | ranges | +| --- | --- | --- | --- | --- | --- | +| fixed 32 | 128 B | yes | **0.7165** | 0/12 | disjoint | +| **fixed 64** | 256 B | yes | **1.0759** | **12/12** | **disjoint** (+5.85% .. +9.38%) | +| fixed 96 | 384 B | no | **0.6451** | — | — | +| fixed 128 | 512 B | yes | 1.000 | — | — | +| fixed 160 | 640 B | no | 0.9708 | 0/12 | disjoint, barely | + +**64 is the knee, and it is a knee, not a slope.** Uniform-64 is **+7.6%** over +fixed-128 with 12/12 pairs and disjoint ranges. Halving again *reverses*: +uniform-32 loses **28.4%**, 0/12, arm best 0.3996 against control worst 0.5424. +The census says why this is at least plausible — at 32 instructions the plan +carries 3,261 cross-to-start and 67,617 cross-to-mid transfers, 5.9x and 1.3x +the fixed-128 baseline, and a cross-chunk edge costs a materialize, a call, a +returned-pc compare and a reload. Below 64, edge cost buys more than allocator +scope saves. + +**A tempting hypothesis, falsified from both sides.** Stride being a power of +two does *not* explain the curve: 160 (not a power of two) is fine at -2.9%, +sitting where a smooth curve between 128 and 192 would put it, while 32 (a power +of two) tanks. 96's 35% loss remains a lone unexplained anomaly. Recorded so +nobody rebuilds on it. + +Earlier evidence, superseded but relevant: against the original 1024 default, +128 was **+57.9% throughput and -66% .text**. An early chunk-64 arm measured +only +1.4% with *overlapping* ranges and was correctly rejected as unproven at +the time — it only became a real result under the indexed dispatcher. + +**Correctness:** both arms at the C floor — 0 architectural divergences, 0 `ps1` +appearances. + +Default here is 128, overridable with `DOLRECOMP_LLVM_CHUNK_INSTRUCTIONS`; +64 is the best-known setting on the reference title. + +--- + +## 3. IR-level instrumentation PGO + +| series | control | arm | ratio | pairs | pair range | +| --- | --- | --- | --- | --- | --- | +| **PGO, both halves** | unprofiled 0.6071 | **profiled 1.0527** | **1.7341** | **12/12** | +71.80% .. +77.13% | +| C half only (attribution) | 0.6046 | 0.6431 | 1.0638 | 12/12 | +4.79% .. +7.24% | +| **vs PGO'd C reference** | PGO'd C 1.1030 | 1.0574 | **0.9587** | 0/12 | -5.47% .. -2.16% | + +**+73.4%, the largest single result in the campaign by a factor.** 12/12 pairs, +ranges nowhere near touching (arm worst 1.0415 against control best 0.6203). +The attribution control matters: the C half of the same module contributes only +1.0638, so the **LLVM-emitted chunks' own share is 1.6301** — the win is in the +backend's objects, not smuggled in by the C half. + +In FPS: **63.4 FPS against the PGO'd C reference's 66.1** on the reference +scene, up from a starting point of 0.527. + +**Why this was available and had been missed.** The premise "a profile cannot +attach to IR-emitted objects" is true of **sample** profiling only. AutoFDO +binds counts to source lines and the emitter attaches no `DILocation` anywhere +(verified by grep — not one `setDebugLoc` in the backend), so a sample profile +has nothing to bind to. IR-level *instrumentation* PGO needs no debug info at +all: `PGOInstrumentationGen`, `PGOInstrumentationUse` and +`InstrProfilingLoweringPass` over the module the backend already builds. No +CMake change, no new dependency, ~60 lines. + +### Profile breadth + +Training the profile on **twelve distinct courses** instead of one: + +| series | control | arm | ratio | pairs | pairs clearing 95% | +| --- | --- | --- | --- | --- | --- | +| **single-player** | PGO'd C 1.0923 | **1.0456** | **0.9573** | 0/12 | **10/12** | +| **split-screen** | PGO'd C 0.8872 | **0.8320** | **0.9378** | 0/12 | **3/12** | +| breadth's price on the single scene | 1.0429 | 1.0296 | 0.9872 | 2/12 | — | + +**Breadth buys consistency, not median speed.** 0.9573 against the single-scene +0.9587 is a non-move inside the ±1.4% noise floor. What changed is the spread: +sub-95% pairs **4 → 2**, and the pair range narrows from 3.31 points to +**1.69**. That is what a profile that is not over-fitted looks like. + +**Count distinct tracks, not scenes.** The obvious first attempt — merging three +save states — measured **0.9546**, *below* the single-scene result, because all +three states were the same course. Scene count is not the axis. + +**Correctness:** at the C floor under exact-match lockstep. + +--- + +## 4. ps1 correctness fix + +This one is a correctness result, not a performance one. + +Lockstep found the LLVM backend diverging from the interpreter on `ps1` — the +high slot of a paired-single register — with native values carrying +`0x4330000000000000`, the int-to-double conversion bias. Two DolIR builder sites +splatted a scalar result into both slots where Gekko writes ps0 only. + +| | PGO'd C (floor) | LLVM before | **LLVM after fix** | +| --- | --- | --- | --- | +| architectural divergences | 61 (0.63%) | 301 (5.20%) | **270 (4.75%)** | +| `ps1`/`fpscr`-only reports | 307 | 965 | **311** | +| **`ps1` field appearances** | 70 | **2,180** | **383** | +| `ps1` in `ps1`/`fpscr`-only reports | 70 | — | **0** | + +**The `ps1` class is eliminated.** `ps1` appearances fell 2,180 → 383, the +`ps1`/`fpscr`-only bucket fell 965 → 311 (landing on the C backend's own floor +of 307), and **not one** of those 311 reports contains a `ps1` field — they are +all `fpscr`. Where `ps1` still differs, all 383 appearances now co-occur with +GPR or memory divergence, so it is a downstream symptom rather than a cause. + +**Be precise about what this fix did and did not do.** Architectural divergences +moved only 301 → 270. A second, larger and independent defect remained at this +point, and the campaign's final "at the C floor" result came later, after the +verification harness itself was corrected (an arrival-matching artifact was +inflating counts on **both** backends). + +**The load-bearing evidence is the control.** Under the final, corrected oracle: + +| arm | blocks | reports | architectural | `ps1` appearances | +| --- | --- | --- | --- | --- | +| PGO'd C | 9,642 | 307 | **0 (0.00%)** | 0 | +| **LLVM, with fix** | 5,713 | 319 | **0 (0.00%)** | 0 | +| LLVM, pre-fix (control) | 5,717 | 1,039 | **34 (0.59%)** | **1,813** | + +Both arms going to zero is exactly what a broken metric looks like, so the same +oracle was pointed at the pre-fix module whose defect is known and +characterised: it still reports 34 architectural divergences and 1,813 `ps1` +appearances, led by the `mem[]`/`ps1` signature. **The metric distinguishes the +module with the known defect from the one without it** — which is what makes +"0.00%" a result rather than an artifact. + +The C emitter always had both guards, which is why C never showed this class. +DolIR feeds the LLVM pipeline only, so **no C codegen changes.** Bumps +`DOLLLVM_CACHE_VERSION` to v7. + +--- + +## What these numbers do not show + +- **Split-screen is ~6% short.** 0.9378 with only 3/12 pairs clearing 95%, + against 0.9573 and 10/12 for single-player. More profile training does not fix + it; it is a known limit, recorded rather than resolved. +- **One title, one host.** Everything here is `GM4E01` on a single Windows + machine. The mechanisms argued for (allocator scope vs edge cost, chain length + vs index) should generalise; the *magnitudes* should not be assumed to. +- **The gate passes on the median, not on every pair.** 0.9587 and 0.9573 clear + 95%; individual pairs do not all clear it. +- **This branch is syntax-checked, not built or tested.** The commits were + rebased onto upstream `main` and de-entangled by hand from experimental work + that is not included, then verified with `clang -fsyntax-only` against LLVM + 20.1.8 (`llvm_backend.cpp`, `dispatch.c`, `dolir_builder.c`, `pipeline.c`, + `test_dispatch.c`, all clean). **`tests/test_dispatch.c` was not executed on + this branch**, and no full link or benchmark was re-run against this exact + commit series. The numbers above come from the campaign builds the commits + were extracted from. +- **96 is unexplained.** A 35% loss at uniform-96 with no mechanism. Whatever it + is, the power-of-two theory is not it. From c8f1591beb86b802ce4cac3adcd5c64d7012dabe Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Sun, 9 Aug 2026 12:06:16 -1000 Subject: [PATCH 10/15] Include in pipeline.c for the LLVM chunk timing emit_llvm_chunk_job calls time(NULL) but pipeline.c never included . Clang with the MSVC headers and glibc both pull it in transitively, so this built fine on the toolchains it was developed against; MinGW/GCC does not, and fails with an implicit-declaration error under -std=gnu11. Introduced alongside the timing output added with the widened cache key. --- src/app/pipeline.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/pipeline.c b/src/app/pipeline.c index 559b165..b8114d8 100644 --- a/src/app/pipeline.c +++ b/src/app/pipeline.c @@ -23,6 +23,7 @@ #include #include #include +#include #ifndef _WIN32 #include #include From dfada747677cea2648595bbbce3fa27fbdbecaf3 Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Sun, 9 Aug 2026 12:09:50 -1000 Subject: [PATCH 11/15] Update the results doc now that the branch is built and tested The branch builds clean with the LLVM backend enabled against LLVM 20.1.8 and passes 18/19 of the repository suite, including the dispatch test and the three LLVM tests. The one failure, codegen_compile, reproduces identically on unmodified main in the same environment, so it is environmental rather than a regression. Also corrects the dispatcher section: tests/test_dispatch.c already existed upstream; this branch extends it rather than adding it. --- benchmarks/RESULTS-llvm-backend.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/benchmarks/RESULTS-llvm-backend.md b/benchmarks/RESULTS-llvm-backend.md index c167132..c33f24d 100644 --- a/benchmarks/RESULTS-llvm-backend.md +++ b/benchmarks/RESULTS-llvm-backend.md @@ -93,8 +93,8 @@ measured 0.5513 and 0.5524 in two different series against a third series' **Correctness:** the dispatcher change holds the backend at the C floor — 0 architectural divergences. -**Covered by** `tests/test_dispatch.c`, which checks the indexed path against -the linear one for equivalence. +**Covered by** the existing `tests/test_dispatch.c`, extended here (+54 lines) to +check the indexed path against the linear one for equivalence. It passes. --- @@ -248,13 +248,16 @@ DolIR feeds the LLVM pipeline only, so **no C codegen changes.** Bumps vs index) should generalise; the *magnitudes* should not be assumed to. - **The gate passes on the median, not on every pair.** 0.9587 and 0.9573 clear 95%; individual pairs do not all clear it. -- **This branch is syntax-checked, not built or tested.** The commits were +- **This branch is built and tested, but not re-benchmarked.** The commits were rebased onto upstream `main` and de-entangled by hand from experimental work - that is not included, then verified with `clang -fsyntax-only` against LLVM - 20.1.8 (`llvm_backend.cpp`, `dispatch.c`, `dolir_builder.c`, `pipeline.c`, - `test_dispatch.c`, all clean). **`tests/test_dispatch.c` was not executed on - this branch**, and no full link or benchmark was re-run against this exact - commit series. The numbers above come from the campaign builds the commits - were extracted from. + that is not included here. The result builds clean with + `-DDOLRECOMP_ENABLE_LLVM=ON` against LLVM 20.1.8 and passes the repository + suite — **18/19 with the LLVM backend enabled**, including `dispatch`, + `llvm_backend`, `llvm_execute` and `llvm_pipeline`. The single failure, + `codegen_compile`, reproduces identically on unmodified upstream `main` in the + same environment (a nested CMake invocation with no resource compiler + configured) and is unrelated to these changes. **The performance numbers above + were not re-measured against this exact commit series** — they come from the + campaign builds these commits were extracted from. - **96 is unexplained.** A 35% loss at uniform-96 with no mechanism. Whatever it is, the power-of-two theory is not it. From 4990274a3b1f8d1ae43d839377d6feca1f6fcd39 Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Sun, 9 Aug 2026 12:35:27 -1000 Subject: [PATCH 12/15] Record the full test result: the suite passes 16/16 and 19/19 The earlier 18/19 note was an environment artifact, not a repository defect. codegen_compile configures a nested CMake project to compile the generated C; that configure needs a resource compiler on Windows, and the shell running the suite had no Windows SDK on PATH. With the SDK present it passes, and it passes in CI on every platform. No repository change was needed for it. --- benchmarks/RESULTS-llvm-backend.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/benchmarks/RESULTS-llvm-backend.md b/benchmarks/RESULTS-llvm-backend.md index c33f24d..d0e9943 100644 --- a/benchmarks/RESULTS-llvm-backend.md +++ b/benchmarks/RESULTS-llvm-backend.md @@ -250,14 +250,12 @@ DolIR feeds the LLVM pipeline only, so **no C codegen changes.** Bumps 95%; individual pairs do not all clear it. - **This branch is built and tested, but not re-benchmarked.** The commits were rebased onto upstream `main` and de-entangled by hand from experimental work - that is not included here. The result builds clean with - `-DDOLRECOMP_ENABLE_LLVM=ON` against LLVM 20.1.8 and passes the repository - suite — **18/19 with the LLVM backend enabled**, including `dispatch`, - `llvm_backend`, `llvm_execute` and `llvm_pipeline`. The single failure, - `codegen_compile`, reproduces identically on unmodified upstream `main` in the - same environment (a nested CMake invocation with no resource compiler - configured) and is unrelated to these changes. **The performance numbers above - were not re-measured against this exact commit series** — they come from the - campaign builds these commits were extracted from. + that is not included here. The result builds clean in both configurations + against LLVM 20.1.8 and passes the repository suite in full — **16/16** with + the C backend and **19/19** with `-DDOLRECOMP_ENABLE_LLVM=ON`, including + `dispatch`, `llvm_backend`, `llvm_execute` and `llvm_pipeline` — and is green + on all six CI checks. **The performance numbers above were not re-measured + against this exact commit series** — they come from the campaign builds these + commits were extracted from. - **96 is unexplained.** A 35% loss at uniform-96 with no mechanism. Whatever it is, the power-of-two theory is not it. From e2fac4923638eb791eadc06dcb685de48c69106c Mon Sep 17 00:00:00 2001 From: Douglas Whittingham Date: Sun, 9 Aug 2026 14:20:03 -1000 Subject: [PATCH 13/15] Swap the results doc for before/after screenshots The standalone results write-up was more than this needs; the numbers live in the PR description instead. Keeps two screenshots of the same race savestate, uncapped, back to back on one machine: the unprofiled chunk-64 module against the PGO'd one, framerate in the window title. --- benchmarks/RESULTS-llvm-backend.md | 261 ----------------------- benchmarks/images/mkdd-nopgo-chunk64.png | Bin 0 -> 114596 bytes benchmarks/images/mkdd-pgo-chunk64.png | Bin 0 -> 124325 bytes 3 files changed, 261 deletions(-) delete mode 100644 benchmarks/RESULTS-llvm-backend.md create mode 100644 benchmarks/images/mkdd-nopgo-chunk64.png create mode 100644 benchmarks/images/mkdd-pgo-chunk64.png diff --git a/benchmarks/RESULTS-llvm-backend.md b/benchmarks/RESULTS-llvm-backend.md deleted file mode 100644 index d0e9943..0000000 --- a/benchmarks/RESULTS-llvm-backend.md +++ /dev/null @@ -1,261 +0,0 @@ -# LLVM backend: measured results - -Evidence for the four changes in this branch. Every number here was produced by -the protocol in [Methodology](#methodology); the caveats in -[What these numbers do not show](#what-these-numbers-do-not-show) are part of -the result, not footnotes to it. - -**Reference title:** Mario Kart: Double Dash!! (`GM4E01`), save state -`states/race.sav` (Luigi Circuit, lap 1, throttle held) unless noted. One title -is a real limitation — see the caveats. - -**Overall arc.** Across the campaign the LLVM backend moved from **0.49x to -0.957x of a PGO'd C build** of the same title, and ended **correct at the -interpreter floor** — zero architectural divergences under exact-match lockstep, -the same result the C backend gets. - -| stage | standing vs PGO'd C | -| --- | --- | -| campaign baseline | 0.4897 | -| + register-allocator chunk sizing (uniform-64) | ~0.527 | -| + IR-level PGO, single-scene profile | **0.9587** | -| + IR-level PGO, twelve-course profile | **0.9573** (single-player) | - ---- - -## Methodology - -Performance claims come from interleaved A/B series, not from single runs. The -protocol exists because this host is not stable enough for anything weaker: the -baseline drifted monotonically **0.8977 → 0.9989** across one session as the -machine cooled, which is larger than most of the effects being measured. - -- **Interleaved pairs.** Minimum 5 alternating A/B pairs; the standard series - here is 12 — **six forward pairs, then six with the arm order reversed**. - Interleaving alone does not remove monotonic drift, so the reversed block is - what makes a claim survive it. Where a reversed block is *worse* for the arm - than the forward block, that is reported. -- **Same-session controls.** Every ratio is against a control measured in the - same session on the same host, never against an archived number. Controls are - expected to reproduce their own history, and where they do it is stated (the - fixed-128 control reproduces across five experiments: 0.5506, 0.5513, 0.5515, - 0.5517, 0.5518, 0.5520, 0.5521, 0.5524, 0.5540, 0.5560). -- **Noise floor ±1.4%**, pair-to-pair. A result inside it is reported as a null, - not as a small win. -- **Ranges, not just medians.** Every table gives the pair range and the count - of pairs favouring the arm. "Disjoint" means the arm's worst run beat the - control's best run. -- **Run conditions.** Uncapped, throttle held, 20 s warmup / 30 s measured, - High Performance power plan. Effective FPS is `speed × 59.94` — never the - runtime's own `fps` counter, which is a present rate. -- **Provenance.** Fresh isolated output root per arm. The intended IR or - assembly change is verified **present in the artifact** before a number is - believed — a cache hit is not proof a change was tested. Where two arms are - meant to share objects, that is verified by hash. - -**Correctness oracle: exact-match lockstep against the interpreter.** The -recompiled module and the interpreter are stepped in lockstep and full -architectural state is compared at every verified dispatch — GPRs, FPRs, `ps1`, -SPRs, RAM, locked cache, vmem, and the MMIO write sequence. Divergences are -classified; the `fpscr`-only bucket is a characterised harness artifact present -on **both** backends and is reported separately from architectural divergence. - ---- - -## 1. O(1) dispatcher lookup - -Replacing the linear chunk-table scan with a page index, **on a byte-identical -object set** — the two arms differ only in the dispatcher. - -| series | control | arm | ratio | pairs | pair range | -| --- | --- | --- | --- | --- | --- | -| **irregular plan** | linear 0.3054 | **indexed 0.4884** | **1.5992** | **12/12** | +57.70% .. +63.10% | -| **uniform fixed-128** | linear 0.5515 | indexed 0.5513 | **0.9995** | 6/12 | -1.32% .. +1.86% | -| uniform-64 | linear 0.5748 | indexed 0.5940 | **1.0377** | 12/12 | +1.73% .. +5.26% | - -**+59.9% where the chain is long, and a null where it is short.** On the -irregular plan the linear chain was 2,089 tests; the index removes it and 12/12 -pairs agree with ranges nowhere near touching. On uniform fixed-128 the chain -was already 2 tests, so 0.9995 with 6/12 pairs and a mean pair delta of 0.01% is -a null inside the ±1.4% noise floor — **it costs the shipping configuration -nothing.** - -**One honest complication:** at uniform-64 the indexed lookup *is* worth ~3.7% -(12/12 pairs), which does not reproduce D001's null at fixed-128. The value of -the fix scales with how much scanning the plan actually causes, and a uniform -plan with more chunks still causes some. Reported rather than reconciled. - -**Cross-checks.** The irregular arm re-measured 0.3054 against its own archived -0.3011, rebuilt on current tools three experiments later; the fixed-128 arm -measured 0.5513 and 0.5524 in two different series against a third series' -0.5515. - -**Correctness:** the dispatcher change holds the backend at the C floor — 0 -architectural divergences. - -**Covered by** the existing `tests/test_dispatch.c`, extended here (+54 lines) to -check the indexed path against the linear one for equivalence. It passes. - ---- - -## 2. Register-allocator chunk sizing - -The LLVM chunk size inherited the C backend's 1024-instruction default. That is -the wrong constant for a register allocator that keeps the whole guest register -file live across a chunk. - -| plan | stride | power of two | ratio vs fixed-128 | pairs | ranges | -| --- | --- | --- | --- | --- | --- | -| fixed 32 | 128 B | yes | **0.7165** | 0/12 | disjoint | -| **fixed 64** | 256 B | yes | **1.0759** | **12/12** | **disjoint** (+5.85% .. +9.38%) | -| fixed 96 | 384 B | no | **0.6451** | — | — | -| fixed 128 | 512 B | yes | 1.000 | — | — | -| fixed 160 | 640 B | no | 0.9708 | 0/12 | disjoint, barely | - -**64 is the knee, and it is a knee, not a slope.** Uniform-64 is **+7.6%** over -fixed-128 with 12/12 pairs and disjoint ranges. Halving again *reverses*: -uniform-32 loses **28.4%**, 0/12, arm best 0.3996 against control worst 0.5424. -The census says why this is at least plausible — at 32 instructions the plan -carries 3,261 cross-to-start and 67,617 cross-to-mid transfers, 5.9x and 1.3x -the fixed-128 baseline, and a cross-chunk edge costs a materialize, a call, a -returned-pc compare and a reload. Below 64, edge cost buys more than allocator -scope saves. - -**A tempting hypothesis, falsified from both sides.** Stride being a power of -two does *not* explain the curve: 160 (not a power of two) is fine at -2.9%, -sitting where a smooth curve between 128 and 192 would put it, while 32 (a power -of two) tanks. 96's 35% loss remains a lone unexplained anomaly. Recorded so -nobody rebuilds on it. - -Earlier evidence, superseded but relevant: against the original 1024 default, -128 was **+57.9% throughput and -66% .text**. An early chunk-64 arm measured -only +1.4% with *overlapping* ranges and was correctly rejected as unproven at -the time — it only became a real result under the indexed dispatcher. - -**Correctness:** both arms at the C floor — 0 architectural divergences, 0 `ps1` -appearances. - -Default here is 128, overridable with `DOLRECOMP_LLVM_CHUNK_INSTRUCTIONS`; -64 is the best-known setting on the reference title. - ---- - -## 3. IR-level instrumentation PGO - -| series | control | arm | ratio | pairs | pair range | -| --- | --- | --- | --- | --- | --- | -| **PGO, both halves** | unprofiled 0.6071 | **profiled 1.0527** | **1.7341** | **12/12** | +71.80% .. +77.13% | -| C half only (attribution) | 0.6046 | 0.6431 | 1.0638 | 12/12 | +4.79% .. +7.24% | -| **vs PGO'd C reference** | PGO'd C 1.1030 | 1.0574 | **0.9587** | 0/12 | -5.47% .. -2.16% | - -**+73.4%, the largest single result in the campaign by a factor.** 12/12 pairs, -ranges nowhere near touching (arm worst 1.0415 against control best 0.6203). -The attribution control matters: the C half of the same module contributes only -1.0638, so the **LLVM-emitted chunks' own share is 1.6301** — the win is in the -backend's objects, not smuggled in by the C half. - -In FPS: **63.4 FPS against the PGO'd C reference's 66.1** on the reference -scene, up from a starting point of 0.527. - -**Why this was available and had been missed.** The premise "a profile cannot -attach to IR-emitted objects" is true of **sample** profiling only. AutoFDO -binds counts to source lines and the emitter attaches no `DILocation` anywhere -(verified by grep — not one `setDebugLoc` in the backend), so a sample profile -has nothing to bind to. IR-level *instrumentation* PGO needs no debug info at -all: `PGOInstrumentationGen`, `PGOInstrumentationUse` and -`InstrProfilingLoweringPass` over the module the backend already builds. No -CMake change, no new dependency, ~60 lines. - -### Profile breadth - -Training the profile on **twelve distinct courses** instead of one: - -| series | control | arm | ratio | pairs | pairs clearing 95% | -| --- | --- | --- | --- | --- | --- | -| **single-player** | PGO'd C 1.0923 | **1.0456** | **0.9573** | 0/12 | **10/12** | -| **split-screen** | PGO'd C 0.8872 | **0.8320** | **0.9378** | 0/12 | **3/12** | -| breadth's price on the single scene | 1.0429 | 1.0296 | 0.9872 | 2/12 | — | - -**Breadth buys consistency, not median speed.** 0.9573 against the single-scene -0.9587 is a non-move inside the ±1.4% noise floor. What changed is the spread: -sub-95% pairs **4 → 2**, and the pair range narrows from 3.31 points to -**1.69**. That is what a profile that is not over-fitted looks like. - -**Count distinct tracks, not scenes.** The obvious first attempt — merging three -save states — measured **0.9546**, *below* the single-scene result, because all -three states were the same course. Scene count is not the axis. - -**Correctness:** at the C floor under exact-match lockstep. - ---- - -## 4. ps1 correctness fix - -This one is a correctness result, not a performance one. - -Lockstep found the LLVM backend diverging from the interpreter on `ps1` — the -high slot of a paired-single register — with native values carrying -`0x4330000000000000`, the int-to-double conversion bias. Two DolIR builder sites -splatted a scalar result into both slots where Gekko writes ps0 only. - -| | PGO'd C (floor) | LLVM before | **LLVM after fix** | -| --- | --- | --- | --- | -| architectural divergences | 61 (0.63%) | 301 (5.20%) | **270 (4.75%)** | -| `ps1`/`fpscr`-only reports | 307 | 965 | **311** | -| **`ps1` field appearances** | 70 | **2,180** | **383** | -| `ps1` in `ps1`/`fpscr`-only reports | 70 | — | **0** | - -**The `ps1` class is eliminated.** `ps1` appearances fell 2,180 → 383, the -`ps1`/`fpscr`-only bucket fell 965 → 311 (landing on the C backend's own floor -of 307), and **not one** of those 311 reports contains a `ps1` field — they are -all `fpscr`. Where `ps1` still differs, all 383 appearances now co-occur with -GPR or memory divergence, so it is a downstream symptom rather than a cause. - -**Be precise about what this fix did and did not do.** Architectural divergences -moved only 301 → 270. A second, larger and independent defect remained at this -point, and the campaign's final "at the C floor" result came later, after the -verification harness itself was corrected (an arrival-matching artifact was -inflating counts on **both** backends). - -**The load-bearing evidence is the control.** Under the final, corrected oracle: - -| arm | blocks | reports | architectural | `ps1` appearances | -| --- | --- | --- | --- | --- | -| PGO'd C | 9,642 | 307 | **0 (0.00%)** | 0 | -| **LLVM, with fix** | 5,713 | 319 | **0 (0.00%)** | 0 | -| LLVM, pre-fix (control) | 5,717 | 1,039 | **34 (0.59%)** | **1,813** | - -Both arms going to zero is exactly what a broken metric looks like, so the same -oracle was pointed at the pre-fix module whose defect is known and -characterised: it still reports 34 architectural divergences and 1,813 `ps1` -appearances, led by the `mem[]`/`ps1` signature. **The metric distinguishes the -module with the known defect from the one without it** — which is what makes -"0.00%" a result rather than an artifact. - -The C emitter always had both guards, which is why C never showed this class. -DolIR feeds the LLVM pipeline only, so **no C codegen changes.** Bumps -`DOLLLVM_CACHE_VERSION` to v7. - ---- - -## What these numbers do not show - -- **Split-screen is ~6% short.** 0.9378 with only 3/12 pairs clearing 95%, - against 0.9573 and 10/12 for single-player. More profile training does not fix - it; it is a known limit, recorded rather than resolved. -- **One title, one host.** Everything here is `GM4E01` on a single Windows - machine. The mechanisms argued for (allocator scope vs edge cost, chain length - vs index) should generalise; the *magnitudes* should not be assumed to. -- **The gate passes on the median, not on every pair.** 0.9587 and 0.9573 clear - 95%; individual pairs do not all clear it. -- **This branch is built and tested, but not re-benchmarked.** The commits were - rebased onto upstream `main` and de-entangled by hand from experimental work - that is not included here. The result builds clean in both configurations - against LLVM 20.1.8 and passes the repository suite in full — **16/16** with - the C backend and **19/19** with `-DDOLRECOMP_ENABLE_LLVM=ON`, including - `dispatch`, `llvm_backend`, `llvm_execute` and `llvm_pipeline` — and is green - on all six CI checks. **The performance numbers above were not re-measured - against this exact commit series** — they come from the campaign builds these - commits were extracted from. -- **96 is unexplained.** A 35% loss at uniform-96 with no mechanism. Whatever it - is, the power-of-two theory is not it. diff --git a/benchmarks/images/mkdd-nopgo-chunk64.png b/benchmarks/images/mkdd-nopgo-chunk64.png new file mode 100644 index 0000000000000000000000000000000000000000..eae2062cc5930dde508f00aeaac54cac4df832ff GIT binary patch literal 114596 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 B0ww?e literal 0 HcmV?d00001 diff --git a/benchmarks/images/mkdd-pgo-chunk64.png b/benchmarks/images/mkdd-pgo-chunk64.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b023423454bf2b1e709f1345d313c813cfec5d GIT binary patch literal 124325 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 literal 0 HcmV?d00001 From caea3f7d0e17a9b3f2461574145a852e2226c5c9 Mon Sep 17 00:00:00 2001 From: jw <183880766+siahisaforker@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:52:59 -0700 Subject: [PATCH 14/15] Fix LLVM 19 build --- src/backend/llvm/llvm_backend.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backend/llvm/llvm_backend.cpp b/src/backend/llvm/llvm_backend.cpp index 54f3501..48b1c3f 100644 --- a/src/backend/llvm/llvm_backend.cpp +++ b/src/backend/llvm/llvm_backend.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -372,8 +372,12 @@ extern "C" bool dolllvm_emit_object(const DolIRModule *source, // here makes that identity structural rather than a property of the passes // in between, which are free to change without invalidating a profile. if (pgo == DOLLLVM_PGO_GEN) { +#if LLVM_VERSION_MAJOR >= 20 passes.addPass(llvm::PGOInstrumentationGen( llvm::PGOInstrumentationType::FDO)); +#else + passes.addPass(llvm::PGOInstrumentationGen(/*IsCS=*/false)); +#endif } else if (pgo == DOLLLVM_PGO_USE) { passes.addPass(llvm::PGOInstrumentationUse(pgoProfilePath())); } From fa78f901b5fd0e4f41a2878903f532e0dae07b7b Mon Sep 17 00:00:00 2001 From: jw <183880766+siahisaforker@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:57:57 -0700 Subject: [PATCH 15/15] Fix LLVM 20 build --- src/backend/llvm/llvm_backend.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backend/llvm/llvm_backend.cpp b/src/backend/llvm/llvm_backend.cpp index 48b1c3f..93e48ed 100644 --- a/src/backend/llvm/llvm_backend.cpp +++ b/src/backend/llvm/llvm_backend.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include