xref: /dflybsd-src/contrib/gcc-8.0/gcc/ipa-ref.c (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* Interprocedural reference lists.
2*38fd1498Szrj    Copyright (C) 2010-2018 Free Software Foundation, Inc.
3*38fd1498Szrj    Contributed by Jan Hubicka
4*38fd1498Szrj 
5*38fd1498Szrj This file is part of GCC.
6*38fd1498Szrj 
7*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
8*38fd1498Szrj the terms of the GNU General Public License as published by the Free
9*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
10*38fd1498Szrj version.
11*38fd1498Szrj 
12*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
14*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15*38fd1498Szrj for more details.
16*38fd1498Szrj 
17*38fd1498Szrj You should have received a copy of the GNU General Public License
18*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
19*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
20*38fd1498Szrj 
21*38fd1498Szrj #include "config.h"
22*38fd1498Szrj #include "system.h"
23*38fd1498Szrj #include "coretypes.h"
24*38fd1498Szrj #include "target.h"
25*38fd1498Szrj #include "tree.h"
26*38fd1498Szrj #include "cgraph.h"
27*38fd1498Szrj 
28*38fd1498Szrj /* Remove reference.  */
29*38fd1498Szrj 
30*38fd1498Szrj void
remove_reference()31*38fd1498Szrj ipa_ref::remove_reference ()
32*38fd1498Szrj {
33*38fd1498Szrj   struct ipa_ref_list *list = referred_ref_list ();
34*38fd1498Szrj   struct ipa_ref_list *list2 = referring_ref_list ();
35*38fd1498Szrj   vec<ipa_ref_t, va_gc> *old_references = list2->references;
36*38fd1498Szrj   struct ipa_ref *last;
37*38fd1498Szrj 
38*38fd1498Szrj   gcc_assert (list->referring[referred_index] == this);
39*38fd1498Szrj 
40*38fd1498Szrj   last = list->referring.last ();
41*38fd1498Szrj   if (this != last)
42*38fd1498Szrj     {
43*38fd1498Szrj       if (use == IPA_REF_ALIAS)
44*38fd1498Szrj         {
45*38fd1498Szrj 	  /* If deleted item is IPA_REF_ALIAS, we have to move last
46*38fd1498Szrj 	  item of IPA_REF_LIST type to the deleted position. After that
47*38fd1498Szrj 	  we replace last node with deletion slot.  */
48*38fd1498Szrj 	  struct ipa_ref *last_alias = list->last_alias ();
49*38fd1498Szrj 
50*38fd1498Szrj 	  if (last_alias && referred_index < last_alias->referred_index
51*38fd1498Szrj 	      && last_alias != last)
52*38fd1498Szrj 	  {
53*38fd1498Szrj 	    unsigned last_alias_index = last_alias->referred_index;
54*38fd1498Szrj 
55*38fd1498Szrj 	    list->referring[referred_index] = last_alias;
56*38fd1498Szrj 	    list->referring[referred_index]->referred_index = referred_index;
57*38fd1498Szrj 
58*38fd1498Szrj 	    /* New position for replacement is previous index
59*38fd1498Szrj 	       of the last_alias.  */
60*38fd1498Szrj 	    referred_index = last_alias_index;
61*38fd1498Szrj 	  }
62*38fd1498Szrj 	}
63*38fd1498Szrj 
64*38fd1498Szrj       list->referring[referred_index] = list->referring.last ();
65*38fd1498Szrj       list->referring[referred_index]->referred_index= referred_index;
66*38fd1498Szrj     }
67*38fd1498Szrj   list->referring.pop ();
68*38fd1498Szrj 
69*38fd1498Szrj   last = &list2->references->last ();
70*38fd1498Szrj 
71*38fd1498Szrj   struct ipa_ref *ref = this;
72*38fd1498Szrj 
73*38fd1498Szrj   if (ref != last)
74*38fd1498Szrj     {
75*38fd1498Szrj       *ref = *last;
76*38fd1498Szrj       ref->referred_ref_list ()->referring[referred_index] = ref;
77*38fd1498Szrj     }
78*38fd1498Szrj   list2->references->pop ();
79*38fd1498Szrj   gcc_assert (list2->references == old_references);
80*38fd1498Szrj }
81*38fd1498Szrj 
82*38fd1498Szrj /* Return true when execution of reference can lead to return from
83*38fd1498Szrj    function.  */
84*38fd1498Szrj 
85*38fd1498Szrj bool
cannot_lead_to_return()86*38fd1498Szrj ipa_ref::cannot_lead_to_return ()
87*38fd1498Szrj {
88*38fd1498Szrj   return dyn_cast <cgraph_node *> (referring)->cannot_return_p ();
89*38fd1498Szrj }
90*38fd1498Szrj 
91*38fd1498Szrj /* Return reference list this reference is in.  */
92*38fd1498Szrj 
93*38fd1498Szrj struct ipa_ref_list *
referring_ref_list(void)94*38fd1498Szrj ipa_ref::referring_ref_list (void)
95*38fd1498Szrj {
96*38fd1498Szrj   return &referring->ref_list;
97*38fd1498Szrj }
98*38fd1498Szrj 
99*38fd1498Szrj /* Return reference list this reference is in.  */
100*38fd1498Szrj 
101*38fd1498Szrj struct ipa_ref_list *
referred_ref_list(void)102*38fd1498Szrj ipa_ref::referred_ref_list (void)
103*38fd1498Szrj {
104*38fd1498Szrj   return &referred->ref_list;
105*38fd1498Szrj }
106