It really doesn't make sense to optimize anything in a bootstrapping compiler. Usually the only code that will ever be compiled by this compiler will be rustc itself. And rustc doesn't need to run fast - just fast enough to recompile itself. So, the output also probably won't have any optimisations applied either.
Where optimizing for size is optimizing for speed is when it's faster (in terms of wall clock time) for a program to compute data than to read it from memory, disk, i/o etc, because i/o bandwidth is generally much slower than execution bandwidth. That means the processor does more work, but it takes less time because it's not waiting for data to load through the cache or memory.
int main() { for(;;); }
Eg, quicksort vs bubble sort. Quicksort is usually more code but faster.
Or a linked list vs a btree. The linked list is less code, but the btree will be faster.
Or substring search, with or without simd. The simd version will be longer and more complex, but run faster.
Even in a for loop - if the compiler unrolls the loop, it takes up more code but often runs faster.
If you have two programs that both do the same work, and one is short and simple, I don’t think that tells you much about which will run faster.
Ultimately the final rustc you get will be more or less identical to the one built and distributed through rustup.
What could cause differences between the bootstrapped rustc and rustup’s?
In practice, you’ll have to make sure the build configuration, the toolchain components not part of rustc itself (e.g. linker), and the target sysroot (e.g. glibc .so file) are close or identical to what the official builds are using. Also, while rustc is supposed to be reproducible, and thus free of the other usual issues with reproducible builds (like paths or timestamps being embedded into the build), there might be bugs. And I’m not sure if reproducibility requires any special options which the official builders might not be passing. Hopefully not.