But it's true. You don't optimize for OoOE.
There's a ton of things compilers can do to remove redundancies from generated code. Constant folding and propagation, branch elimination, small-body inlining, aligning code and data, value lifetime analysis, register allocation, yadda yadda yadda. Yes, you want to enable them. No, none of them are specific to OOOE or not OOOE. They are universally beneficial, and don't even depend on the underlying instruction set at all.
It's only for in-order archs that you do have to go further and individually have to move around instructions to maximize issue rates. This is not necessary for OOOE archs. They do it themselves. You just run your compiler with -O2 and things will be fine.
Show me one documented compiler switch in GCC or whatever that specifically optimizes for OoOE and I'll rest my case. I'm pretty sure no such thing exists.
And while we're at it, modern C/C++ compilers are frighteningly mature. There's no innovations on the horizon that promise more than maybe a couple percent more performance on any significant codebase. Haven't been for over five years.
And just so we understand each other, SIMD units, sure, they change more frequently, and need new compiler support or dedicated assembly fiddling. Which has nothing to do with OOOE either.