Engineering a Compiler

This book covers scanning, parsing, context-sensitive analysis, intermediate representations, code shape, introduction to code optimization, data-flow analysis, scalar optimizations, instruction selection,instruction scheduling, and register allocation.