Spring 2017 EE599-006/EE699-007: Optimizing Compilers, meeting TR 12:30-13:45 in 114JSB

The final exam is Monday, 5/1/17, @ 10:30AM. If you need to reschedule it, send an email request before then; the prefered alternative time would be Tuesday morning, 5/2/17, or Wednesday, 5/3/17, @ 10:30AM.

You know how to write programs in C and specify hardware in Verilog? This course is about how to build software tools -- Optimizing Compilers -- that can shape the mud of assembly language instructions and configurable hardware into useful software/hardware structures that efficiently implement your high-level designs. Optimizing compilers rarely generate truly optimal implementations; understanding what they can and cannot do enables you to be a much more effective engineer, focusing effort where it will pay off and avoiding unpleasant surprises late in the product development cycle.

Useful Links

What's in this course?

Compilers are the software tools that translate high-level language constructs into something that can execute the desired operations. Normally, one thinks of compilers as straightforwardly translating programs written in langauges like C into assembly language code. However, optimizing compilers perform sophisticated analysis and a wide range of complex transformations to generate an efficient implementation of a program. The program may be written in a language like C, or it may be what the author considered to be a hardware design expressed in a language like Verilog. The implementation created by the compiler might be code for a computer supporting various types of parallel execution, gate-level circuits or FPGA configurations, or even a co-designed combination of sopafter and hardware accelerators.

This course presents the concepts needed to understand, design, and implement optimizing compiler "back-ends" that target a variety of computer architectures and digital logic circuitry. You'll not only learn how these things work, but you'll actually extend a simple compiler (provided to you as full C source code) to perform some of the analysis methods and transformations discussed. Topics covered include:

  1. Introduction
  2. Basic code generation and optimization
  3. Analysis and transformation
  4. Silicon compilation and high-level logic synthesis
  5. Hardware acceleration and hardware/software codesign

Who should take this course?

This course is intended for undergraduate (EE599-006) and graduate (EE699-007) students in computer engineering, EE, or CS. The course is particularly well suited for students who have taken EE/CS/CPE480 and a conventional (parsing theory emphasis) compilers course, but only EE/CS/CPE380 and some exposure to programming in C/C++ are required.

Course administrivia

The course will meet 3 hours/week in a mostly conventional lecture format. There is no scheduled lab meeting, and students are encouraged to use their own computers for the projects, but students also will be given access to appropriate computers on campus. Your grade will be determined by performance on the midterm exam (20%), the final exam (30%), and several projects (50%). Each of the projects will involve enhancing a compiler, written in C, to perform specific analysis and transformations... and thus will require some C programming. Each project must be accompanied by a short Implementor's Notes document. The only difference between EE599-006 and EE699-007 will be that the graduate (EE699-007) projects will incorporate a few more advanced requirements. Some projects may be done in teams, depending on course enrollment.

Course Staff

Professor Hank Dietz is usually in the Davis Marksbury Building; see his home page for complete contact info. He has an "open-door" policy that whenever his door is open and he's not busy with someone else, he's available. Alternatively, you also can email hankd@engr.uky.edu to make an appointment; please use "EE599" or "EE699" in the email subject line for anything related to this course.


Optimizing Compilers