Care to explain? -O3 generates larger code than -O2?
In the past, at a time when I worked on a very performance sensitive codebase that was also limited in scope, we compiled with -Osize and did all the loop optimizations we wanted manually (and with pragmas). That produced faster code than -O2 or -O3.
In other words, loop unrolling is, more often than not, harmful.
A more granular control over optimisation would be good, however.