GCC Middle and Back End API Reference
|
Data Fields | |
int | size |
vec< int > | nodes |
vec< int > | edge_list |
vec< source_location > | edge_locus |
sbitmap | visited |
vec< int > | stack |
var_map | map |
edge | e |
vec< int > | const_dests |
vec< tree > | const_copies |
vec< source_location > | copy_locus |
@verbatim Convert a program in SSA form into Normal form.
Copyright (C) 2004-2013 Free Software Foundation, Inc. Contributed by Andrew Macleod amacl eod@ redha t.co m
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see http://www.gnu.org/licenses/.
FIXME: A lot of code here deals with expanding to RTL. All that code should be in cfgexpand.c.
Used to hold all the components required to do SSA PHI elimination. The node and pred/succ list is a simple linear list of nodes and edges represented as pairs of nodes. The predecessor and successor list: Nodes are entered in pairs, where [0] ->PRED, [1]->SUCC. All the even indexes in the array represent predecessors, all the odd elements are successors. Rationale: When implemented as bitmaps, very large programs SSA->Normal times were being dominated by clearing the interference graph. Typically this list of edges is extremely small since it only includes PHI results and uses from a single edge which have not coalesced with each other. This means that no virtual PHI nodes are included, and empirical evidence suggests that the number of edges rarely exceed 3, and in a bootstrap of GCC, the maximum size encountered was 7. This also limits the number of possible nodes that are involved to rarely more than 6, and in the bootstrap of gcc, the maximum number of nodes encountered was 12.
Referenced by delete_elim_graph(), eliminate_build(), eliminate_phi(), and new_elim_graph().
vec<int> _elim_graph::const_dests |
Referenced by delete_elim_graph(), eliminate_build(), eliminate_phi(), and new_elim_graph().
vec<source_location> _elim_graph::copy_locus |
Referenced by delete_elim_graph(), eliminate_build(), eliminate_phi(), and new_elim_graph().
edge _elim_graph::e |
Referenced by elim_backward(), elim_create(), eliminate_build(), and eliminate_phi().
vec<int> _elim_graph::edge_list |
Referenced by clear_elim_graph(), delete_elim_graph(), elim_graph_add_edge(), elim_graph_remove_succ_edge(), and new_elim_graph().
vec<source_location> _elim_graph::edge_locus |
Referenced by clear_elim_graph(), delete_elim_graph(), elim_graph_add_edge(), elim_graph_remove_succ_edge(), and new_elim_graph().
var_map _elim_graph::map |
Referenced by elim_create(), eliminate_build(), and expand_phi_nodes().
vec<int> _elim_graph::nodes |
Referenced by clear_elim_graph(), delete_elim_graph(), elim_graph_add_node(), elim_graph_size(), eliminate_phi(), and new_elim_graph().
int _elim_graph::size |
vec<int> _elim_graph::stack |
Referenced by delete_elim_graph(), elim_forward(), eliminate_phi(), and new_elim_graph().
sbitmap _elim_graph::visited |
Referenced by delete_elim_graph(), elim_backward(), elim_create(), elim_forward(), elim_unvisited_predecessor(), eliminate_phi(), and new_elim_graph().