diff --git a/TODO.org b/TODO.org index 899c9b6e..596144f2 100644 --- a/TODO.org +++ b/TODO.org @@ -1085,13 +1085,6 @@ Every program in the corpus that compiles, has a =main= and terminates agrees wi the LLVM build down to stderr. =docs/BUILT.md=, "The hand-written x86 backend, and the four measurements behind it", is the account. -** NEXT Nothing pins the LLVM side at -O0 when the two backends are compared -Decided 2026-09-25: the x86 parity survey compares against LLVM at -O0 only; -O2 is never its target. The acceptance suite's paired -O2/-O0 rows stay, being the check for undefined behaviour in emitted IR, which is a different question. -The survey builds both sides at the default =-O2=, so a construct LLVM folds is -compared as a constant rather than as a lowering. That is how the float =%= gap -survived. Two things would close it: an =-O0= pass of the sweep, and something -that walks the two backends' primitive match arms mechanically. Neither is queued. - ** DONE Reading (uninit) before writing it is undefined behaviour CLOSED: [2026-09-25] Reading an =(uninit)= value before writing it is undefined behaviour, and the backends may differ on it. An exhausted match stays =ud2= on x86. diff --git a/test/dune b/test/dune index 083c186e..6fa1957b 100644 --- a/test/dune +++ b/test/dune @@ -161,7 +161,8 @@ ; second backend still lowers the language: it refuses by name rather than ; miscompiling, so when another lane adds a primitive the backend says so ; loudly, and nothing was listening. Two such refusals sat in the tree for a -; month. Now they fail a build somebody can run. +; month. Now they fail a build somebody can run. The LLVM side is built at +; -O0, the level this backend corresponds to. ; ; dune build --root . @x86 ; diff --git a/test/survey-x86.sh b/test/survey-x86.sh index aad42a15..1cd9c9c5 100755 --- a/test/survey-x86.sh +++ b/test/survey-x86.sh @@ -20,6 +20,11 @@ # compared a checked build against an unchecked one would say nothing about # bounds.flan, which is the one program the two backends disagreed about. # +# The LLVM side is built at -O0, never at the default -O2. This backend has no +# optimiser, so -O0 is its counterpart: at -O2 LLVM folds a constant +# expression before it is lowered, and the sweep then compares a lowering +# against a constant. That is how the float % gap stayed hidden. +# # Six outcomes, and the third is the progress meter: # # MATCH built both ways, same stdout, same stderr, same exit status @@ -91,14 +96,12 @@ forever="dev-loop dev-watch dev-chatty agent-auto" # in the epilogue that every exit already went through. The five are in the # sweep now and they are five of the MATCHes. -# The one whose whole point is a fault, and which therefore cannot be compared -# at this sweep's optimisation level. dev-segv stores through a null pointer, -# which is undefined: what LLVM at -O2 does with it is its own business, and -# this backend has no optimiser and exits 139. That is not a lowering -# disagreement. test_dev.ml builds it in a dev session, -# where the fault is the thing asserted. It also calls agent/start, so it -# leaves a socket in /tmp on both runs, and under SURVEY_FLAGS=--dev it parks -# in the break loop instead of dying. +# The one whose whole point is a fault. dev-segv stores through a null +# pointer, which is undefined, so neither side's answer is a lowering to +# compare. test_dev.ml builds it in a dev session, where the fault is the thing +# asserted. It also calls agent/start, so it leaves a socket in /tmp on both +# runs, and under SURVEY_FLAGS=--dev it parks in the break loop instead of +# dying. faults="dev-segv" TIMEOUT=${TIMEOUT:-20} @@ -126,7 +129,7 @@ for src in "$corpus"/test/programs/*.flan; do # LLVM first. A program that does not compile at all, or has no main, is not # this backend's business -- the frontend refused it either way. - if ! "$flan" build "$src" "${extra[@]}" -o "$out/$name.llvm" \ + if ! "$flan" build "$src" -O0 "${extra[@]}" -o "$out/$name.llvm" \ >"$out/$name.llvm.err" 2>&1; then # A package the build tree does not have is not the frontend refusing # the program: it is a sweep that did not look at it, and it is counted