  For applications in worst-case execution time analysis and in security, it is
desirable to statically classify memory accesses into those that result in
cache hits, and those that result in cache misses. Among cache replacement
policies, the least recently used (LRU) policy has been studied the most and is
considered to be the most predictable. The state-of-the-art in LRU cache
analysis presents a tradeoff between precision and analysis efficiency: The
classical approach to analyzing programs running on LRU caches, an abstract
interpretation based on a range abstraction, is very fast but can be imprecise.
An exact analysis was recently presented, but, as a last resort, it calls a
model checker, which is expensive. In this paper, we develop an analysis based
on abstract interpretation that comes close to the efficiency of the classical
approach, while achieving exact classification of all memory accesses as the
model-checking approach. Compared with the model-checking approach we observe
speedups of several orders of magnitude. As a secondary contribution we show
that LRU cache analysis problems are in general NP-complete.
