1*e4b17023SJohn Marino /* Procedure integration for GCC.
2*e4b17023SJohn Marino Copyright (C) 1988, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3*e4b17023SJohn Marino 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4*e4b17023SJohn Marino Free Software Foundation, Inc.
5*e4b17023SJohn Marino Contributed by Michael Tiemann (tiemann@cygnus.com)
6*e4b17023SJohn Marino
7*e4b17023SJohn Marino This file is part of GCC.
8*e4b17023SJohn Marino
9*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
10*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
11*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
12*e4b17023SJohn Marino version.
13*e4b17023SJohn Marino
14*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
16*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17*e4b17023SJohn Marino for more details.
18*e4b17023SJohn Marino
19*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
20*e4b17023SJohn Marino along with GCC; see the file COPYING3. If not see
21*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */
22*e4b17023SJohn Marino
23*e4b17023SJohn Marino #include "config.h"
24*e4b17023SJohn Marino #include "system.h"
25*e4b17023SJohn Marino #include "coretypes.h"
26*e4b17023SJohn Marino #include "tm.h"
27*e4b17023SJohn Marino
28*e4b17023SJohn Marino #include "rtl.h"
29*e4b17023SJohn Marino #include "tree.h"
30*e4b17023SJohn Marino #include "tm_p.h"
31*e4b17023SJohn Marino #include "regs.h"
32*e4b17023SJohn Marino #include "flags.h"
33*e4b17023SJohn Marino #include "debug.h"
34*e4b17023SJohn Marino #include "insn-config.h"
35*e4b17023SJohn Marino #include "expr.h"
36*e4b17023SJohn Marino #include "output.h"
37*e4b17023SJohn Marino #include "recog.h"
38*e4b17023SJohn Marino /* For reg_equivs. */
39*e4b17023SJohn Marino #include "reload.h"
40*e4b17023SJohn Marino #include "integrate.h"
41*e4b17023SJohn Marino #include "except.h"
42*e4b17023SJohn Marino #include "function.h"
43*e4b17023SJohn Marino #include "diagnostic-core.h"
44*e4b17023SJohn Marino #include "intl.h"
45*e4b17023SJohn Marino #include "params.h"
46*e4b17023SJohn Marino #include "ggc.h"
47*e4b17023SJohn Marino #include "target.h"
48*e4b17023SJohn Marino #include "langhooks.h"
49*e4b17023SJohn Marino #include "tree-pass.h"
50*e4b17023SJohn Marino #include "df.h"
51*e4b17023SJohn Marino
52*e4b17023SJohn Marino /* Round to the next highest integer that meets the alignment. */
53*e4b17023SJohn Marino #define CEIL_ROUND(VALUE,ALIGN) (((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
54*e4b17023SJohn Marino
55*e4b17023SJohn Marino
56*e4b17023SJohn Marino /* Private type used by {get/has}_hard_reg_initial_val. */
57*e4b17023SJohn Marino typedef struct GTY(()) initial_value_pair {
58*e4b17023SJohn Marino rtx hard_reg;
59*e4b17023SJohn Marino rtx pseudo;
60*e4b17023SJohn Marino } initial_value_pair;
61*e4b17023SJohn Marino typedef struct GTY(()) initial_value_struct {
62*e4b17023SJohn Marino int num_entries;
63*e4b17023SJohn Marino int max_entries;
64*e4b17023SJohn Marino initial_value_pair * GTY ((length ("%h.num_entries"))) entries;
65*e4b17023SJohn Marino } initial_value_struct;
66*e4b17023SJohn Marino
67*e4b17023SJohn Marino static void set_block_origin_self (tree);
68*e4b17023SJohn Marino static void set_block_abstract_flags (tree, int);
69*e4b17023SJohn Marino
70*e4b17023SJohn Marino
71*e4b17023SJohn Marino /* Return false if the function FNDECL cannot be inlined on account of its
72*e4b17023SJohn Marino attributes, true otherwise. */
73*e4b17023SJohn Marino bool
function_attribute_inlinable_p(const_tree fndecl)74*e4b17023SJohn Marino function_attribute_inlinable_p (const_tree fndecl)
75*e4b17023SJohn Marino {
76*e4b17023SJohn Marino if (targetm.attribute_table)
77*e4b17023SJohn Marino {
78*e4b17023SJohn Marino const_tree a;
79*e4b17023SJohn Marino
80*e4b17023SJohn Marino for (a = DECL_ATTRIBUTES (fndecl); a; a = TREE_CHAIN (a))
81*e4b17023SJohn Marino {
82*e4b17023SJohn Marino const_tree name = TREE_PURPOSE (a);
83*e4b17023SJohn Marino int i;
84*e4b17023SJohn Marino
85*e4b17023SJohn Marino for (i = 0; targetm.attribute_table[i].name != NULL; i++)
86*e4b17023SJohn Marino if (is_attribute_p (targetm.attribute_table[i].name, name))
87*e4b17023SJohn Marino return targetm.function_attribute_inlinable_p (fndecl);
88*e4b17023SJohn Marino }
89*e4b17023SJohn Marino }
90*e4b17023SJohn Marino
91*e4b17023SJohn Marino return true;
92*e4b17023SJohn Marino }
93*e4b17023SJohn Marino
94*e4b17023SJohn Marino /* Given a pointer to some BLOCK node, if the BLOCK_ABSTRACT_ORIGIN for the
95*e4b17023SJohn Marino given BLOCK node is NULL, set the BLOCK_ABSTRACT_ORIGIN for the node so
96*e4b17023SJohn Marino that it points to the node itself, thus indicating that the node is its
97*e4b17023SJohn Marino own (abstract) origin. Additionally, if the BLOCK_ABSTRACT_ORIGIN for
98*e4b17023SJohn Marino the given node is NULL, recursively descend the decl/block tree which
99*e4b17023SJohn Marino it is the root of, and for each other ..._DECL or BLOCK node contained
100*e4b17023SJohn Marino therein whose DECL_ABSTRACT_ORIGINs or BLOCK_ABSTRACT_ORIGINs are also
101*e4b17023SJohn Marino still NULL, set *their* DECL_ABSTRACT_ORIGIN or BLOCK_ABSTRACT_ORIGIN
102*e4b17023SJohn Marino values to point to themselves. */
103*e4b17023SJohn Marino
104*e4b17023SJohn Marino static void
set_block_origin_self(tree stmt)105*e4b17023SJohn Marino set_block_origin_self (tree stmt)
106*e4b17023SJohn Marino {
107*e4b17023SJohn Marino if (BLOCK_ABSTRACT_ORIGIN (stmt) == NULL_TREE)
108*e4b17023SJohn Marino {
109*e4b17023SJohn Marino BLOCK_ABSTRACT_ORIGIN (stmt) = stmt;
110*e4b17023SJohn Marino
111*e4b17023SJohn Marino {
112*e4b17023SJohn Marino tree local_decl;
113*e4b17023SJohn Marino
114*e4b17023SJohn Marino for (local_decl = BLOCK_VARS (stmt);
115*e4b17023SJohn Marino local_decl != NULL_TREE;
116*e4b17023SJohn Marino local_decl = DECL_CHAIN (local_decl))
117*e4b17023SJohn Marino if (! DECL_EXTERNAL (local_decl))
118*e4b17023SJohn Marino set_decl_origin_self (local_decl); /* Potential recursion. */
119*e4b17023SJohn Marino }
120*e4b17023SJohn Marino
121*e4b17023SJohn Marino {
122*e4b17023SJohn Marino tree subblock;
123*e4b17023SJohn Marino
124*e4b17023SJohn Marino for (subblock = BLOCK_SUBBLOCKS (stmt);
125*e4b17023SJohn Marino subblock != NULL_TREE;
126*e4b17023SJohn Marino subblock = BLOCK_CHAIN (subblock))
127*e4b17023SJohn Marino set_block_origin_self (subblock); /* Recurse. */
128*e4b17023SJohn Marino }
129*e4b17023SJohn Marino }
130*e4b17023SJohn Marino }
131*e4b17023SJohn Marino
132*e4b17023SJohn Marino /* Given a pointer to some ..._DECL node, if the DECL_ABSTRACT_ORIGIN for
133*e4b17023SJohn Marino the given ..._DECL node is NULL, set the DECL_ABSTRACT_ORIGIN for the
134*e4b17023SJohn Marino node to so that it points to the node itself, thus indicating that the
135*e4b17023SJohn Marino node represents its own (abstract) origin. Additionally, if the
136*e4b17023SJohn Marino DECL_ABSTRACT_ORIGIN for the given node is NULL, recursively descend
137*e4b17023SJohn Marino the decl/block tree of which the given node is the root of, and for
138*e4b17023SJohn Marino each other ..._DECL or BLOCK node contained therein whose
139*e4b17023SJohn Marino DECL_ABSTRACT_ORIGINs or BLOCK_ABSTRACT_ORIGINs are also still NULL,
140*e4b17023SJohn Marino set *their* DECL_ABSTRACT_ORIGIN or BLOCK_ABSTRACT_ORIGIN values to
141*e4b17023SJohn Marino point to themselves. */
142*e4b17023SJohn Marino
143*e4b17023SJohn Marino void
set_decl_origin_self(tree decl)144*e4b17023SJohn Marino set_decl_origin_self (tree decl)
145*e4b17023SJohn Marino {
146*e4b17023SJohn Marino if (DECL_ABSTRACT_ORIGIN (decl) == NULL_TREE)
147*e4b17023SJohn Marino {
148*e4b17023SJohn Marino DECL_ABSTRACT_ORIGIN (decl) = decl;
149*e4b17023SJohn Marino if (TREE_CODE (decl) == FUNCTION_DECL)
150*e4b17023SJohn Marino {
151*e4b17023SJohn Marino tree arg;
152*e4b17023SJohn Marino
153*e4b17023SJohn Marino for (arg = DECL_ARGUMENTS (decl); arg; arg = DECL_CHAIN (arg))
154*e4b17023SJohn Marino DECL_ABSTRACT_ORIGIN (arg) = arg;
155*e4b17023SJohn Marino if (DECL_INITIAL (decl) != NULL_TREE
156*e4b17023SJohn Marino && DECL_INITIAL (decl) != error_mark_node)
157*e4b17023SJohn Marino set_block_origin_self (DECL_INITIAL (decl));
158*e4b17023SJohn Marino }
159*e4b17023SJohn Marino }
160*e4b17023SJohn Marino }
161*e4b17023SJohn Marino
162*e4b17023SJohn Marino /* Given a pointer to some BLOCK node, and a boolean value to set the
163*e4b17023SJohn Marino "abstract" flags to, set that value into the BLOCK_ABSTRACT flag for
164*e4b17023SJohn Marino the given block, and for all local decls and all local sub-blocks
165*e4b17023SJohn Marino (recursively) which are contained therein. */
166*e4b17023SJohn Marino
167*e4b17023SJohn Marino static void
set_block_abstract_flags(tree stmt,int setting)168*e4b17023SJohn Marino set_block_abstract_flags (tree stmt, int setting)
169*e4b17023SJohn Marino {
170*e4b17023SJohn Marino tree local_decl;
171*e4b17023SJohn Marino tree subblock;
172*e4b17023SJohn Marino unsigned int i;
173*e4b17023SJohn Marino
174*e4b17023SJohn Marino BLOCK_ABSTRACT (stmt) = setting;
175*e4b17023SJohn Marino
176*e4b17023SJohn Marino for (local_decl = BLOCK_VARS (stmt);
177*e4b17023SJohn Marino local_decl != NULL_TREE;
178*e4b17023SJohn Marino local_decl = DECL_CHAIN (local_decl))
179*e4b17023SJohn Marino if (! DECL_EXTERNAL (local_decl))
180*e4b17023SJohn Marino set_decl_abstract_flags (local_decl, setting);
181*e4b17023SJohn Marino
182*e4b17023SJohn Marino for (i = 0; i < BLOCK_NUM_NONLOCALIZED_VARS (stmt); i++)
183*e4b17023SJohn Marino {
184*e4b17023SJohn Marino local_decl = BLOCK_NONLOCALIZED_VAR (stmt, i);
185*e4b17023SJohn Marino if ((TREE_CODE (local_decl) == VAR_DECL && !TREE_STATIC (local_decl))
186*e4b17023SJohn Marino || TREE_CODE (local_decl) == PARM_DECL)
187*e4b17023SJohn Marino set_decl_abstract_flags (local_decl, setting);
188*e4b17023SJohn Marino }
189*e4b17023SJohn Marino
190*e4b17023SJohn Marino for (subblock = BLOCK_SUBBLOCKS (stmt);
191*e4b17023SJohn Marino subblock != NULL_TREE;
192*e4b17023SJohn Marino subblock = BLOCK_CHAIN (subblock))
193*e4b17023SJohn Marino set_block_abstract_flags (subblock, setting);
194*e4b17023SJohn Marino }
195*e4b17023SJohn Marino
196*e4b17023SJohn Marino /* Given a pointer to some ..._DECL node, and a boolean value to set the
197*e4b17023SJohn Marino "abstract" flags to, set that value into the DECL_ABSTRACT flag for the
198*e4b17023SJohn Marino given decl, and (in the case where the decl is a FUNCTION_DECL) also
199*e4b17023SJohn Marino set the abstract flags for all of the parameters, local vars, local
200*e4b17023SJohn Marino blocks and sub-blocks (recursively) to the same setting. */
201*e4b17023SJohn Marino
202*e4b17023SJohn Marino void
set_decl_abstract_flags(tree decl,int setting)203*e4b17023SJohn Marino set_decl_abstract_flags (tree decl, int setting)
204*e4b17023SJohn Marino {
205*e4b17023SJohn Marino DECL_ABSTRACT (decl) = setting;
206*e4b17023SJohn Marino if (TREE_CODE (decl) == FUNCTION_DECL)
207*e4b17023SJohn Marino {
208*e4b17023SJohn Marino tree arg;
209*e4b17023SJohn Marino
210*e4b17023SJohn Marino for (arg = DECL_ARGUMENTS (decl); arg; arg = DECL_CHAIN (arg))
211*e4b17023SJohn Marino DECL_ABSTRACT (arg) = setting;
212*e4b17023SJohn Marino if (DECL_INITIAL (decl) != NULL_TREE
213*e4b17023SJohn Marino && DECL_INITIAL (decl) != error_mark_node)
214*e4b17023SJohn Marino set_block_abstract_flags (DECL_INITIAL (decl), setting);
215*e4b17023SJohn Marino }
216*e4b17023SJohn Marino }
217*e4b17023SJohn Marino
218*e4b17023SJohn Marino /* Functions to keep track of the values hard regs had at the start of
219*e4b17023SJohn Marino the function. */
220*e4b17023SJohn Marino
221*e4b17023SJohn Marino rtx
get_hard_reg_initial_reg(rtx reg)222*e4b17023SJohn Marino get_hard_reg_initial_reg (rtx reg)
223*e4b17023SJohn Marino {
224*e4b17023SJohn Marino struct initial_value_struct *ivs = crtl->hard_reg_initial_vals;
225*e4b17023SJohn Marino int i;
226*e4b17023SJohn Marino
227*e4b17023SJohn Marino if (ivs == 0)
228*e4b17023SJohn Marino return NULL_RTX;
229*e4b17023SJohn Marino
230*e4b17023SJohn Marino for (i = 0; i < ivs->num_entries; i++)
231*e4b17023SJohn Marino if (rtx_equal_p (ivs->entries[i].pseudo, reg))
232*e4b17023SJohn Marino return ivs->entries[i].hard_reg;
233*e4b17023SJohn Marino
234*e4b17023SJohn Marino return NULL_RTX;
235*e4b17023SJohn Marino }
236*e4b17023SJohn Marino
237*e4b17023SJohn Marino /* Make sure that there's a pseudo register of mode MODE that stores the
238*e4b17023SJohn Marino initial value of hard register REGNO. Return an rtx for such a pseudo. */
239*e4b17023SJohn Marino
240*e4b17023SJohn Marino rtx
get_hard_reg_initial_val(enum machine_mode mode,unsigned int regno)241*e4b17023SJohn Marino get_hard_reg_initial_val (enum machine_mode mode, unsigned int regno)
242*e4b17023SJohn Marino {
243*e4b17023SJohn Marino struct initial_value_struct *ivs;
244*e4b17023SJohn Marino rtx rv;
245*e4b17023SJohn Marino
246*e4b17023SJohn Marino rv = has_hard_reg_initial_val (mode, regno);
247*e4b17023SJohn Marino if (rv)
248*e4b17023SJohn Marino return rv;
249*e4b17023SJohn Marino
250*e4b17023SJohn Marino ivs = crtl->hard_reg_initial_vals;
251*e4b17023SJohn Marino if (ivs == 0)
252*e4b17023SJohn Marino {
253*e4b17023SJohn Marino ivs = ggc_alloc_initial_value_struct ();
254*e4b17023SJohn Marino ivs->num_entries = 0;
255*e4b17023SJohn Marino ivs->max_entries = 5;
256*e4b17023SJohn Marino ivs->entries = ggc_alloc_vec_initial_value_pair (5);
257*e4b17023SJohn Marino crtl->hard_reg_initial_vals = ivs;
258*e4b17023SJohn Marino }
259*e4b17023SJohn Marino
260*e4b17023SJohn Marino if (ivs->num_entries >= ivs->max_entries)
261*e4b17023SJohn Marino {
262*e4b17023SJohn Marino ivs->max_entries += 5;
263*e4b17023SJohn Marino ivs->entries = GGC_RESIZEVEC (initial_value_pair, ivs->entries,
264*e4b17023SJohn Marino ivs->max_entries);
265*e4b17023SJohn Marino }
266*e4b17023SJohn Marino
267*e4b17023SJohn Marino ivs->entries[ivs->num_entries].hard_reg = gen_rtx_REG (mode, regno);
268*e4b17023SJohn Marino ivs->entries[ivs->num_entries].pseudo = gen_reg_rtx (mode);
269*e4b17023SJohn Marino
270*e4b17023SJohn Marino return ivs->entries[ivs->num_entries++].pseudo;
271*e4b17023SJohn Marino }
272*e4b17023SJohn Marino
273*e4b17023SJohn Marino /* See if get_hard_reg_initial_val has been used to create a pseudo
274*e4b17023SJohn Marino for the initial value of hard register REGNO in mode MODE. Return
275*e4b17023SJohn Marino the associated pseudo if so, otherwise return NULL. */
276*e4b17023SJohn Marino
277*e4b17023SJohn Marino rtx
has_hard_reg_initial_val(enum machine_mode mode,unsigned int regno)278*e4b17023SJohn Marino has_hard_reg_initial_val (enum machine_mode mode, unsigned int regno)
279*e4b17023SJohn Marino {
280*e4b17023SJohn Marino struct initial_value_struct *ivs;
281*e4b17023SJohn Marino int i;
282*e4b17023SJohn Marino
283*e4b17023SJohn Marino ivs = crtl->hard_reg_initial_vals;
284*e4b17023SJohn Marino if (ivs != 0)
285*e4b17023SJohn Marino for (i = 0; i < ivs->num_entries; i++)
286*e4b17023SJohn Marino if (GET_MODE (ivs->entries[i].hard_reg) == mode
287*e4b17023SJohn Marino && REGNO (ivs->entries[i].hard_reg) == regno)
288*e4b17023SJohn Marino return ivs->entries[i].pseudo;
289*e4b17023SJohn Marino
290*e4b17023SJohn Marino return NULL_RTX;
291*e4b17023SJohn Marino }
292*e4b17023SJohn Marino
293*e4b17023SJohn Marino unsigned int
emit_initial_value_sets(void)294*e4b17023SJohn Marino emit_initial_value_sets (void)
295*e4b17023SJohn Marino {
296*e4b17023SJohn Marino struct initial_value_struct *ivs = crtl->hard_reg_initial_vals;
297*e4b17023SJohn Marino int i;
298*e4b17023SJohn Marino rtx seq;
299*e4b17023SJohn Marino
300*e4b17023SJohn Marino if (ivs == 0)
301*e4b17023SJohn Marino return 0;
302*e4b17023SJohn Marino
303*e4b17023SJohn Marino start_sequence ();
304*e4b17023SJohn Marino for (i = 0; i < ivs->num_entries; i++)
305*e4b17023SJohn Marino emit_move_insn (ivs->entries[i].pseudo, ivs->entries[i].hard_reg);
306*e4b17023SJohn Marino seq = get_insns ();
307*e4b17023SJohn Marino end_sequence ();
308*e4b17023SJohn Marino
309*e4b17023SJohn Marino emit_insn_at_entry (seq);
310*e4b17023SJohn Marino return 0;
311*e4b17023SJohn Marino }
312*e4b17023SJohn Marino
313*e4b17023SJohn Marino struct rtl_opt_pass pass_initial_value_sets =
314*e4b17023SJohn Marino {
315*e4b17023SJohn Marino {
316*e4b17023SJohn Marino RTL_PASS,
317*e4b17023SJohn Marino "initvals", /* name */
318*e4b17023SJohn Marino NULL, /* gate */
319*e4b17023SJohn Marino emit_initial_value_sets, /* execute */
320*e4b17023SJohn Marino NULL, /* sub */
321*e4b17023SJohn Marino NULL, /* next */
322*e4b17023SJohn Marino 0, /* static_pass_number */
323*e4b17023SJohn Marino TV_NONE, /* tv_id */
324*e4b17023SJohn Marino 0, /* properties_required */
325*e4b17023SJohn Marino 0, /* properties_provided */
326*e4b17023SJohn Marino 0, /* properties_destroyed */
327*e4b17023SJohn Marino 0, /* todo_flags_start */
328*e4b17023SJohn Marino 0 /* todo_flags_finish */
329*e4b17023SJohn Marino }
330*e4b17023SJohn Marino };
331*e4b17023SJohn Marino
332*e4b17023SJohn Marino /* If the backend knows where to allocate pseudos for hard
333*e4b17023SJohn Marino register initial values, register these allocations now. */
334*e4b17023SJohn Marino void
allocate_initial_values(VEC (reg_equivs_t,gc)* reg_equivs)335*e4b17023SJohn Marino allocate_initial_values (VEC (reg_equivs_t, gc) *reg_equivs)
336*e4b17023SJohn Marino {
337*e4b17023SJohn Marino if (targetm.allocate_initial_value)
338*e4b17023SJohn Marino {
339*e4b17023SJohn Marino struct initial_value_struct *ivs = crtl->hard_reg_initial_vals;
340*e4b17023SJohn Marino int i;
341*e4b17023SJohn Marino
342*e4b17023SJohn Marino if (ivs == 0)
343*e4b17023SJohn Marino return;
344*e4b17023SJohn Marino
345*e4b17023SJohn Marino for (i = 0; i < ivs->num_entries; i++)
346*e4b17023SJohn Marino {
347*e4b17023SJohn Marino int regno = REGNO (ivs->entries[i].pseudo);
348*e4b17023SJohn Marino rtx x = targetm.allocate_initial_value (ivs->entries[i].hard_reg);
349*e4b17023SJohn Marino
350*e4b17023SJohn Marino if (x && REG_N_SETS (REGNO (ivs->entries[i].pseudo)) <= 1)
351*e4b17023SJohn Marino {
352*e4b17023SJohn Marino if (MEM_P (x))
353*e4b17023SJohn Marino reg_equiv_memory_loc (regno) = x;
354*e4b17023SJohn Marino else
355*e4b17023SJohn Marino {
356*e4b17023SJohn Marino basic_block bb;
357*e4b17023SJohn Marino int new_regno;
358*e4b17023SJohn Marino
359*e4b17023SJohn Marino gcc_assert (REG_P (x));
360*e4b17023SJohn Marino new_regno = REGNO (x);
361*e4b17023SJohn Marino reg_renumber[regno] = new_regno;
362*e4b17023SJohn Marino /* Poke the regno right into regno_reg_rtx so that even
363*e4b17023SJohn Marino fixed regs are accepted. */
364*e4b17023SJohn Marino SET_REGNO (ivs->entries[i].pseudo, new_regno);
365*e4b17023SJohn Marino /* Update global register liveness information. */
366*e4b17023SJohn Marino FOR_EACH_BB (bb)
367*e4b17023SJohn Marino {
368*e4b17023SJohn Marino if (REGNO_REG_SET_P(df_get_live_in (bb), regno))
369*e4b17023SJohn Marino SET_REGNO_REG_SET (df_get_live_in (bb), new_regno);
370*e4b17023SJohn Marino if (REGNO_REG_SET_P(df_get_live_out (bb), regno))
371*e4b17023SJohn Marino SET_REGNO_REG_SET (df_get_live_out (bb), new_regno);
372*e4b17023SJohn Marino }
373*e4b17023SJohn Marino }
374*e4b17023SJohn Marino }
375*e4b17023SJohn Marino }
376*e4b17023SJohn Marino }
377*e4b17023SJohn Marino }
378*e4b17023SJohn Marino
379*e4b17023SJohn Marino #include "gt-integrate.h"
380