From your description, this is definitively debugging optimized code. Which is funny that you should complain about, because debugging optimized code is not even possible at all with most compilers.
It's already a great convenience that GCC+GDB allows you to do this at all. Seriously.
If you expect stepping in the debugger to go in a perfectly smooth manner, don't compile with optimizations. It is simply an impossible task for the debugger to display values that have been optimized out and to step through code that has been reordered, unrolled, dead-code-eliminated, and instruction-scheduled in a strictly linear fashion.
That's like trying to read next week's lotto draw in a crystal ball -- the information you want is simply not in there.