In some ways, #2 is sad to me.
Don't get me wrong, I have worked a ton on LLVM and love it.
But at least when i was there, IBM's interprocedural middle-end (TPO) was some of the nicest and well structured C++ compiler code i had seen in a long time. It was well written, well commented, and well architected.