LLVM IR emitter — ULP match status

β · public beta For each emission pattern × each reference implementation, how close does our Prolog-generated LLVM IR get? Cells that have changed since you opened this page glow with a gold rim.
Opening the scrying-glass…

How this dashboard works

Every cell is generated from automated tests. No manual annotation. The CI pipeline runs verify_llvm_ops.py which measures each of 44 ops against reference implementations, then emits Prolog facts. The SVG is regenerated from those facts. The page polls every 30 seconds and highlights changed cells with a gold aura.

Bookspine progress bars. Each cell shows one thin vertical stripe per op in that pattern, sorted by status. The bar fills from left to right as ops are verified. A cell shows "IR-match" only when every op in that pattern is blue.

Color meanings:
🔵 Blue = IR-match: 0 ULP AND our LLVM IR structurally matches the reference's instruction sequence. Verified by automated IR-diff.
🟢 Green = 0 ULP: numerically bit-identical, but LLVM IR structure not yet confirmed to match. The numbers are right; the code may differ.
🟡 Yellow = 1–100 ULP: close but not bit-identical. Known root cause documented.
🔴 Red = >100 ULP: significant divergence. Needs investigation.
Grey = untested.

Source of truth: bpd/lib/llvm_op_match.pl (per-op facts) + bpd/llvm_match_status.pl (SVG generator). Regenerate via swipl -g main llvm_match_status.pl. Pure deduction from facts.

CI pipeline: verify_llvm_ops.pyllvm_op_match_ci.plswipl llvm_match_status.pl → SVG → publish.

The 9 emission patterns (from kernel_patterns.pl): unary_elementwise (12 ops), binary_elementwise (1), reduction (7), reduction_then_elementwise (6), scan (2), conv_im2col (6), pool_reduce (3), loss_reduce (6), flash_attention (1). 44 ops total → 44 bookspines across 9 rows.

Canonical addressing: Table(10001).LLVM_IR_Match_Status. Each cell carries a watermarkup coordinate: data-dim="cell(table(10001),column(<ref>),row(<pattern>))".