Annotation of gcc/PROJECTS, revision 1.1.1.1

1.1       root        1: 1. Better optimization.
                      2: 
                      3: * More cse
                      4: 
                      5: The techniques for doing full global cse are described in the
                      6: red dragon book.  It is likely to be slow and use a lot of memory,
                      7: but it might be worth offering as an additional option.
                      8: 
                      9: It is probably possible to extend cse to a few very frequent cases
                     10: without so much expense.
                     11: 
                     12: For example, it is not very hard to handle cse through if-then
                     13: statements with no else clauses.  Here's how to do it.  On reaching a
                     14: label, notice that the label's use-count is 1 and that the last
                     15: preceding jump jumps conditionally to this label.  Now you know it
                     16: is a simple if-then statement.  Remove from the hash table
                     17: all the expressions that were entered since that jump insn
                     18: and you can continue with cse.
                     19: 
                     20: It is probably not hard to handle cse from the end of a loop
                     21: around to the beginning, and a few loops would be greatly sped
                     22: up by this.
                     23: 
                     24: * Iteration variables and strength reduction.
                     25: 
                     26: The red dragon book describes standard techniques for these kinds
                     27: of loop optimization.  But be careful!  These optimization techniques
                     28: don't always make the code better.  You need to avoid performing
                     29: the standard transformations unless they are greatly worth while.
                     30: 
                     31: In many common cases it is possible to deduce that an iteration
                     32: variable is always positive during the loop.  This information
                     33: may make it possible to use decrement-and-branch instructions
                     34: whose branch conditions are inconvenient.  For example, the 68000
                     35: `dbra' instruction branches if the value was not equal to zero.
                     36: Therefore, it is not applicable to `for (i = 10; i >= 0; i--)'
                     37: unless the compiler can know that I will never be negative
                     38: before it is decremented.
                     39: 
                     40: * Special local optimizations.
                     41: 
                     42: The instruction combiner finds only certain classes of local optimizations.
                     43: For example, it cannot use the 68020 instruction `cmp2' because it would
                     44: not think to combine the instructions that would be equivalent to a `cmp2'.
                     45: 
                     46: In order to take advantage of such instructions, the combiner would need
                     47: special hints as to which instructions to consider combining.  To be
                     48: generally useful, this feature would have to be controlled somehow
                     49: by new information in the machine description.
                     50: 
                     51: * Smarter reload pass.
                     52: 
                     53: The reload pass as currently written can reload values only into registers
                     54: that are reserved for reloading.  This means that in order to use a
                     55: register for reloading it must spill everything out of that register.
                     56: 
                     57: It would be straightforward, though complicated, for reload1.c to keep
                     58: track, during its scan, of which hard registers were available at each
                     59: point in the function, and use for reloading even registers that were
                     60: free only at the point they were needed.  This would avoid much spilling
                     61: and make better code.
                     62: 
                     63: * Change the type of a variable.
                     64: 
                     65: Sometimes a variable is declared as `int', it is assigned only once
                     66: from a value of type `char', and then it is used only by comparison
                     67: against constants.  On many machines, better code would result if
                     68: the variable had type `char'.  If the compiler could detect this
                     69: case, it could change the declaration of the variable and change
                     70: all the places that use it.
                     71: 
                     72: * Order of subexpressions.
                     73: 
                     74: It might be possible to make better code by paying attention
                     75: to the order in which to generate code for subexpressions of an expression.
                     76: 
                     77: * Better code for switch statements.
                     78: 
                     79: If a switch statement has only a few cases, a sequence of conditional
                     80: branches is generated for it, rather than a jump table.  It would
                     81: be better to output a binary tree of branches.
                     82: 
                     83: * Distributive law.
                     84: 
                     85: *(X + 4 * (Y + C)) compiles better as *(X + 4*C + 4*Y)
                     86: on some machines because of known addressing modes.
                     87: It may be tricky to determine when, and for which machines,
                     88: to use each alternative.
                     89: 
                     90: 2. Simpler porting.
                     91: 
                     92: Right now, describing the target machine's instructions is done
                     93: cleanly, but describing its addressing mode is done with several
                     94: ad-hoc macro definitions.  Porting would be much easier if there were
                     95: an RTL description for addressing modes like that for instructions.
                     96: Tools analogous to genflags and genrecog would generate macros from
                     97: this description.
                     98: 
                     99: There would be one pattern in the address-description file for each
                    100: kind of addressing, and this pattern would have:
                    101: 
                    102:   * the RTL expression for the address
                    103:   * C code to verify its validity (since that may depend on
                    104:     the exact data).
                    105:   * C code to print the address in assembler language.
                    106:   * C code to convert the address into a valid one, if it is not valid.
                    107:     (This would replace LEGITIMIZE_ADDRESS).
                    108:   * Register constraints for all indeterminates that appear
                    109:     in the RTL expression.
                    110: 
                    111: 3. Other languages.
                    112: 
                    113: Front ends for Pascal, Fortran, Algol, Cobol and Ada are desirable.
                    114: 
                    115: Pascal requires the implementation of functions within functions.
                    116: Some of the mechanisms for this already exist.
                    117: 
                    118: 4. Generalize the machine model.
                    119: 
                    120: 4.A. Parameters in registers.
                    121: 
                    122: One some machines, conventions are that some parameters are passed
                    123: in general registers.  The compiler currently cannot handle this.
                    124: 
                    125: This requires changes in the code in expr.c for function calls.
                    126: For function entry, changes are required in stmt.c, and in
                    127: layout_parms, and perhaps also in final and in register allocation,
                    128: but the last should be minor.
                    129: 
                    130: Where stmt.c now copies the stack slot into a pseudo register,
                    131: instead copy the special argument register into a pseudo register.
                    132: Use the pseudo register throughout the body of the function to
                    133: represent the parameter.  That way, parameters can still be spilled
                    134: to the stack.
                    135: 
                    136: 4.B. Jump-execute-next.
                    137: 
                    138: Many recent machines have jumps which execute the following instruction
                    139: before the instruction jumped to.  To take advantage of this capability
                    140: requires a new compiler pass that would reorder instructions when possible.
                    141: After reload is a good place for it.
                    142: 
                    143: 5. Add a profiling feature like Berkeley's -pg,
                    144: or other debugging and measurement features.
                    145: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.