The translation validation approach involves establishing semantics preservation of individual compilations. In this paper, we present a novel framework for translation validation of optimizers. We identify a comprehensive set of primitive program transformations that are commonly used in many optimizations. For each primitive, we define soundness conditions that guarantee that the transformation is semantics preserving. This framework of transformations and soundness conditions is independent of any particular compiler implementation and is formalized in PVS. An optimizer is instrumented to generate the trace of an optimization run in terms of the predefined transformation primitives. The validation succeeds if (1) the trace conforms to the optimization and (2) the soundness conditions of the individual transformations in the trace are satisfied. The first step eliminates the need to trust the instrumentation. The soundness conditions are defined in a temporal logic and therefore the second step involves model checking. Thus the scheme is completely automatable. We have applied this approach to several intraprocedural optimizations of RTL intermediate code in GNU Compiler Collection (GCC) v4.1.0, namely, loop invariant code motion, partial redundancy elimination, lazy code motion, code hoisting, and copy and constant propagation for sample programs written in a subset of the C language. The validation does not require information about program analyses performed by GCC. Therefore even though the GCC code base is quite large and complex, instrumentation could be achieved easily. The framework requires an estimated 21 lines of instrumentation code and 140 lines of PVS specifications for every 1000 lines of the GCC code considered for validation.However, a mistake in the design or in the implementation of an optimizer can proliferate in the form of bugs in the softwares compiled through it.The issue of soundness of optimizers is usually addressed at two levels: (1) One time guarantees are obtained at the design level by verifying optimization specifications and (2) run-time guarantees are obtained at the implementation level by validating optimization runs.Both these approaches involve proofs of semantic equivalence between the input and the optimized programs. However, they are usually tedious. Even in the case of validation where semantic equivalence is to be shown for a particular execution, it cannot be accomplished with ease. This complexity can be conquered by taking advantage of the fact that optimizations with similar objectives employ similar program transformations. For example, 'replacement of some occurrences of an expression by a variable' is a transformation that is common to optimizations such as common subexpression elimination, lazy code motion, loop invariant code motion, and several others whose aim is to avoid unnecessary recomputations of a value.This observation led to identification of transformation primitives and soundness conditions, and their use in verification of optimization specificat...