blob: afb723ae4cfc6882516e235b3b02d7362fb5a3d1 [file] [log] [blame]
This is a list of things that need to be worked on. It is by no means complete.
Allocation
- Allocation of decls in stackalloc. Decls survive if they are
addrtaken or are too large for registerization.
Scheduling
- Make sure loads are scheduled correctly with respect to stores.
Same for flag type values. We can't have more than one value of
mem or flag types live at once.
- Reduce register pressure. Schedule instructions which kill
variables first.
Values
- Add a line number field. Figure out how to populate it and
maintain it during rewrites.
- Store *Type instead of Type? Keep an array of used Types in Func
and reference by id? Unify with the type ../gc so we just use a
pointer instead of an interface?
- Recycle dead values instead of using GC to do that.
- A lot of Aux fields are just int64. Add a separate AuxInt field?
If not that, then cache the interfaces that wrap int64s.
- OpStore uses 3 args. Increase the size of argstorage to 3?
Opcodes
- Rename ops to prevent cross-arch conflicts. MOVQ -> MOVQamd64 (or
MOVQ6?). Other option: build opcode table in Config instead of globally.
- Remove asm string from opinfo, no longer needed.
- It's annoying to list the opcode both in the opcode list and an
opInfo map entry. Specify it one place and use go:generate to
produce both?
Regalloc
- Make less arch-dependent
- Don't spill everything at every basic block boundary.
- Allow args and return values to be ssa-able.
- Handle 2-address instructions.
Rewrites
- Strength reduction (both arch-indep and arch-dependent?)
- Code sequence for shifts >= wordsize
- Start another architecture (arm?)
Common-Subexpression Elimination
- Make better decision about which value in an equivalence class we should
choose to replace other values in that class.
- Can we move control values out of their basic block?