Software-controlled prefetching relies upon some form of support for inserting prefetches into the code. While having the compiler insert the prefetches automatically is the preferred approach, another possibility is for the programmer to insert the prefetches by hand. Comparing compiler-based prefetching with hand-inserted prefetching is a useful exercise because hand-inserted prefetching is not constrained by the limitations of the compiler technology; it provides a rough ``upper bound'' on the performance we might expect from the compiler. In this section, we examine applications with hand-inserted prefetching, discussing cases where the compiler was successful (Section ), and also cases where the compiler failed (Section ).