xref: /dflybsd-src/contrib/gcc-4.7/gcc/integrate.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
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