While I was studying computer organization, we talked about data dependencies and how they limit the throughput of the pipeline because the execution of one instruction is blocked by another instruction not being done.
In modern processors, is it still the case? Is it possible to create a scenario in a real-world program where the CPU has enough data (it is not waiting for data from the memory), but due to data dependencies it is not running at full speed (maximum instructions per cycle)?
I believe that the compilers will try to break chains of dependencies. Are there cases when this is not possible?