This paper presents a new algorithm for performing global value numbering on a routine in static single assignment form. Our algorithm has all the strengths of the most powerful existing practical methods of global value numbering; it unifies optimistic value numbering with constant folding, algebraic simplification and unreachable code elimination. It goes beyond existing methods by unifying optimistic value numbering with further analyses: it canonicalizes the structure of expressions in order to expose more congruences by performing <i>global reassociation</i>, it exploits the congruences induced by the predicates of conditional jumps (<i>predicate inference</i> and <i>value inference</i>), and it associates the arguments of acyclic <i>ø</i> functions with the predicates controlling their arrival (<i>ø predication</i>), thus enabling congruence finding on conditional control structures. Finally, it implements an efficient <i>sparse</i> formulation and offers a range of tradeoffs between compilation time and optimization strength. We describe an implementation of the algorithm and present measurements of its strength and efficiency collected when optimizing the SPEC CINT2000 C benchmarks.