Multipass compilers were originally engineered that way because there simply wasn't available memory to keep all the intermediate data in memory.
Now the nature of compilers has gone from batch to incremental to handle the feedback the IDE needs to give to the programmer.