1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
TODO
====
Essential
---------
* SSA is broken by simplify_loads() & branches rewriting/simplification
* add support for bitwise enums (wip)
Documentation
-------------
* document the API
* document the limitations of modifying ptrlists during list walking
* document the data structures
* document flow of data / architecture / code structure
Core
----
* if a variable has its address taken but in an unreachable BB then
its MOD_ADDRESSABLE may be wrong and it won't be SSA converted.
- let kill_insn() check killing of SYMADDR,
- add the sym into a list and
- recalculate the addressability before memops's SSA conversion
* bool_ctype should be split into internal 1-bit / external 8-bit
Testsuite
---------
* there are 60 failing tests. They should be fixed
(but most are non-trivial to fix).
Misc
----
* GCC's -Wenum-compare / clangs's -Wenum-conversion -Wassign-enum
* parse __attribute_((fallthrough))
* add support for format(printf()) (WIP by Ben Dooks)
* make use of UNDEFs (issues warnings, simplification, ... ?)
* make memory accesses more explicit: add EXPR_ACCESS (wip)
* it would be nice to do our own parsing of floating point (wip)
* some header files needed for crypto/ need __vector or __fp16
* some even need __complex
Optimization
------------
* a lot of small simplifications are waiting to be upstreamed
* the domtree need to be rebuilt (or updated)
* critical edges need to be split
* the current way of doing CSE uses a lot of time
* add SSA based DCE
* add SSA based PRE
* Add SSA based SCCP
* add a pass to inline small functions during simplification.
* use better/more systematic use of internal verification framework
* tracking of operands size should be improved (WIP)
* OP_INLINE is sometimes in the way
* would be nice to strictly separate phases that don't changes the
CFG and thus the dominance tree.
IR
--
* pseudos are untyped, it's usually OK but often it complicates things:
- PSEUDO_REGs are defined by instructions and their type is normally
retrievable via this defining instruction but in some cases they're not:
for example, pseudos defined by ASM output.
- PSEUDO_ARGs are considered as defined by OP_ENTRY and are used like
this for liveness trackability but their type can't simply be
retrieved via this instruction like PSEUDO_REGs are (with ->def->type).
- PSEUDO_VALs are completely typeless.
Maybe a few bits should be used to store some kind of low-level type.
* OP_SET should return a bool, always
* add IR instructions for va_arg() & friends
* add a possibility to import of file in "IR assembly"
* dump the symtable
* dump the CFG
LLVM
----
* fix ...
Internal backends
-----------------
* it would be nice the upstream the code generator
* add a pass to transform 3-addresses code to 2-addresses
* add some basic register allocation
* add a pass to order the BBs and changes 2-ways CBR into one-way branches
* what can be done for x86?
* add support to add constraints in the MD rules
Longer term/to investigate
--------------------------
* attributes are represented as ctypes's alignment, modifiers & contexts
but plenty of attributes doesn't fit, for example they need arguments.
* format(printf, ...),
* section("...")
* assume_aligned(alignment[, offsert])
* error("message"), warning("message")
* ...
* should support "-Werror=..." ?
* All warning messages should include the option how to disable it.
For example:
"warning: Variable length array is used."
should be something like:
"warning: Variable length array is used. (-Wno-vla)"
* ptrlists must not have elements removed while being iterated;
this should somehow be enforced.
* having 'struct symbol' used to represent symbols *and* types is
quite handy but it also creates lots of problems and complications
* Possible mixup of symbol for a function designator being not a pointer?
This seems to make evaluation of function pointers much more complex
than needed.
* extend test-inspect to inspect more AST fields.
* extend test-inspect to inspect instructions.
|