Not sure, but I think you'll save 9 million CPU instructions by changing your i++ to ++i.
i++ has an extra copy made before incrementing.
In principle you are correct that ++i is never slower than and sometimes faster than i++, however in this case the copy is never accessed and is therefore unlikely to generate any code. The result will be the same either way on nearly all compilers.
If you were really anal you would write it as follows:
if ( int i = 9000000; --i >= 0; ) { }
Most platforms have instructions designed for comparing against 0 that require fewer bytes and cycles, so this is will usually be fastest and smallest. But should still be checked on the target platform, since PlayStation Vita for example doesn’t really like this.
For the rest of what has been said here, most is conjecture. You don’t know what the compiler will do, and speaking about absolutes in regards to what the compiler will do is always wrong unless it involves impossibilities regarding the target instruction set. For example, I can say as an absolute that “if ( 3 == 90 )” will never generate code on any compiler for any platform, because no platforms exist with instructions for comparing constants, so no conditional test can be performed at run-time, so no CMP/JMP instruction pair (or the equivalent for any given platform) can be generated, making it a physical impossibility for any code to be generated since it is always going to be a compile-time evaluation that resolves to 0.
You should benchmark or look at assembly to determine which is faster, and on various platforms.
Hopefully, when you do benchmark/run performance tests, you will find that you should be focusing on more high-level code if you are truly interested in optimization.
L. Spiro