Your final assignment is to design or implement a research project of your own choice. This may involve extending one of the projects you've already implemented, or designing a project of your own choice. Since time is limited, you should not choose too ambitious a project. Don't try the impossible -- that what PhD dissertations are for.
A variety of interesting projects can be designed around code you've already implemented. For example, you might redo your register allocator, better handling literals or globals or temporaries. You might split live ranges (perhaps at loop boundaries) to improve coloring. You might modify your register allocator to handle caller-save/callee-save register classes. You might include Appel/George register coalescing. You might devise different spill heuristics, and decide if Chaitin's can be improved upon.
In some cases it is easier to recompute a register value than to spill it into memory and later reload it (this is called rematerialization). For example, if a+b is loaded into register R and both a and b are register resident, then spilling a+b is unnecessary, since it can be recomputed in one instruction. Rematerialization also affects loop invariant code motion; if recomputation is cheap, why bother to avoid it? Using profiling, you might study how much code optimzation improves when accurate cost values (rather than static cost estimates) are used.
You might investigate code scheduling by modifying the code generator to reorder generated code to minimize pipeline stalls. You might consider scheduling for multiple issue Sparc architectures (like the SuperSparc and UltraSparc). The interaction of loop unrolling and software pipelining might be studied.
You might improve your loop invariant optimization by including profitability issues. Constant propagation could be added, perhaps along with constant and copy propagation into operands of expressions.
You might study the interplay between value reuse (literals, loop invariants and redundant expressions) and register allocation. That is, to reuse values, you want to put them in registers, but the more register candidates you create, the harder it is to satisfy all register requests. (Rematerialization is an issue here.)
Cache behavior (both I and D cache) is a major factor in program performance. What changes to data or instruction layout enhance cache performance? Can you estimate the cache needs of a program? How should a program be recompiled when you upgrade to an identical processor with a larger or better cache?
You may choose a topic that relates to other courses you are taking or to research projects you are involved in. Thus you might study compiler support of an architectural innovation (perhaps aspects of the new IA-64 architecture; see online manuals and tutorials ).
As discussed in class, you might study compiler or architectural support for code obfuscation as a way of thwarting security attacks that depend on detailed knowledge of data or code layout.
You can choose a topic discussed in lecture and consider extensions or improvements. How can evaluation of data flow solutions be improved upon? If you have a solution and change the problem only slightly (perhaps adding or deleting or changing only a single node), can you map the old solution efficiently into a new solution?
You will need to pick a topic soon. Don't spend a huge amount of time deciding. Just choose something you feel comfortable with and would like to work on. You may work alone or in 2 or 3 person groups. Naturally, group projects should be more challenging and comprehensive than individual ones. Feel free to talk to the instructor, the TA or other faculty members. No later than Thursday December 1st hand in a one page description of what you plan to do (and perhaps are already doing!). We'll give you feedback on how reasonable your proposed project is.
On the due date, hand in to the instructor a report (either in electronic or paper form) on what you've done along with any preliminary results you have. You need not hand in a completely debugged project (though that would be nice), but you should provide enough results to allow your project to be properly evaluated. What we'll be particularly interested in is evidence that you've chosen an interesting problem, and have thought through the theoretical and practical problems involved.