A compiler has both a front-end and a back-end. Both the book that is linked to by the OP and CS 652, the course you refer to, have a heavy emphasis on the front-end.
Personally, I am very partial to the back-end, which involves very, very different data structures, algorithms, and theory. Once you make your way through this, I highly recommend taking a look. I would say it constitutes a different field entirely!
What boggles my mind is that some of these algorithms can be made to do useful things besides generating efficient code (which includes code that runs on several cores!), such as finding bugs and security flaws.
Personally, I am very partial to the back-end, which involves very, very different data structures, algorithms, and theory. Once you make your way through this, I highly recommend taking a look. I would say it constitutes a different field entirely!
Here is a list of some such algorithms.
http://llvm.org/docs/Passes.html
What boggles my mind is that some of these algorithms can be made to do useful things besides generating efficient code (which includes code that runs on several cores!), such as finding bugs and security flaws.
Have fun!