The full picture
- Throughput vs latency, cleanly: the pipeline improves instruction throughput (one/cycle steady-state), never single-instruction latency — the same distinction as any assembly line or async pipeline you've built.
- Data hazards & forwarding:
a = b + c; d = a + e— the second add needsabefore write-back; bypass wires forward ALU output directly to the next instruction's input. Only the load-use case (need data from a cache access) forces a genuine bubble — why compilers/JITs hoist loads early. - Control hazards dominate: every ~5th instruction is a branch; with 15–20 stage pipelines and 4–6-wide issue, a mispredict throws away 50–100 instruction slots — the arithmetic that makes branch prediction existential, not optional.
- Where a JVM engineer sees it: JIT loop unrolling (fewer branches), inlining (removes call/return control flow), and the classic 'sorted array is faster to sum with an if' — pipeline effects visible from Java.