Instruction-level parallellism typically increases with the complexity and amount of code. As a very rough example you can use mathematical equations with varying degrees of complexity.
Example 1:
y = x^2 + bx + c
This equation has two instructions that can be executed in parallel. After that, it has two more sequential instructions.
Example 2:
y = x^4 + 2x^3 + 6x^2 + 3x + 5
This equation starts with no less than 4 instructions that may be executed simultaneously. Then we get 3, then 2 more, concluding with one instruction. For a CPU, there is another interesting thing going on here. Powers higher than 2 need multiple instructions. With that knowledge we can say that the instruction-level parallellism each cycle is [5-4-2-1], assuming each instruction takes exactly one cycle. You can see that this far more complex equation only took one more cycle to complete, but also that it was able to reduce execution time by 20% by performing more than 4 instructions at the same time.
The latter equation would only be around 10 lines in assembly language. Considering how many lines of code there are in most applications, it is clear that it becomes very easy to achieve a high level of instruction-level parallellism when the resources are available. The depth of the instruction queue compensates for more 'linear' code. Speculative execution allows the core to work ahead of time, for example when it is evaluating a conditional branch.