]>
Commit | Line | Data |
---|---|---|
abe07a74 | 1 | // Definition of private classes for RTL SSA -*- C++ -*- |
a945c346 | 2 | // Copyright (C) 2020-2024 Free Software Foundation, Inc. |
abe07a74 RS |
3 | // |
4 | // This file is part of GCC. | |
5 | // | |
6 | // GCC is free software; you can redistribute it and/or modify it under | |
7 | // the terms of the GNU General Public License as published by the Free | |
8 | // Software Foundation; either version 3, or (at your option) any later | |
9 | // version. | |
10 | // | |
11 | // GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 | // WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 | // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 | // for more details. | |
15 | // | |
16 | // You should have received a copy of the GNU General Public License | |
17 | // along with GCC; see the file COPYING3. If not see | |
18 | // <http://www.gnu.org/licenses/>. | |
19 | ||
20 | namespace rtl_ssa { | |
21 | ||
22 | // Information about a basic block's phi nodes. This class is only used when | |
23 | // constructing the SSA form, it isn't meant to be kept up-to-date. | |
24 | class function_info::bb_phi_info | |
25 | { | |
26 | public: | |
27 | // The set of registers that need phi nodes. | |
28 | bitmap_head regs; | |
29 | ||
30 | // The number of registers in REGS. | |
31 | unsigned int num_phis; | |
32 | ||
33 | // The number of inputs to each phi node. Caching the information here | |
34 | // is at best a minor optimisation, but it fills a 32-bit hole that would | |
35 | // otherwise exist on 64-bit hosts. | |
36 | unsigned int num_preds; | |
37 | ||
38 | // An array of all the phi inputs for this block. It lists all inputs | |
39 | // from the first incoming edge followed by all inputs for the next | |
40 | // incoming edge, and so on. The inputs for a given edge are sorted | |
41 | // by increasing register number. | |
42 | set_info **inputs; | |
43 | }; | |
44 | ||
45 | // Information used while constructing the SSA form and discarded | |
46 | // afterwards. | |
47 | class function_info::build_info | |
48 | { | |
49 | public: | |
50 | build_info (unsigned int, unsigned int); | |
51 | ~build_info (); | |
52 | ||
53 | set_info *current_reg_value (unsigned int) const; | |
54 | set_info *current_mem_value () const; | |
55 | ||
56 | void record_reg_def (def_info *); | |
57 | void record_mem_def (def_info *); | |
58 | ||
59 | // The block that we're currently processing. | |
60 | bb_info *current_bb; | |
61 | ||
62 | // The EBB that contains CURRENT_BB. | |
63 | ebb_info *current_ebb; | |
64 | ||
65 | // Except for the local exception noted below: | |
66 | // | |
67 | // - If register R has been defined in the current EBB, LAST_ACCESS[R + 1] | |
68 | // is the last definition of R in the EBB. | |
69 | // | |
70 | // - Otherwise, if the current EBB is dominated by a definition of R, | |
71 | // LAST_ACCESS[R + 1] is the nearest dominating definition. | |
72 | // | |
73 | // - Otherwise, LAST_ACCESS[R + 1] is null. | |
74 | // | |
75 | // Similarly: | |
76 | // | |
77 | // - If the current EBB has defined memory, LAST_ACCESS[0] is the last | |
78 | // definition of memory in the EBB. | |
79 | // | |
80 | // - Otherwise LAST_ACCESS[0] is the value of memory that is live on | |
81 | // - entry to the EBB. | |
82 | // | |
83 | // The exception is that while building instructions, LAST_ACCESS[I] | |
84 | // can temporarily be the use of regno I - 1 by that instruction. | |
85 | auto_vec<access_info *> last_access; | |
86 | ||
87 | // A bitmap used to hold EBB_LIVE_IN_FOR_DEBUG. | |
88 | auto_bitmap tmp_ebb_live_in_for_debug; | |
89 | ||
90 | // If nonnull, a bitmap of registers that are live on entry to this EBB, | |
91 | // with a tree view for quick lookup. This bitmap is calculated lazily | |
92 | // and is only used if MAY_HAVE_DEBUG_INSNS. | |
93 | bitmap ebb_live_in_for_debug; | |
94 | ||
95 | // The set of registers that might need to have phis associated with them. | |
96 | // Registers outside this set are known to have a single definition that | |
97 | // dominates all uses. | |
98 | // | |
99 | // Before RA, about 5% of registers are typically in the set. | |
100 | auto_sbitmap potential_phi_regs; | |
101 | ||
102 | // A sparse bitmap representation of POTENTIAL_PHI_REGS. Only used if | |
103 | // MAY_HAVE_DEBUG_INSNS. | |
104 | auto_bitmap potential_phi_regs_for_debug; | |
105 | ||
106 | // The set of registers that have been defined so far in the current EBB. | |
107 | auto_bitmap ebb_def_regs; | |
108 | ||
109 | // BB_PHIS[B] describes the phis for basic block B. | |
110 | auto_vec<bb_phi_info> bb_phis; | |
111 | ||
112 | // BB_MEM_LIVE_OUT[B] is the memory value that is live on exit from | |
113 | // basic block B. | |
114 | auto_vec<set_info *> bb_mem_live_out; | |
115 | ||
116 | // BB_TO_RPO[B] gives the position of block B in a reverse postorder | |
117 | // of the CFG. The RPO is a tweaked version of the one normally | |
118 | // returned by pre_and_rev_post_order_compute, with all blocks in | |
119 | // an EBB having consecutive positions. | |
120 | auto_vec<int> bb_to_rpo; | |
121 | ||
122 | // This stack is divided into sections, with one section for the | |
123 | // current basic block and one section for each dominating block. | |
124 | // Each element is a register definition. | |
125 | // | |
126 | // If the section for block B contains a definition D of a register R, | |
127 | // then one of two things is true: | |
128 | // | |
129 | // - D occurs in B and no definition of R dominates B. | |
130 | // - D dominates B and is the nearest dominating definition of R. | |
131 | // | |
132 | // The two cases are distinguished by the value of D->bb (). | |
133 | auto_vec<def_info *> def_stack; | |
134 | ||
135 | // The top of this stack records the start of the current block's | |
136 | // section in DEF_STACK. | |
137 | auto_vec<unsigned int> old_def_stack_limit; | |
ba97d0e3 RS |
138 | |
139 | // The block that dominates the exit block, or null if the exit block | |
140 | // is unreachable. | |
141 | basic_block exit_block_dominator; | |
abe07a74 RS |
142 | }; |
143 | ||
144 | } |