Optimizing Compilers for Modern Architectures: A Dependence-based Approach