Manual loop unrolling was standard practice in Duff's Device and classic Quake-era game code precisely because compilers of that era wouldn't reliably do it, and modern JIT compilers like V8's TurboFan and LLVM still make explicit unroll-versus-vectorize tradeoffs today since over-unrolling bloats the instruction cache and can hurt more than it helps. Measuring diminishing returns from 2x to 4x to 8x unrolling here is the exact experiment compiler engineers run to tune the unroll heuristics baked into -O3.