Changed the interface of value_not_zero() and value_not_null() to return
[libfirm] / TODO
diff --git a/TODO b/TODO
index 352e6c6..3800901 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,3 +1,378 @@
+  * 27.8.2004 Goetz
+    Classes need a flag comparable to visibility of entities.
+    This flag must express whether these classes are accessed from
+    outside, i.e., the fields must have a specific layout.
+    Further it should express whether the outside can allocate classes
+    of the type.  Then we can determine whether the class can be turned
+    into a description class by, e.g., rta.
+
+  *
+
+  * 5.7.04 Goetz
+    in free_type: check the types that there is no pointer type that points
+    to the freed type.  If so report error.
+
+  + 28.6.04 MMB
+    Div/Mod optimization for constants produces a result that will be optimized
+    again and again :-( Add a flag or a clever encoding so thios does not happen
+
+  + Goetz 10.6.04
+    Error in removing dead code:
+    In an if condition is a loop.  We optimized the if condition to Jmp/Bad,
+    the loop now is unreachable.  It should be removed by gigo or the like.
+    It remains in the representation as all blocks in the loop have a
+    valid predecessor, i.e., walking from End we find a true loop.  We need
+    a pass walking and marking starting at the Start node to remove this loop.
+    Currently scc causes an segmetation fault for this situation.
+
+  + Goetz 10.6.04
+    Error in irscc:  If we have an unreachable loop, or a loop
+    resulting from an exiting endless recursion, irscc finds
+    no tail ==> issues an assertion.
+
+  * Goetz 10.6.04
+    Error in interprocedural view:  Endless recursions are lost.
+
+  * print routines for all enums!
+
+  * Add flag whether mode is associative, float modes are not!!
+
+  * 25.2.04 Goetz
+    Fix memory leak in irprog: free_ir_prog.
+    Fix memory leak in entity: free_entity_attrs
+
+  * 19.12.03 Goetz
+    Add state management for loops (consistent, inconsistent, invalid).
+
+  * 18.12.03 Goetz
+    It sucks that Call and CallBegin are different nodes. Change this!!!!
+    (as for Filter: Phi/Proj).
+
+  * 8.12. Goetz
+    Vorgaengernummern am Looptree auf Kanten ausgeben.
+
+  * 8.12.03 Goetz und Till
+    Alloc Semantik:  Der Alloc Knoten koennte wissen, ob der
+    allozierte Speicher zu Null initialisiert ist.  Dies nehmen
+    wir im Jack Java Compiler an, im CRS C Compiler jedoch nicht.
+    Ist das nicht explizit im Allok Knoten vermerkt, kann eine
+    Optimierung nur in Abhaengigkeit vom Frontend darauf aufbauen.
+    (z.B. heapanal nimmt any an, statt null.)
+
+  * 8.9.03 Boris
+    Wenn man in Arrays.java in der Methode ArrObject.f() die
+    ersten zwei prints auskommentiert und pass_array_test die
+    for-Schleife durch ein i = 0, while(true).. ersetzt, stürzt der
+    Compiler in get_Block_idom ab; der übergebene Zeiger ist ein
+    NULL-Zeiger.
+
+  * 15.9.03 Goetz
+    Wir haben ev. einen Fehler in scc gefunden:  Matthias hat eine
+    Enlosrekursion a() { b(); }, b() { a(); } in Java implementiert.
+    Darauf ist in is_head die Assertion
+       assert(get_irn_uplink(pred) >= get_irn_uplink(root));
+    geflogen.
+
+  * 29.8.03 Goetz
+    Cast: irsimpletype: implement type analyses for one node.  Test the
+    effort of that analyses.  Add optimization to iropt that removes
+    Cast nodes.
+
+  * 22.8.2003 Goetz
+    Firm const nodes should have a type.
+    In jack all nodes are typed now, except the Const nodes. Only const from
+    tarval is typed.
+
+  * 14.8.2003 Goetz
+    Diverse dynamische arrays haben ein erstes, unverwendetes element. Z.B.
+    class members.  Entfernen um Speicher zu sparen.
+    Ev. auch attribute an firm Knoten optimieren, per bitfield.
+
+  + 24.3.2003 Goetz
+    tarval requirements:
+    zu register_mode:
+    Ich haette ganz gerne
+      new_ir_mode(ident* name, int size, int alignment, mode_sort sort);
+    modecode ist der naechste frei int > maxenum.
+    Und der konstruktor sollte auch nach den zwei inits aufgerufen werden koennen.
+    was spricht dagegen?  (die zwei inits stehen in init_firm(), ein benutzer kann
+    schwer dazwischen andere methoden aufrufen.)
+
+  * 24.3.2003 Goetz
+    tarval requirements:
+    - if overflow either return no tarval or return result of overflow
+      computation.  Offer to output a warning. (configurable)
+    - Div:  configure rounding (up/down) in init_firm, remark in each Div node
+      rounding sheme, default by initializations, pass rounding sheme
+      to tarval module
+    - impelement tarval_bitpattern
+    - make routine that outputs parts < 32 bits from any tarval
+      at given position in a C type that is exactly 32 bits.
+      For this test C types for their size or use int32 in integer.h
+      (is this standard C??)
+    - add routine that outputs the position of the largest set bit.
+
+  + 29.10.2002 Goetz
+    Representation of value compounds is not good, especially with
+    calls.
+
+  + 29.10.2002 Goetz
+    We can not represent bitfield members of structs in C.
+    Decision: generate explicit code for it, using shifts etc.
+    No special support.
+
+  * 29.10.2002 Goetz
+    If parameter variables are dereferenced they must be represented
+    by an entity in the stack frame type.  We need a mechanism to
+    find out which fields were parameters so that the parameter
+    passing space on the frame can be used for the parameters.
+
+  + 19.11.2001 Goetz
+    SymConst mit ident taugt nicht:  Wenn man z.B. die Prozedur kennt
+    sollte man die entitaet der Prozedur angeben koennen.  Ermoeglicht
+    einfachere Navigation im Callgraphen.
+    --> Verwende Const mit entity.
+
+  + 13.11.2001 Goetz
+    Aufbau Exceptions tut nicht:
+    1) mache exception handle block
+    2) baue code auf, verzweige von fragile ops zu dem Handler
+    3) mature exception block
+    --> Dann werden natuerlich die Werte am Ende der Bloecke mit den
+       fragile ops verwendet!  Diese sind ev. nicht berechnet.  Trifft
+       insbesondere auf memory zu ...
+    Loesung z.B.:
+    immExcBlock konstruktor.  Neuer "mature" status.  immExcBlocks duerfen
+    keine zyklen bilden.  In immExcBlocks werden PhiKnoten sofort eingesetzt,
+    aber wie immBlock mit flexibler vorgaenger liste.  add_in_edge ergaenzt
+    bei allen Phi Knoten dann sofort die neu bekannten Werte.  Jetzt kann
+    genau der Status zum Zeitpunkt der Exception abgebildet werden.
+
+  + 7.11.2001 Goetz
+    Model Stack frame of a method as class type as for Global type?
+    (Class so that methods defined within methods can be represented?)
+    So far local entities are added to GlobalType.
+
+  + 7.11.2001 Goetz
+    Implement support for endless loops.
+    (Add Jump target block to a list if optimizing Cond nodes.
+    Extend walker to start walking at this list.
+    Extend dead node elimination to update and compact this list.
+    Extend inlining to inline this list.)
+
+  + 7.11.2001 Goetz
+    Implement checking whether layout is fixed when setting corresponding
+    flag.  See firmtut, 3.1.4.
+    Maybe write a checker for the type information.
+
+  + 19.6.2001 Goetz
+    What happens if undefined values are allowed?  See ircons.c,
+    grep for get_irg_start_block.
+
+  + 23.5.2001 Goetz
+    Does the array type contain a field with the array entity?
+    This entity should be constructed automatically with the array type.
+
+  * 23.5.2005 Goetz
+    All compound types need a flag saying whether the order of the members
+    must be conserved.
+
+  + 23.5.2001 Goetz
+    Add element_type to array constructor
+
+  + 15.3.2001 Goetz
+    mode, size in type:  Wann gibt es einen mode, wann die size?
+    Kann man den mode aendern?  Nicht bei prim, enum, pointer da
+    schon irreversibel in Programmcode umgesetzt.  Die anderen
+    haben keinen mode.  Reicht daher intern ein Feld?  Muss man
+    in get_type_mode die typen asserten, und set_mode verbieten,
+    dafuer im enum konstruktor mode mitgeben?
+
+  + 14.3.2001 Boris
+    make dist should create an archive which has the directory libfirm/
+    as top-level
+=======
   14.3.2001 Boris
