For abstract data types (ADTs) there are many potential optimizations of code that current compilers are unable to perform.
These optimizations either depend on the functional specification of the computational task performed through an ADT or on
the semantics of the objects defined. In either case the abstract properties on which optimizations would have to be based
cannot be automatically inferred by the compiler. In this paper our aim is to address this level-of-abstraction barrier by
showing how a compiler can be organized so that it can make use of semantic information about an ADT at its natural abstract
level, before type lowering, inlining, or other traditional compiler steps obliterate the chance. We present an extended case
study of one component of a C++ compiler, the simplifier; discuss the design decisions of a new simplifier (simplifier generator)
and its implementation in C++; and give performance measurements. The new simplifier is connected to the Gnu C++ compiler
and currently performs optimizations at very high level in the front end. When tested with the Matrix Template Library, a
library already highly fine-tuned by hand, we achieved run-time improvements of up to six percent.