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.
It may have changed since I left, but my understanding as of a few years ago was that IBM was replacing the front-end with Clang but continuing to use TPO (at least for now).
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.