This compiler, named MAXLIVE, was developed as part of my thesis research to help me investigate the register requirements of subscripted variables in loop nests. MAXLIVE takes as input a Fortran-like syntax of DO-loops along with a wavefront schedule parameter PI. It can output anything from the latex register live-range figures used in my thesis, to providing detailed register usage reports, or emitting a C program with the original loop nest transformed about the specified wavefront parameter. Recently, it has been extended to support loop unrolling.
The MAXLIVE compiler is not particularly robust. The parser lacks strong syntax checking, and its capabilities were implemented in an as needed basis. The programs used to generate the experimental result data in my thesis are included as .reg files inside the tarball containing the source code. The source code is distributed under GPLv3.
Dependencies: The C code generator depends on the cloog version 0.15.9.
This gcc patch implements an optimization pass that splits immediate constant values within a program into lower and upper halves when it is profitable to do so. The end result is more compact assembly code with fewer instructions required to load values with common halves. Currently, each gcc backend needs to specify how values are loaded into registers. For many RISC architectures (with notably ARM excluded), a large word-size value may require two instructions to load. This patch places the splitting pass into GIMPLE level, thereby eliminating N target specific passes.
As an example, consider the following code sequence.void foo()
GCC-4.5.0 yields the following PowerPC assembly code:.globl foo
Notice that the three lis instructions are redundant. If the values were split early before the code generation pass, then gcc would yield an equivalent sequence of code with two fewer instructions. Not all constant benefit from early splitting. For instance, splitting constant values involved in bitwise arithmetic with generate one more instruction had the value not been split. See the chapter 6 in the thesis for more details.
This project has been abandoned due to the lack of split-able values in present in programs.
Dependencies: GCC version 4.5.0.
This is an incomplete, alpha quality, port of LLVM to the SimpleScalar PISA architecture. I wanted to test my register analysis project on a machine with a huge register file, so I tweaked the SimpleScalar simulator to have a larger register file. My results were mixed. While LLVM generated far superior spilling code compared the the ancient version of gcc supplied with SimpleScalar, I decided to concentrate on real world hardware instead. This project has long been abandoned. It still may be used as an initial starting point for an PISA port to LLVM. Note that this backend assumes PISA has a larger register file.
In this project I am developing an image sharpening program based on Laplacian wavelets. Such a program would have applications in conventional photography, but it is crucial for astrophotography. While there are many program that are already capable this type image processing, I wanted a practical application to test my research on. In particular, the image convolution phase is directly applicable to the work done for my thesis. Preliminary results indicate a sizable speedup over conventional image processing programs such as ImageMagick.
The image of Jupiter above demonstrates the before and after of this image processing technique. The original image is on the left, and the sharpened version is on the right. Unfortunately, this aggressive application of the sharpening technique generates a little moire pattern on the top and the bottom of the processed image.