Hi,
I am thinking about merging stmt_ann_d into tree_statement_list_node.
Background
----------
tree_statement_list_node is a linked list node defined like so
struct tree_statement_list_node {
struct tree_statement_list_node *prev;
struct tree_statement_list_node *next;
tree stmt;
};
stmt_ann_d is an annotation for a statement ("stmt" above) that
includes operand cache, the basic block that the statement belongs to,
and various flags among other things.
Justifications
--------------
o We have a 1:1 correspondence between tree_statement_list_node and
stmt_ann_d. Why have separate data structures?
o Cache win. Calling bsi_stmt loads tree_statement_list_node into
memory, which might in turn bring members of stmt_ann_d into cache.
Note that it's very common to call bsi_stmt and then do something
with operand cache while walking statements in a basic block.
o bsi_for_stmt becomes an O(1) operation. Steven Bosscher says that
the CFG inliner will hit bsi_for_stmt hard.
o Less memory management overhead.
o One step closer to a flat statement structure (or a tuple form if
you like). It's a bit silly that we have GIMPLE, but we still do
not have a flat structure.
o We can probably remove get_stmt_ann and replace all uses of
stmt_ann. No more lazy stmt_ann allocation.
Thoughts?
Kazu Hirata