The increasing amount of instruction-level parallelism required to
fully utilize high issue-rate processors forces the compiler to
perform increasingly advanced transformations, many of which require
adding extra operations in order to remove those dependences
constraining performance. Although aggressive application of these
transformations is necessary in order to realize the full performance
potential, overly-aggressive application can negate their benefit or
even degrade performance. This thesis investigates a general
framework for applying these transformations at schedule time, which
is typically the only time the processor's execution constraints are
visible to the compiler. Feedback from the instruction scheduler is
then used to aggressively and intelligently apply these
transformations. This results in consistently better performance
than traditional application methods because the application of
transformations can now be more fully adapted to the processor's
execution constraints. Techniques for optimizing the processor's
machine description for efficient use by the scheduler, and for
incrementally updating the dependence graph after performing each
transformation, allow the utilization of scheduler feedback with
relatively small compile-time overhead.