Of course these two methods are extreme cases, and one could duplicate some units and not
others. But if all the functional units are not duplicated, then potential class conflicts will be
created. A class conflict occurs when some instruction is followed by another instruction for the
same functional unit. If the busy functional unit has not been duplicated, the superscalar
machine must stop issuing instructions and wait until the next cycle to issue the second
instruction. Thus class conflicts can substantially reduce the parallelism exploitable by a
superscalar machine. (We will not consider superscalar machines or any other machines that
issue instructions out of order. Techniques to reorder instructions at compile time instead of at
run time are almost as good [2, 3, 10], and are dramatically simpler than doing it in hardware.)