-  make dist should create an archive which has the directory libfirm/
-  as top-level
+  - make dist should create an archive which has the directory libfirm/
+    as top-level [DONE:28.3.2001 Boris]
+  - Datei 'Copyright' oder 'Copying' mit entsprechendem Copyrightverweis
+
+*********** old stuff ***********
+
+ + Problem mit endlosen Schleifen loesen.
+
+ * Automatisches generieren und set_value der Argumente-projs in
+   new_ir_graph
+
+ + Define and implement procedure-global extensions, e.g., the call graph.
+
+ * Implement Confirm node: Added by optimization to annotate dataflow
+   edge with information as (value > 0).  This improves dataflow analysis.
+   These nodes can be derived from Cmp nodes in conjunction with dataflow
+   information.
+
+ + think again about implementation of boolean expressions  (0<1) && (2<3)
+   Cast now possible
+
+ + Add evaluation routines for Rotate, Not, Minus, ShrA to target value,
+   extend optimization to cover these nodes.
+
+ * do we need remainder (Rem) operator?
+   different sign handling than Mod.  How much processors???
+
+ * Turn Quot, Minus into three letter operator.
+
+Propositions by Boris, 5.3.2001:
+ + Fehler in FIRM?
+   ---------------
+   + in oo_program_example ist das Feld einfach nur eine entity. Aber alles andere
+     hat einen bestimmten Typ (z.B. method, strct, etc.). Muß es dann nicht auch
+     field geben? Oder werden alle Felder eines Objekts in einem strct organisiert
+     -> HowTo Use FIRM - Doku.
+     ==> Wann eine entitaet ein Feld ist, laesst sich am Typ der Entitaet enkennen.
+         Entitaet ist Feld wenn Owner Klassentyp (oder ev. Struct) und Typ nicht
+         Methodentyp.
+        Speicherbedarf der Entitaet, d.h. ihr mode, laesst sich auch dem Typ ansehen.
+         Manche Typen enthalten explizit den mode (z.B. type_primitive, type_pointer.)
+         Bei anderen haengt die Groesse vom Layout ab:  class, struct.
+         Frage (fehlende Konvention): Ist eine Klasse ein Pointer oder immer nur
+         eine Value-Class??  Je nach dem muss man die Entitaeten modellieren:
+         Klasse = Pointer:  entitaet kann Typ=class haben.
+         Klasse = WerteKlasse: entitaet sollte pointer mit points-to Klasse sein.
+   - fehlende Optimierung: wenn ein Wert einer Ladeoperation nicht gebraucht wird,
+     dann gibt es auch keine Kante dafuer, aber die Ladeoperation bleibt
+     (unnoetigerweise) stehen.
+   - mit set_optimize(1) geht die Optimierung von if(const cmpop const) unvollständig
+     bzw. falsch [da bleibt wohl ein zweiter Block-Knoten ohne Vorgänger]
+ + Verbesserungsvorschläge:
+   ------------------------
+   + Knoten im Typgraphen mit Farbe hinterlegen
+   - Attribute im Firmgraphen nicht im Knoten
+   + Kanten je nach Sematik farbig markieren, vielleicht dann auch Knoten
+     (z.B. rot fuer alles, was mit Steuerfluss zu tun hat)
+   + konfigurierbar, ob Konstanten im Startblock, oder im aktuellen
+     ==> geht schlecht.
+   + von Hochsprachtypen loesen? Signed32 statt int?
+     ==> viel Arbeit, nur Namenskonvention.  Ev wenn target value modul
+         ausgetauscht.
+
+ + if_while_example ergibt Segmentation Fault da Bad Vorgaenger von Endblock.
+   Optimierung des end blocks geaendert.
+
+ + define Nodes for Rotate, Not, Minus, ShrA.  Extend irdump, verification.
+
+ + change impelmentation of type to use concept as in irnode.
+   Three common fields: kind, ident, mode !!! fill mode with
+   mode_none if applicable.
+
+ + add asserts in type.c that check that proper type is passed.
+   not in get_type_name, get_type_ident.
+
+ + type / entity not good, too much casts.
+   merge type_or_ent union with type union. ??!!
+   allocate always unions.
+   write access routines for type, e.g. get_type_name.
+   change access routines for individual types to select from union.
+
+ + Wann macht man Dispatch Tabellen.  Lower Phase
+
+ + integrate irgmod into ircons.  The routines in there are only needed
+   during ir construction.  (If there are some not needed, remove them.)
+
+ + Build more structured directoriy structure:
+   ir/ir                irgraph, irnode, irop, irmode, type, entity,
+                        common,
+   ir/manipulate        ircons, irgmod, irvrfy
+   ir/optimize          iropt, irflag
+   ir/datastructure     array, obst, pdeq, pset, set
+   ir/include           gmp, host, xfprintf, xgprintf, xmalloc,
+                        xoprintf, xp_help, xprintf
+   ir/compilermodules   ident, xx_ident, tv, ieee754
+   ir/aux               irdump, strerror,
+   where goes           debug, firm, label, mangle, misc, panic, tune?
+
+ + Changes to nodes:
+   - SymConst also returns pointer.
+   - Start returns pointer to segment for globals.
+   - remove copy, clear, type_or_ent
+   - add free
+   - add constructor for shrs
+   - remove Phi0 ruins
+
+ + How shall global variables be modeled in FIRM, if programs as C are
+   translated?  Modeling them as entity of the class defined for the
+   file/compilation unit is not sufficient, as then they are not
+   visible from out of this file.
+   For the uebprakt and kirmes we model them by selection from the
+   area that contains all globals (data segment).  The pointer to
+   this area is provided by the start node.
+   In Sather these were modeled by pointers to string constants containing
+   the name of the global variable (or static field):
+     new_Const (mode_p, tarval_p_from_str ("VAR_A"))
+
+ + port transform_node in iropt to lib.
+
+ + make new Version
+
+***************************************************************************
+
+ + add attributes from doku to constructors.
+
+ + add Phi_in stack as field to ir_graph??!!
+
+ + implement ShrA constructor.
+   What are allowed types?
+
+ + add type struct
+
+ + write dumper for type information.
+   write dumper for type and graph.
+   write dumper for control flow graph.
+
+ + dump irgraph with all the type information.  Write function that
+   dumps type information and one that dumps entities.  To integrate
+   this separate dump_node and the recursion, and add the dump_type
+   and dump_entity function in the recursive iterator or write second
+   dump routine.
+
+ + Fix bug in pset/set, so that several tables can be used. iropt/identify
+   aborts. Thanks, Boris!
+
+ + write example program with irreducible control flow:
+
+   /* Phi node with three predecessors: */
+      a = 1
+      if () goto loop
+      a = 2
+      goto loop
+   loop:
+      if () goto exit
+      b = 1
+      goto loop
+   exit:
+      b = a
+
+   /* irreducible two entry loop */
+      b = 1
+      if () goto entry1 else goto entry2
+   entry 1
+      a = 2
+      if () goto exit else goto entry 2
+   entry 2
+      a = 1
+      if () goto exit else goto entry 1
+   exit
+      b = a + b
+
+ + entity must be able to take arrays as owner.  Anything else?
+   --> assert allowed types.
+
+ + Alloc must be able to take any type as owner.  Also primitive types
+   so that allocation to the stack of dereferenced local variables can
+   be modeled.
+
+ + Implement vrfy_graph(end_node) that iterates over the whole graph
+  calling ir_vrfy so that the graph can be verified after each
+   optimization.
+
+ + DONE: Add access routines to ir_graph, ir_mode (?).