summary refs log tree commit diff
path: root/proto/TODO
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-07-10 03:16:11 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-09-15 23:01:27 -0400
commit037c716b6514cc717b7208457fb72085e4c278ab (patch)
tree59ccc8ea645418074c114fa47b4f9bdb9e17b861 /proto/TODO
parentc7ab830c2205c5a51c88d9d9eddff2dc3bacc22d (diff)
downloadroux-037c716b6514cc717b7208457fb72085e4c278ab.tar.gz
move ml prototype in a subdir
Diffstat (limited to 'proto/TODO')
-rw-r--r--proto/TODO54
1 files changed, 54 insertions, 0 deletions
diff --git a/proto/TODO b/proto/TODO
new file mode 100644
index 0000000..e144c66
--- /dev/null
+++ b/proto/TODO
@@ -0,0 +1,54 @@
+Features
+- Operand classes for instructions
+- Hints in register allocation
+- Fixed register instructions (div, mul)
+  Is this part of "operand classes"?
+
+Instructions
+- ADD SUB SDIV UDIV SREM UREM MUL LSL LSR ASL ASR
+- SEXT ZEXT (we need 8, 16, 32, 64 bits)
+- CMP ...
+- ALLOC STORE LOAD (we need 8, 16, 32, 64 bits)
+(- PTR)
+- CALL BRZ JMP RET
+
+Machine
+- SREG GREG
+- Register use/defs for all instructions.
+
+Types
+- Integer (32 & 64 bits)
+(- Structure "{a,b,c}")
+(- Pointer (to type "t"))
+
+Questions
+- Q: Should we allow constant operands?
+  A:
+  It looks like `Con instructions are a bad idea because
+  they introduce spurious live ranges.
+  This was not a huge problem, modifications s in loc and
+  getreg only fixed this.  Still, it makes use larger bit
+  vectors during the liveness analysis.
+- Q: How to represent the IR?
+  A:
+  So far, a graph of basic blocks composed of quadruples
+  seems to be the most convenient.
+- Q: Do we need types?
+
+Problems
+- x = y op z [fixed using freeze]
+  if x is spilled, y can be moved to a spill location
+  to free one register for x, this is kind of stupid.
+  We can probably fix this by having a better heuristic
+  for spilling decisions.
+- [tentative fix: 4fc98da]
+  Phi defined variables with spill location do not work.
+- At the end of a block we call loc on all live variables,
+  if there are not enough registers, some variables get
+  assigned spill locations.  We need to be able to spill
+  variables that are already in register.
+  NOTE: Following Braun & Hack we could do one pass
+  first that determines what variables are in register
+  at the end of loops.  This sounds good because
+  back-edges are actually easier to detect than loop
+  headers!