1 /* IRA hard register and memory cost calculation for allocnos or pseudos.
2    Copyright (C) 2006-2022 Free Software Foundation, Inc.
3    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "target.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "predict.h"
29 #include "memmodel.h"
30 #include "tm_p.h"
31 #include "insn-config.h"
32 #include "regs.h"
33 #include "ira.h"
34 #include "ira-int.h"
35 #include "addresses.h"
36 #include "reload.h"
37 #include "print-rtl.h"
38 
39 /* The flags is set up every time when we calculate pseudo register
40    classes through function ira_set_pseudo_classes.  */
41 static bool pseudo_classes_defined_p = false;
42 
43 /* TRUE if we work with allocnos.  Otherwise we work with pseudos.  */
44 static bool allocno_p;
45 
46 /* Number of elements in array `costs'.  */
47 static int cost_elements_num;
48 
49 /* The `costs' struct records the cost of using hard registers of each
50    class considered for the calculation and of using memory for each
51    allocno or pseudo.  */
52 struct costs
53 {
54   int mem_cost;
55   /* Costs for register classes start here.  We process only some
56      allocno classes.  */
57   int cost[1];
58 };
59 
60 #define max_struct_costs_size \
61   (this_target_ira_int->x_max_struct_costs_size)
62 #define init_cost \
63   (this_target_ira_int->x_init_cost)
64 #define temp_costs \
65   (this_target_ira_int->x_temp_costs)
66 #define op_costs \
67   (this_target_ira_int->x_op_costs)
68 #define this_op_costs \
69   (this_target_ira_int->x_this_op_costs)
70 
71 /* Costs of each class for each allocno or pseudo.  */
72 static struct costs *costs;
73 
74 /* Accumulated costs of each class for each allocno.  */
75 static struct costs *total_allocno_costs;
76 
77 /* It is the current size of struct costs.  */
78 static size_t struct_costs_size;
79 
80 /* Return pointer to structure containing costs of allocno or pseudo
81    with given NUM in array ARR.  */
82 #define COSTS(arr, num) \
83   ((struct costs *) ((char *) (arr) + (num) * struct_costs_size))
84 
85 /* Return index in COSTS when processing reg with REGNO.  */
86 #define COST_INDEX(regno) (allocno_p                                                 \
87                            ? ALLOCNO_NUM (ira_curr_regno_allocno_map[regno]) \
88                                  : (int) regno)
89 
90 /* Record register class preferences of each allocno or pseudo.  Null
91    value means no preferences.  It happens on the 1st iteration of the
92    cost calculation.  */
93 static enum reg_class *pref;
94 
95 /* Allocated buffers for pref.  */
96 static enum reg_class *pref_buffer;
97 
98 /* Record allocno class of each allocno with the same regno.  */
99 static enum reg_class *regno_aclass;
100 
101 /* Record cost gains for not allocating a register with an invariant
102    equivalence.  */
103 static int *regno_equiv_gains;
104 
105 /* Execution frequency of the current insn.  */
106 static int frequency;
107 
108 
109 
110 /* Info about reg classes whose costs are calculated for a pseudo.  */
111 struct cost_classes
112 {
113   /* Number of the cost classes in the subsequent array.  */
114   int num;
115   /* Container of the cost classes.  */
116   enum reg_class classes[N_REG_CLASSES];
117   /* Map reg class -> index of the reg class in the previous array.
118      -1 if it is not a cost class.  */
119   int index[N_REG_CLASSES];
120   /* Map hard regno index of first class in array CLASSES containing
121      the hard regno, -1 otherwise.  */
122   int hard_regno_index[FIRST_PSEUDO_REGISTER];
123 };
124 
125 /* Types of pointers to the structure above.  */
126 typedef struct cost_classes *cost_classes_t;
127 typedef const struct cost_classes *const_cost_classes_t;
128 
129 /* Info about cost classes for each pseudo.  */
130 static cost_classes_t *regno_cost_classes;
131 
132 /* Helper for cost_classes hashing.  */
133 
134 struct cost_classes_hasher : pointer_hash <cost_classes>
135 {
136   static inline hashval_t hash (const cost_classes *);
137   static inline bool equal (const cost_classes *, const cost_classes *);
138   static inline void remove (cost_classes *);
139 };
140 
141 /* Returns hash value for cost classes info HV.  */
142 inline hashval_t
hash(const cost_classes * hv)143 cost_classes_hasher::hash (const cost_classes *hv)
144 {
145   return iterative_hash (&hv->classes, sizeof (enum reg_class) * hv->num, 0);
146 }
147 
148 /* Compares cost classes info HV1 and HV2.  */
149 inline bool
equal(const cost_classes * hv1,const cost_classes * hv2)150 cost_classes_hasher::equal (const cost_classes *hv1, const cost_classes *hv2)
151 {
152   return (hv1->num == hv2->num
153             && memcmp (hv1->classes, hv2->classes,
154                          sizeof (enum reg_class) * hv1->num) == 0);
155 }
156 
157 /* Delete cost classes info V from the hash table.  */
158 inline void
remove(cost_classes * v)159 cost_classes_hasher::remove (cost_classes *v)
160 {
161   ira_free (v);
162 }
163 
164 /* Hash table of unique cost classes.  */
165 static hash_table<cost_classes_hasher> *cost_classes_htab;
166 
167 /* Map allocno class -> cost classes for pseudo of given allocno
168    class.  */
169 static cost_classes_t cost_classes_aclass_cache[N_REG_CLASSES];
170 
171 /* Map mode -> cost classes for pseudo of give mode.  */
172 static cost_classes_t cost_classes_mode_cache[MAX_MACHINE_MODE];
173 
174 /* Cost classes that include all classes in ira_important_classes.  */
175 static cost_classes all_cost_classes;
176 
177 /* Use the array of classes in CLASSES_PTR to fill out the rest of
178    the structure.  */
179 static void
complete_cost_classes(cost_classes_t classes_ptr)180 complete_cost_classes (cost_classes_t classes_ptr)
181 {
182   for (int i = 0; i < N_REG_CLASSES; i++)
183     classes_ptr->index[i] = -1;
184   for (int i = 0; i < FIRST_PSEUDO_REGISTER; i++)
185     classes_ptr->hard_regno_index[i] = -1;
186   for (int i = 0; i < classes_ptr->num; i++)
187     {
188       enum reg_class cl = classes_ptr->classes[i];
189       classes_ptr->index[cl] = i;
190       for (int j = ira_class_hard_regs_num[cl] - 1; j >= 0; j--)
191           {
192             unsigned int hard_regno = ira_class_hard_regs[cl][j];
193             if (classes_ptr->hard_regno_index[hard_regno] < 0)
194               classes_ptr->hard_regno_index[hard_regno] = i;
195           }
196     }
197 }
198 
199 /* Initialize info about the cost classes for each pseudo.  */
200 static void
initiate_regno_cost_classes(void)201 initiate_regno_cost_classes (void)
202 {
203   int size = sizeof (cost_classes_t) * max_reg_num ();
204 
205   regno_cost_classes = (cost_classes_t *) ira_allocate (size);
206   memset (regno_cost_classes, 0, size);
207   memset (cost_classes_aclass_cache, 0,
208             sizeof (cost_classes_t) * N_REG_CLASSES);
209   memset (cost_classes_mode_cache, 0,
210             sizeof (cost_classes_t) * MAX_MACHINE_MODE);
211   cost_classes_htab = new hash_table<cost_classes_hasher> (200);
212   all_cost_classes.num = ira_important_classes_num;
213   for (int i = 0; i < ira_important_classes_num; i++)
214     all_cost_classes.classes[i] = ira_important_classes[i];
215   complete_cost_classes (&all_cost_classes);
216 }
217 
218 /* Create new cost classes from cost classes FROM and set up members
219    index and hard_regno_index.  Return the new classes.  The function
220    implements some common code of two functions
221    setup_regno_cost_classes_by_aclass and
222    setup_regno_cost_classes_by_mode.  */
223 static cost_classes_t
setup_cost_classes(cost_classes_t from)224 setup_cost_classes (cost_classes_t from)
225 {
226   cost_classes_t classes_ptr;
227 
228   classes_ptr = (cost_classes_t) ira_allocate (sizeof (struct cost_classes));
229   classes_ptr->num = from->num;
230   for (int i = 0; i < from->num; i++)
231     classes_ptr->classes[i] = from->classes[i];
232   complete_cost_classes (classes_ptr);
233   return classes_ptr;
234 }
235 
236 /* Return a version of FULL that only considers registers in REGS that are
237    valid for mode MODE.  Both FULL and the returned class are globally
238    allocated.  */
239 static cost_classes_t
restrict_cost_classes(cost_classes_t full,machine_mode mode,const_hard_reg_set regs)240 restrict_cost_classes (cost_classes_t full, machine_mode mode,
241                            const_hard_reg_set regs)
242 {
243   static struct cost_classes narrow;
244   int map[N_REG_CLASSES];
245   narrow.num = 0;
246   for (int i = 0; i < full->num; i++)
247     {
248       /* Assume that we'll drop the class.  */
249       map[i] = -1;
250 
251       /* Ignore classes that are too small for the mode.  */
252       enum reg_class cl = full->classes[i];
253       if (!contains_reg_of_mode[cl][mode])
254           continue;
255 
256       /* Calculate the set of registers in CL that belong to REGS and
257            are valid for MODE.  */
258       HARD_REG_SET valid_for_cl = reg_class_contents[cl] & regs;
259       valid_for_cl &= ~(ira_prohibited_class_mode_regs[cl][mode]
260                               | ira_no_alloc_regs);
261       if (hard_reg_set_empty_p (valid_for_cl))
262           continue;
263 
264       /* Don't use this class if the set of valid registers is a subset
265            of an existing class.  For example, suppose we have two classes
266            GR_REGS and FR_REGS and a union class GR_AND_FR_REGS.  Suppose
267            that the mode changes allowed by FR_REGS are not as general as
268            the mode changes allowed by GR_REGS.
269 
270            In this situation, the mode changes for GR_AND_FR_REGS could
271            either be seen as the union or the intersection of the mode
272            changes allowed by the two subclasses.  The justification for
273            the union-based definition would be that, if you want a mode
274            change that's only allowed by GR_REGS, you can pick a register
275            from the GR_REGS subclass.  The justification for the
276            intersection-based definition would be that every register
277            from the class would allow the mode change.
278 
279            However, if we have a register that needs to be in GR_REGS,
280            using GR_AND_FR_REGS with the intersection-based definition
281            would be too pessimistic, since it would bring in restrictions
282            that only apply to FR_REGS.  Conversely, if we have a register
283            that needs to be in FR_REGS, using GR_AND_FR_REGS with the
284            union-based definition would lose the extra restrictions
285            placed on FR_REGS.  GR_AND_FR_REGS is therefore only useful
286            for cases where GR_REGS and FP_REGS are both valid.  */
287       int pos;
288       for (pos = 0; pos < narrow.num; ++pos)
289           {
290             enum reg_class cl2 = narrow.classes[pos];
291             if (hard_reg_set_subset_p (valid_for_cl, reg_class_contents[cl2]))
292               break;
293           }
294       map[i] = pos;
295       if (pos == narrow.num)
296           {
297             /* If several classes are equivalent, prefer to use the one
298                that was chosen as the allocno class.  */
299             enum reg_class cl2 = ira_allocno_class_translate[cl];
300             if (ira_class_hard_regs_num[cl] == ira_class_hard_regs_num[cl2])
301               cl = cl2;
302             narrow.classes[narrow.num++] = cl;
303           }
304     }
305   if (narrow.num == full->num)
306     return full;
307 
308   cost_classes **slot = cost_classes_htab->find_slot (&narrow, INSERT);
309   if (*slot == NULL)
310     {
311       cost_classes_t classes = setup_cost_classes (&narrow);
312       /* Map equivalent classes to the representative that we chose above.  */
313       for (int i = 0; i < ira_important_classes_num; i++)
314           {
315             enum reg_class cl = ira_important_classes[i];
316             int index = full->index[cl];
317             if (index >= 0)
318               classes->index[cl] = map[index];
319           }
320       *slot = classes;
321     }
322   return *slot;
323 }
324 
325 /* Setup cost classes for pseudo REGNO whose allocno class is ACLASS.
326    This function is used when we know an initial approximation of
327    allocno class of the pseudo already, e.g. on the second iteration
328    of class cost calculation or after class cost calculation in
329    register-pressure sensitive insn scheduling or register-pressure
330    sensitive loop-invariant motion.  */
331 static void
setup_regno_cost_classes_by_aclass(int regno,enum reg_class aclass)332 setup_regno_cost_classes_by_aclass (int regno, enum reg_class aclass)
333 {
334   static struct cost_classes classes;
335   cost_classes_t classes_ptr;
336   enum reg_class cl;
337   int i;
338   cost_classes **slot;
339   HARD_REG_SET temp, temp2;
340   bool exclude_p;
341 
342   if ((classes_ptr = cost_classes_aclass_cache[aclass]) == NULL)
343     {
344       temp = reg_class_contents[aclass] & ~ira_no_alloc_regs;
345       /* We exclude classes from consideration which are subsets of
346            ACLASS only if ACLASS is an uniform class.  */
347       exclude_p = ira_uniform_class_p[aclass];
348       classes.num = 0;
349       for (i = 0; i < ira_important_classes_num; i++)
350           {
351             cl = ira_important_classes[i];
352             if (exclude_p)
353               {
354                 /* Exclude non-uniform classes which are subsets of
355                      ACLASS.  */
356                 temp2 = reg_class_contents[cl] & ~ira_no_alloc_regs;
357                 if (hard_reg_set_subset_p (temp2, temp) && cl != aclass)
358                     continue;
359               }
360             classes.classes[classes.num++] = cl;
361           }
362       slot = cost_classes_htab->find_slot (&classes, INSERT);
363       if (*slot == NULL)
364           {
365             classes_ptr = setup_cost_classes (&classes);
366             *slot = classes_ptr;
367           }
368       classes_ptr = cost_classes_aclass_cache[aclass] = (cost_classes_t) *slot;
369     }
370   if (regno_reg_rtx[regno] != NULL_RTX)
371     {
372       /* Restrict the classes to those that are valid for REGNO's mode
373            (which might for example exclude singleton classes if the mode
374            requires two registers).  Also restrict the classes to those that
375            are valid for subregs of REGNO.  */
376       const HARD_REG_SET *valid_regs = valid_mode_changes_for_regno (regno);
377       if (!valid_regs)
378           valid_regs = &reg_class_contents[ALL_REGS];
379       classes_ptr = restrict_cost_classes (classes_ptr,
380                                                      PSEUDO_REGNO_MODE (regno),
381                                                      *valid_regs);
382     }
383   regno_cost_classes[regno] = classes_ptr;
384 }
385 
386 /* Setup cost classes for pseudo REGNO with MODE.  Usage of MODE can
387    decrease number of cost classes for the pseudo, if hard registers
388    of some important classes cannot hold a value of MODE.  So the
389    pseudo cannot get hard register of some important classes and cost
390    calculation for such important classes is only wasting CPU
391    time.  */
392 static void
setup_regno_cost_classes_by_mode(int regno,machine_mode mode)393 setup_regno_cost_classes_by_mode (int regno, machine_mode mode)
394 {
395   if (const HARD_REG_SET *valid_regs = valid_mode_changes_for_regno (regno))
396     regno_cost_classes[regno] = restrict_cost_classes (&all_cost_classes,
397                                                                    mode, *valid_regs);
398   else
399     {
400       if (cost_classes_mode_cache[mode] == NULL)
401           cost_classes_mode_cache[mode]
402             = restrict_cost_classes (&all_cost_classes, mode,
403                                            reg_class_contents[ALL_REGS]);
404       regno_cost_classes[regno] = cost_classes_mode_cache[mode];
405     }
406 }
407 
408 /* Finalize info about the cost classes for each pseudo.  */
409 static void
finish_regno_cost_classes(void)410 finish_regno_cost_classes (void)
411 {
412   ira_free (regno_cost_classes);
413   delete cost_classes_htab;
414   cost_classes_htab = NULL;
415 }
416 
417 
418 
419 /* Compute the cost of loading X into (if TO_P is TRUE) or from (if
420    TO_P is FALSE) a register of class RCLASS in mode MODE.  X must not
421    be a pseudo register.  */
422 static int
copy_cost(rtx x,machine_mode mode,reg_class_t rclass,bool to_p,secondary_reload_info * prev_sri)423 copy_cost (rtx x, machine_mode mode, reg_class_t rclass, bool to_p,
424              secondary_reload_info *prev_sri)
425 {
426   secondary_reload_info sri;
427   reg_class_t secondary_class = NO_REGS;
428 
429   /* If X is a SCRATCH, there is actually nothing to move since we are
430      assuming optimal allocation.  */
431   if (GET_CODE (x) == SCRATCH)
432     return 0;
433 
434   /* Get the class we will actually use for a reload.  */
435   rclass = targetm.preferred_reload_class (x, rclass);
436 
437   /* If we need a secondary reload for an intermediate, the cost is
438      that to load the input into the intermediate register, then to
439      copy it.  */
440   sri.prev_sri = prev_sri;
441   sri.extra_cost = 0;
442   /* PR 68770: Secondary reload might examine the t_icode field.  */
443   sri.t_icode = CODE_FOR_nothing;
444 
445   secondary_class = targetm.secondary_reload (to_p, x, rclass, mode, &sri);
446 
447   if (secondary_class != NO_REGS)
448     {
449       ira_init_register_move_cost_if_necessary (mode);
450       return (ira_register_move_cost[mode][(int) secondary_class][(int) rclass]
451                 + sri.extra_cost
452                 + copy_cost (x, mode, secondary_class, to_p, &sri));
453     }
454 
455   /* For memory, use the memory move cost, for (hard) registers, use
456      the cost to move between the register classes, and use 2 for
457      everything else (constants).  */
458   if (MEM_P (x) || rclass == NO_REGS)
459     return sri.extra_cost
460              + ira_memory_move_cost[mode][(int) rclass][to_p != 0];
461   else if (REG_P (x))
462     {
463       reg_class_t x_class = REGNO_REG_CLASS (REGNO (x));
464 
465       ira_init_register_move_cost_if_necessary (mode);
466       return (sri.extra_cost
467                 + ira_register_move_cost[mode][(int) x_class][(int) rclass]);
468     }
469   else
470     /* If this is a constant, we may eventually want to call rtx_cost
471        here.  */
472     return sri.extra_cost + COSTS_N_INSNS (1);
473 }
474 
475 
476 
477 /* Record the cost of using memory or hard registers of various
478    classes for the operands in INSN.
479 
480    N_ALTS is the number of alternatives.
481    N_OPS is the number of operands.
482    OPS is an array of the operands.
483    MODES are the modes of the operands, in case any are VOIDmode.
484    CONSTRAINTS are the constraints to use for the operands.  This array
485    is modified by this procedure.
486 
487    This procedure works alternative by alternative.  For each
488    alternative we assume that we will be able to allocate all allocnos
489    to their ideal register class and calculate the cost of using that
490    alternative.  Then we compute, for each operand that is a
491    pseudo-register, the cost of having the allocno allocated to each
492    register class and using it in that alternative.  To this cost is
493    added the cost of the alternative.
494 
495    The cost of each class for this insn is its lowest cost among all
496    the alternatives.  */
497 static void
record_reg_classes(int n_alts,int n_ops,rtx * ops,machine_mode * modes,const char ** constraints,rtx_insn * insn,enum reg_class * pref)498 record_reg_classes (int n_alts, int n_ops, rtx *ops,
499                         machine_mode *modes, const char **constraints,
500                         rtx_insn *insn, enum reg_class *pref)
501 {
502   int alt;
503   int i, j, k;
504   int insn_allows_mem[MAX_RECOG_OPERANDS];
505   move_table *move_in_cost, *move_out_cost;
506   short (*mem_cost)[2];
507   const char *p;
508 
509   if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
510     {
511       fprintf (ira_dump_file, "    Processing insn %u", INSN_UID (insn));
512       if (INSN_CODE (insn) >= 0
513             && (p = get_insn_name (INSN_CODE (insn))) != NULL)
514           fprintf (ira_dump_file, " {%s}", p);
515       fprintf (ira_dump_file, " (freq=%d)\n",
516                  REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn)));
517       dump_insn_slim (ira_dump_file, insn);
518   }
519 
520   for (i = 0; i < n_ops; i++)
521     insn_allows_mem[i] = 0;
522 
523   /* Process each alternative, each time minimizing an operand's cost
524      with the cost for each operand in that alternative.  */
525   alternative_mask preferred = get_preferred_alternatives (insn);
526   for (alt = 0; alt < n_alts; alt++)
527     {
528       enum reg_class classes[MAX_RECOG_OPERANDS];
529       int allows_mem[MAX_RECOG_OPERANDS];
530       enum reg_class rclass;
531       int alt_fail = 0;
532       int alt_cost = 0, op_cost_add;
533 
534       if (!TEST_BIT (preferred, alt))
535           {
536             for (i = 0; i < recog_data.n_operands; i++)
537               constraints[i] = skip_alternative (constraints[i]);
538 
539             continue;
540           }
541 
542       if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
543           {
544             fprintf (ira_dump_file, "      Alt %d:", alt);
545             for (i = 0; i < n_ops; i++)
546               {
547                 p = constraints[i];
548                 if (*p == '\0')
549                     continue;
550                 fprintf (ira_dump_file, "  (%d) ", i);
551                 for (; *p != '\0' && *p != ',' && *p != '#'; p++)
552                     fputc (*p, ira_dump_file);
553               }
554             fprintf (ira_dump_file, "\n");
555           }
556 
557       for (i = 0; i < n_ops; i++)
558           {
559             unsigned char c;
560             const char *p = constraints[i];
561             rtx op = ops[i];
562             machine_mode mode = modes[i];
563             int allows_addr = 0;
564             int win = 0;
565 
566             /* Initially show we know nothing about the register class.  */
567             classes[i] = NO_REGS;
568             allows_mem[i] = 0;
569 
570             /* If this operand has no constraints at all, we can
571                conclude nothing about it since anything is valid.  */
572             if (*p == 0)
573               {
574                 if (REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER)
575                     memset (this_op_costs[i], 0, struct_costs_size);
576                 continue;
577               }
578 
579             /* If this alternative is only relevant when this operand
580                matches a previous operand, we do different things
581                depending on whether this operand is a allocno-reg or not.
582                We must process any modifiers for the operand before we
583                can make this test.  */
584             while (*p == '%' || *p == '=' || *p == '+' || *p == '&')
585               p++;
586 
587             if (p[0] >= '0' && p[0] <= '0' + i)
588               {
589                 /* Copy class and whether memory is allowed from the
590                      matching alternative.  Then perform any needed cost
591                      computations and/or adjustments.  */
592                 j = p[0] - '0';
593                 classes[i] = classes[j];
594                 allows_mem[i] = allows_mem[j];
595                 if (allows_mem[i])
596                     insn_allows_mem[i] = 1;
597 
598                 if (! REG_P (op) || REGNO (op) < FIRST_PSEUDO_REGISTER)
599                     {
600                       /* If this matches the other operand, we have no
601                          added cost and we win.  */
602                       if (rtx_equal_p (ops[j], op))
603                         win = 1;
604                       /* If we can put the other operand into a register,
605                          add to the cost of this alternative the cost to
606                          copy this operand to the register used for the
607                          other operand.  */
608                       else if (classes[j] != NO_REGS)
609                         {
610                           alt_cost += copy_cost (op, mode, classes[j], 1, NULL);
611                           win = 1;
612                         }
613                     }
614                 else if (! REG_P (ops[j])
615                            || REGNO (ops[j]) < FIRST_PSEUDO_REGISTER)
616                     {
617                       /* This op is an allocno but the one it matches is
618                          not.  */
619 
620                       /* If we can't put the other operand into a
621                          register, this alternative can't be used.  */
622 
623                       if (classes[j] == NO_REGS)
624                         {
625                           alt_fail = 1;
626                         }
627                       else
628                         /* Otherwise, add to the cost of this alternative the cost
629                            to copy the other operand to the hard register used for
630                            this operand.  */
631                         {
632                           alt_cost += copy_cost (ops[j], mode, classes[j], 1, NULL);
633                         }
634                     }
635                 else
636                     {
637                       /* The costs of this operand are not the same as the
638                          other operand since move costs are not symmetric.
639                          Moreover, if we cannot tie them, this alternative
640                          needs to do a copy, which is one insn.  */
641                       struct costs *pp = this_op_costs[i];
642                       int *pp_costs = pp->cost;
643                       cost_classes_t cost_classes_ptr
644                         = regno_cost_classes[REGNO (op)];
645                       enum reg_class *cost_classes = cost_classes_ptr->classes;
646                       bool in_p = recog_data.operand_type[i] != OP_OUT;
647                       bool out_p = recog_data.operand_type[i] != OP_IN;
648                       enum reg_class op_class = classes[i];
649 
650                       ira_init_register_move_cost_if_necessary (mode);
651                       if (! in_p)
652                         {
653                           ira_assert (out_p);
654                           if (op_class == NO_REGS)
655                               {
656                                 mem_cost = ira_memory_move_cost[mode];
657                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
658                                   {
659                                     rclass = cost_classes[k];
660                                     pp_costs[k] = mem_cost[rclass][0] * frequency;
661                                   }
662                               }
663                           else
664                               {
665                                 move_out_cost = ira_may_move_out_cost[mode];
666                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
667                                   {
668                                     rclass = cost_classes[k];
669                                     pp_costs[k]
670                                         = move_out_cost[op_class][rclass] * frequency;
671                                   }
672                               }
673                         }
674                       else if (! out_p)
675                         {
676                           ira_assert (in_p);
677                           if (op_class == NO_REGS)
678                               {
679                                 mem_cost = ira_memory_move_cost[mode];
680                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
681                                   {
682                                     rclass = cost_classes[k];
683                                     pp_costs[k] = mem_cost[rclass][1] * frequency;
684                                   }
685                               }
686                           else
687                               {
688                                 move_in_cost = ira_may_move_in_cost[mode];
689                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
690                                   {
691                                     rclass = cost_classes[k];
692                                     pp_costs[k]
693                                         = move_in_cost[rclass][op_class] * frequency;
694                                   }
695                               }
696                         }
697                       else
698                         {
699                           if (op_class == NO_REGS)
700                               {
701                                 mem_cost = ira_memory_move_cost[mode];
702                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
703                                   {
704                                     rclass = cost_classes[k];
705                                     pp_costs[k] = ((mem_cost[rclass][0]
706                                                         + mem_cost[rclass][1])
707                                                        * frequency);
708                                   }
709                               }
710                           else
711                               {
712                                 move_in_cost = ira_may_move_in_cost[mode];
713                                 move_out_cost = ira_may_move_out_cost[mode];
714                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
715                                   {
716                                     rclass = cost_classes[k];
717                                     pp_costs[k] = ((move_in_cost[rclass][op_class]
718                                                         + move_out_cost[op_class][rclass])
719                                                        * frequency);
720                                   }
721                               }
722                         }
723 
724                       /* If the alternative actually allows memory, make
725                          things a bit cheaper since we won't need an extra
726                          insn to load it.  */
727                       pp->mem_cost
728                         = ((out_p ? ira_memory_move_cost[mode][op_class][0] : 0)
729                            + (in_p ? ira_memory_move_cost[mode][op_class][1] : 0)
730                            - allows_mem[i]) * frequency;
731 
732                       /* If we have assigned a class to this allocno in
733                          our first pass, add a cost to this alternative
734                          corresponding to what we would add if this
735                          allocno were not in the appropriate class.  */
736                       if (pref)
737                         {
738                           enum reg_class pref_class = pref[COST_INDEX (REGNO (op))];
739 
740                           if (pref_class == NO_REGS)
741                               alt_cost
742                                 += ((out_p
743                                      ? ira_memory_move_cost[mode][op_class][0] : 0)
744                                     + (in_p
745                                          ? ira_memory_move_cost[mode][op_class][1]
746                                          : 0));
747                           else if (ira_reg_class_intersect
748                                      [pref_class][op_class] == NO_REGS)
749                               alt_cost
750                                 += ira_register_move_cost[mode][pref_class][op_class];
751                         }
752                       if (REGNO (ops[i]) != REGNO (ops[j])
753                           && ! find_reg_note (insn, REG_DEAD, op))
754                         alt_cost += 2;
755 
756                       p++;
757                     }
758               }
759 
760             /* Scan all the constraint letters.  See if the operand
761                matches any of the constraints.  Collect the valid
762                register classes and see if this operand accepts
763                memory.  */
764             while ((c = *p))
765               {
766                 switch (c)
767                     {
768                     case '*':
769                       /* Ignore the next letter for this pass.  */
770                       c = *++p;
771                       break;
772 
773                     case '^':
774                       alt_cost += 2;
775                       break;
776 
777                     case '?':
778                       alt_cost += 2;
779                       break;
780 
781                     case 'g':
782                       if (MEM_P (op)
783                           || (CONSTANT_P (op)
784                                 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))))
785                         win = 1;
786                       insn_allows_mem[i] = allows_mem[i] = 1;
787                       classes[i] = ira_reg_class_subunion[classes[i]][GENERAL_REGS];
788                       break;
789 
790                     default:
791                       enum constraint_num cn = lookup_constraint (p);
792                       enum reg_class cl;
793                       switch (get_constraint_type (cn))
794                         {
795                         case CT_REGISTER:
796                           cl = reg_class_for_constraint (cn);
797                           if (cl != NO_REGS)
798                               classes[i] = ira_reg_class_subunion[classes[i]][cl];
799                           break;
800 
801                         case CT_CONST_INT:
802                           if (CONST_INT_P (op)
803                                 && insn_const_int_ok_for_constraint (INTVAL (op), cn))
804                               win = 1;
805                           break;
806 
807                         case CT_MEMORY:
808                         case CT_RELAXED_MEMORY:
809                           /* Every MEM can be reloaded to fit.  */
810                           insn_allows_mem[i] = allows_mem[i] = 1;
811                           if (MEM_P (op))
812                               win = 1;
813                           break;
814 
815                         case CT_SPECIAL_MEMORY:
816                           insn_allows_mem[i] = allows_mem[i] = 1;
817                           if (MEM_P (extract_mem_from_operand (op))
818                                 && constraint_satisfied_p (op, cn))
819                               win = 1;
820                           break;
821 
822                         case CT_ADDRESS:
823                           /* Every address can be reloaded to fit.  */
824                           allows_addr = 1;
825                           if (address_operand (op, GET_MODE (op))
826                                 || constraint_satisfied_p (op, cn))
827                               win = 1;
828                           /* We know this operand is an address, so we
829                                want it to be allocated to a hard register
830                                that can be the base of an address,
831                                i.e. BASE_REG_CLASS.  */
832                           classes[i]
833                               = ira_reg_class_subunion[classes[i]]
834                                 [base_reg_class (VOIDmode, ADDR_SPACE_GENERIC,
835                                                      ADDRESS, SCRATCH)];
836                           break;
837 
838                         case CT_FIXED_FORM:
839                           if (constraint_satisfied_p (op, cn))
840                               win = 1;
841                           break;
842                         }
843                       break;
844                     }
845                 p += CONSTRAINT_LEN (c, p);
846                 if (c == ',')
847                     break;
848               }
849 
850             constraints[i] = p;
851 
852             if (alt_fail)
853               break;
854 
855             /* How we account for this operand now depends on whether it
856                is a pseudo register or not.  If it is, we first check if
857                any register classes are valid.  If not, we ignore this
858                alternative, since we want to assume that all allocnos get
859                allocated for register preferencing.  If some register
860                class is valid, compute the costs of moving the allocno
861                into that class.  */
862             if (REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER)
863               {
864                 if (classes[i] == NO_REGS && ! allows_mem[i])
865                     {
866                       /* We must always fail if the operand is a REG, but
867                          we did not find a suitable class and memory is
868                          not allowed.
869 
870                          Otherwise we may perform an uninitialized read
871                          from this_op_costs after the `continue' statement
872                          below.  */
873                       alt_fail = 1;
874                     }
875                 else
876                     {
877                       unsigned int regno = REGNO (op);
878                       struct costs *pp = this_op_costs[i];
879                       int *pp_costs = pp->cost;
880                       cost_classes_t cost_classes_ptr = regno_cost_classes[regno];
881                       enum reg_class *cost_classes = cost_classes_ptr->classes;
882                       bool in_p = recog_data.operand_type[i] != OP_OUT;
883                       bool out_p = recog_data.operand_type[i] != OP_IN;
884                       enum reg_class op_class = classes[i];
885 
886                       ira_init_register_move_cost_if_necessary (mode);
887                       if (! in_p)
888                         {
889                           ira_assert (out_p);
890                           if (op_class == NO_REGS)
891                               {
892                                 mem_cost = ira_memory_move_cost[mode];
893                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
894                                   {
895                                     rclass = cost_classes[k];
896                                     pp_costs[k] = mem_cost[rclass][0] * frequency;
897                                   }
898                               }
899                           else
900                               {
901                                 move_out_cost = ira_may_move_out_cost[mode];
902                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
903                                   {
904                                     rclass = cost_classes[k];
905                                     pp_costs[k]
906                                         = move_out_cost[op_class][rclass] * frequency;
907                                   }
908                               }
909                         }
910                       else if (! out_p)
911                         {
912                           ira_assert (in_p);
913                           if (op_class == NO_REGS)
914                               {
915                                 mem_cost = ira_memory_move_cost[mode];
916                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
917                                   {
918                                     rclass = cost_classes[k];
919                                     pp_costs[k] = mem_cost[rclass][1] * frequency;
920                                   }
921                               }
922                           else
923                               {
924                                 move_in_cost = ira_may_move_in_cost[mode];
925                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
926                                   {
927                                     rclass = cost_classes[k];
928                                     pp_costs[k]
929                                         = move_in_cost[rclass][op_class] * frequency;
930                                   }
931                               }
932                         }
933                       else
934                         {
935                           if (op_class == NO_REGS)
936                               {
937                                 mem_cost = ira_memory_move_cost[mode];
938                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
939                                   {
940                                     rclass = cost_classes[k];
941                                     pp_costs[k] = ((mem_cost[rclass][0]
942                                                         + mem_cost[rclass][1])
943                                                        * frequency);
944                                   }
945                               }
946                           else
947                               {
948                                 move_in_cost = ira_may_move_in_cost[mode];
949                                 move_out_cost = ira_may_move_out_cost[mode];
950                                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
951                                   {
952                                     rclass = cost_classes[k];
953                                     pp_costs[k] = ((move_in_cost[rclass][op_class]
954                                                         + move_out_cost[op_class][rclass])
955                                                        * frequency);
956                                   }
957                               }
958                         }
959 
960                       if (op_class == NO_REGS)
961                         /* Although we don't need insn to reload from
962                            memory, still accessing memory is usually more
963                            expensive than a register.  */
964                         pp->mem_cost = frequency;
965                       else
966                         /* If the alternative actually allows memory, make
967                            things a bit cheaper since we won't need an
968                            extra insn to load it.  */
969                         pp->mem_cost
970                           = ((out_p ? ira_memory_move_cost[mode][op_class][0] : 0)
971                                + (in_p ? ira_memory_move_cost[mode][op_class][1] : 0)
972                                - allows_mem[i]) * frequency;
973                       /* If we have assigned a class to this allocno in
974                          our first pass, add a cost to this alternative
975                          corresponding to what we would add if this
976                          allocno were not in the appropriate class.  */
977                       if (pref)
978                         {
979                           enum reg_class pref_class = pref[COST_INDEX (REGNO (op))];
980 
981                           if (pref_class == NO_REGS)
982                               {
983                                 if (op_class != NO_REGS)
984                                   alt_cost
985                                     += ((out_p
986                                            ? ira_memory_move_cost[mode][op_class][0]
987                                            : 0)
988                                           + (in_p
989                                              ? ira_memory_move_cost[mode][op_class][1]
990                                              : 0));
991                               }
992                           else if (op_class == NO_REGS)
993                               alt_cost
994                                 += ((out_p
995                                      ? ira_memory_move_cost[mode][pref_class][1]
996                                      : 0)
997                                     + (in_p
998                                          ? ira_memory_move_cost[mode][pref_class][0]
999                                          : 0));
1000                           else if (ira_reg_class_intersect[pref_class][op_class]
1001                                      == NO_REGS)
1002                               alt_cost += (ira_register_move_cost
1003                                              [mode][pref_class][op_class]);
1004                         }
1005                     }
1006               }
1007 
1008             /* Otherwise, if this alternative wins, either because we
1009                have already determined that or if we have a hard
1010                register of the proper class, there is no cost for this
1011                alternative.  */
1012             else if (win || (REG_P (op)
1013                                  && reg_fits_class_p (op, classes[i],
1014                                                             0, GET_MODE (op))))
1015               ;
1016 
1017             /* If registers are valid, the cost of this alternative
1018                includes copying the object to and/or from a
1019                register.  */
1020             else if (classes[i] != NO_REGS)
1021               {
1022                 if (recog_data.operand_type[i] != OP_OUT)
1023                     alt_cost += copy_cost (op, mode, classes[i], 1, NULL);
1024 
1025                 if (recog_data.operand_type[i] != OP_IN)
1026                     alt_cost += copy_cost (op, mode, classes[i], 0, NULL);
1027               }
1028             /* The only other way this alternative can be used is if
1029                this is a constant that could be placed into memory.  */
1030             else if (CONSTANT_P (op) && (allows_addr || allows_mem[i]))
1031               alt_cost += ira_memory_move_cost[mode][classes[i]][1];
1032             else
1033               alt_fail = 1;
1034 
1035             if (alt_fail)
1036               break;
1037           }
1038 
1039       if (alt_fail)
1040           {
1041             /* The loop above might have exited early once the failure
1042                was seen.  Skip over the constraints for the remaining
1043                operands.  */
1044             i += 1;
1045             for (; i < n_ops; ++i)
1046               constraints[i] = skip_alternative (constraints[i]);
1047             continue;
1048           }
1049 
1050       op_cost_add = alt_cost * frequency;
1051       /* Finally, update the costs with the information we've
1052            calculated about this alternative.  */
1053       for (i = 0; i < n_ops; i++)
1054           if (REG_P (ops[i]) && REGNO (ops[i]) >= FIRST_PSEUDO_REGISTER)
1055             {
1056               int old_cost;
1057               bool cost_change_p = false;
1058               struct costs *pp = op_costs[i], *qq = this_op_costs[i];
1059               int *pp_costs = pp->cost, *qq_costs = qq->cost;
1060               int scale = 1 + (recog_data.operand_type[i] == OP_INOUT);
1061               cost_classes_t cost_classes_ptr
1062                 = regno_cost_classes[REGNO (ops[i])];
1063 
1064               old_cost = pp->mem_cost;
1065               pp->mem_cost = MIN (old_cost,
1066                                         (qq->mem_cost + op_cost_add) * scale);
1067 
1068               if (ira_dump_file != NULL && internal_flag_ira_verbose > 5
1069                     && pp->mem_cost < old_cost)
1070                 {
1071                     cost_change_p = true;
1072                     fprintf (ira_dump_file, "        op %d(r=%u) new costs MEM:%d",
1073                                i, REGNO(ops[i]), pp->mem_cost);
1074                 }
1075               for (k = cost_classes_ptr->num - 1; k >= 0; k--)
1076                 {
1077                     old_cost = pp_costs[k];
1078                     pp_costs[k]
1079                       = MIN (old_cost, (qq_costs[k] + op_cost_add) * scale);
1080                     if (ira_dump_file != NULL && internal_flag_ira_verbose > 5
1081                         && pp_costs[k] < old_cost)
1082                       {
1083                         if (!cost_change_p)
1084                           fprintf (ira_dump_file, "        op %d(r=%u) new costs",
1085                                      i, REGNO(ops[i]));
1086                         cost_change_p = true;
1087                         fprintf (ira_dump_file, " %s:%d",
1088                                    reg_class_names[cost_classes_ptr->classes[k]],
1089                                    pp_costs[k]);
1090                       }
1091                 }
1092               if (ira_dump_file != NULL && internal_flag_ira_verbose > 5
1093                     && cost_change_p)
1094                 fprintf (ira_dump_file, "\n");
1095             }
1096     }
1097 
1098   if (allocno_p)
1099     for (i = 0; i < n_ops; i++)
1100       {
1101           ira_allocno_t a;
1102           rtx op = ops[i];
1103 
1104           if (! REG_P (op) || REGNO (op) < FIRST_PSEUDO_REGISTER)
1105             continue;
1106           a = ira_curr_regno_allocno_map [REGNO (op)];
1107           if (! ALLOCNO_BAD_SPILL_P (a) && insn_allows_mem[i] == 0)
1108             ALLOCNO_BAD_SPILL_P (a) = true;
1109       }
1110 
1111 }
1112 
1113 
1114 
1115 /* Wrapper around REGNO_OK_FOR_INDEX_P, to allow pseudo registers.  */
1116 static inline bool
ok_for_index_p_nonstrict(rtx reg)1117 ok_for_index_p_nonstrict (rtx reg)
1118 {
1119   unsigned regno = REGNO (reg);
1120 
1121   return regno >= FIRST_PSEUDO_REGISTER || REGNO_OK_FOR_INDEX_P (regno);
1122 }
1123 
1124 /* A version of regno_ok_for_base_p for use here, when all
1125    pseudo-registers should count as OK.  Arguments as for
1126    regno_ok_for_base_p.  */
1127 static inline bool
ok_for_base_p_nonstrict(rtx reg,machine_mode mode,addr_space_t as,enum rtx_code outer_code,enum rtx_code index_code)1128 ok_for_base_p_nonstrict (rtx reg, machine_mode mode, addr_space_t as,
1129                                enum rtx_code outer_code, enum rtx_code index_code)
1130 {
1131   unsigned regno = REGNO (reg);
1132 
1133   if (regno >= FIRST_PSEUDO_REGISTER)
1134     return true;
1135   return ok_for_base_p_1 (regno, mode, as, outer_code, index_code);
1136 }
1137 
1138 /* Record the pseudo registers we must reload into hard registers in a
1139    subexpression of a memory address, X.
1140 
1141    If CONTEXT is 0, we are looking at the base part of an address,
1142    otherwise we are looking at the index part.
1143 
1144    MODE and AS are the mode and address space of the memory reference;
1145    OUTER_CODE and INDEX_CODE give the context that the rtx appears in.
1146    These four arguments are passed down to base_reg_class.
1147 
1148    SCALE is twice the amount to multiply the cost by (it is twice so
1149    we can represent half-cost adjustments).  */
1150 static void
record_address_regs(machine_mode mode,addr_space_t as,rtx x,int context,enum rtx_code outer_code,enum rtx_code index_code,int scale)1151 record_address_regs (machine_mode mode, addr_space_t as, rtx x,
1152                          int context, enum rtx_code outer_code,
1153                          enum rtx_code index_code, int scale)
1154 {
1155   enum rtx_code code = GET_CODE (x);
1156   enum reg_class rclass;
1157 
1158   if (context == 1)
1159     rclass = INDEX_REG_CLASS;
1160   else
1161     rclass = base_reg_class (mode, as, outer_code, index_code);
1162 
1163   switch (code)
1164     {
1165     case CONST_INT:
1166     case CONST:
1167     case PC:
1168     case SYMBOL_REF:
1169     case LABEL_REF:
1170       return;
1171 
1172     case PLUS:
1173       /* When we have an address that is a sum, we must determine
1174            whether registers are "base" or "index" regs.  If there is a
1175            sum of two registers, we must choose one to be the "base".
1176            Luckily, we can use the REG_POINTER to make a good choice
1177            most of the time.  We only need to do this on machines that
1178            can have two registers in an address and where the base and
1179            index register classes are different.
1180 
1181            ??? This code used to set REGNO_POINTER_FLAG in some cases,
1182            but that seems bogus since it should only be set when we are
1183            sure the register is being used as a pointer.  */
1184       {
1185           rtx arg0 = XEXP (x, 0);
1186           rtx arg1 = XEXP (x, 1);
1187           enum rtx_code code0 = GET_CODE (arg0);
1188           enum rtx_code code1 = GET_CODE (arg1);
1189 
1190           /* Look inside subregs.  */
1191           if (code0 == SUBREG)
1192             arg0 = SUBREG_REG (arg0), code0 = GET_CODE (arg0);
1193           if (code1 == SUBREG)
1194             arg1 = SUBREG_REG (arg1), code1 = GET_CODE (arg1);
1195 
1196           /* If index registers do not appear, or coincide with base registers,
1197              just record registers in any non-constant operands.  We
1198              assume here, as well as in the tests below, that all
1199              addresses are in canonical form.  */
1200           if (MAX_REGS_PER_ADDRESS == 1
1201               || INDEX_REG_CLASS == base_reg_class (VOIDmode, as, PLUS, SCRATCH))
1202             {
1203               record_address_regs (mode, as, arg0, context, PLUS, code1, scale);
1204               if (! CONSTANT_P (arg1))
1205                 record_address_regs (mode, as, arg1, context, PLUS, code0, scale);
1206             }
1207 
1208           /* If the second operand is a constant integer, it doesn't
1209              change what class the first operand must be.  */
1210           else if (CONST_SCALAR_INT_P (arg1))
1211             record_address_regs (mode, as, arg0, context, PLUS, code1, scale);
1212           /* If the second operand is a symbolic constant, the first
1213              operand must be an index register.  */
1214           else if (code1 == SYMBOL_REF || code1 == CONST || code1 == LABEL_REF)
1215             record_address_regs (mode, as, arg0, 1, PLUS, code1, scale);
1216           /* If both operands are registers but one is already a hard
1217              register of index or reg-base class, give the other the
1218              class that the hard register is not.  */
1219           else if (code0 == REG && code1 == REG
1220                      && REGNO (arg0) < FIRST_PSEUDO_REGISTER
1221                      && (ok_for_base_p_nonstrict (arg0, mode, as, PLUS, REG)
1222                          || ok_for_index_p_nonstrict (arg0)))
1223             record_address_regs (mode, as, arg1,
1224                                      ok_for_base_p_nonstrict (arg0, mode, as,
1225                                                                       PLUS, REG) ? 1 : 0,
1226                                      PLUS, REG, scale);
1227           else if (code0 == REG && code1 == REG
1228                      && REGNO (arg1) < FIRST_PSEUDO_REGISTER
1229                      && (ok_for_base_p_nonstrict (arg1, mode, as, PLUS, REG)
1230                          || ok_for_index_p_nonstrict (arg1)))
1231             record_address_regs (mode, as, arg0,
1232                                      ok_for_base_p_nonstrict (arg1, mode, as,
1233                                                                       PLUS, REG) ? 1 : 0,
1234                                      PLUS, REG, scale);
1235           /* If one operand is known to be a pointer, it must be the
1236              base with the other operand the index.  Likewise if the
1237              other operand is a MULT.  */
1238           else if ((code0 == REG && REG_POINTER (arg0)) || code1 == MULT)
1239             {
1240               record_address_regs (mode, as, arg0, 0, PLUS, code1, scale);
1241               record_address_regs (mode, as, arg1, 1, PLUS, code0, scale);
1242             }
1243           else if ((code1 == REG && REG_POINTER (arg1)) || code0 == MULT)
1244             {
1245               record_address_regs (mode, as, arg0, 1, PLUS, code1, scale);
1246               record_address_regs (mode, as, arg1, 0, PLUS, code0, scale);
1247             }
1248           /* Otherwise, count equal chances that each might be a base or
1249              index register.  This case should be rare.  */
1250           else
1251             {
1252               record_address_regs (mode, as, arg0, 0, PLUS, code1, scale / 2);
1253               record_address_regs (mode, as, arg0, 1, PLUS, code1, scale / 2);
1254               record_address_regs (mode, as, arg1, 0, PLUS, code0, scale / 2);
1255               record_address_regs (mode, as, arg1, 1, PLUS, code0, scale / 2);
1256             }
1257       }
1258       break;
1259 
1260       /* Double the importance of an allocno that is incremented or
1261            decremented, since it would take two extra insns if it ends
1262            up in the wrong place.  */
1263     case POST_MODIFY:
1264     case PRE_MODIFY:
1265       record_address_regs (mode, as, XEXP (x, 0), 0, code,
1266                                  GET_CODE (XEXP (XEXP (x, 1), 1)), 2 * scale);
1267       if (REG_P (XEXP (XEXP (x, 1), 1)))
1268           record_address_regs (mode, as, XEXP (XEXP (x, 1), 1), 1, code, REG,
1269                                    2 * scale);
1270       break;
1271 
1272     case POST_INC:
1273     case PRE_INC:
1274     case POST_DEC:
1275     case PRE_DEC:
1276       /* Double the importance of an allocno that is incremented or
1277            decremented, since it would take two extra insns if it ends
1278            up in the wrong place.  */
1279       record_address_regs (mode, as, XEXP (x, 0), 0, code, SCRATCH, 2 * scale);
1280       break;
1281 
1282     case REG:
1283       {
1284           struct costs *pp;
1285           int *pp_costs;
1286           enum reg_class i;
1287           int k, regno, add_cost;
1288           cost_classes_t cost_classes_ptr;
1289           enum reg_class *cost_classes;
1290           move_table *move_in_cost;
1291 
1292           if (REGNO (x) < FIRST_PSEUDO_REGISTER)
1293             break;
1294 
1295           regno = REGNO (x);
1296           if (allocno_p)
1297             ALLOCNO_BAD_SPILL_P (ira_curr_regno_allocno_map[regno]) = true;
1298           pp = COSTS (costs, COST_INDEX (regno));
1299           add_cost = (ira_memory_move_cost[Pmode][rclass][1] * scale) / 2;
1300           if (INT_MAX - add_cost < pp->mem_cost)
1301             pp->mem_cost = INT_MAX;
1302           else
1303             pp->mem_cost += add_cost;
1304           cost_classes_ptr = regno_cost_classes[regno];
1305           cost_classes = cost_classes_ptr->classes;
1306           pp_costs = pp->cost;
1307           ira_init_register_move_cost_if_necessary (Pmode);
1308           move_in_cost = ira_may_move_in_cost[Pmode];
1309           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
1310             {
1311               i = cost_classes[k];
1312               add_cost = (move_in_cost[i][rclass] * scale) / 2;
1313               if (INT_MAX - add_cost < pp_costs[k])
1314                 pp_costs[k] = INT_MAX;
1315               else
1316                 pp_costs[k] += add_cost;
1317             }
1318       }
1319       break;
1320 
1321     default:
1322       {
1323           const char *fmt = GET_RTX_FORMAT (code);
1324           int i;
1325           for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1326             if (fmt[i] == 'e')
1327               record_address_regs (mode, as, XEXP (x, i), context, code, SCRATCH,
1328                                          scale);
1329       }
1330     }
1331 }
1332 
1333 
1334 
1335 /* Calculate the costs of insn operands.  */
1336 static void
record_operand_costs(rtx_insn * insn,enum reg_class * pref)1337 record_operand_costs (rtx_insn *insn, enum reg_class *pref)
1338 {
1339   const char *constraints[MAX_RECOG_OPERANDS];
1340   machine_mode modes[MAX_RECOG_OPERANDS];
1341   rtx set;
1342   int i;
1343 
1344   if ((set = single_set (insn)) != NULL_RTX
1345       /* In rare cases the single set insn might have less 2 operands
1346            as the source can be a fixed special reg.  */
1347       && recog_data.n_operands > 1
1348       && recog_data.operand[0] == SET_DEST (set)
1349       && recog_data.operand[1] == SET_SRC (set))
1350     {
1351       int regno, other_regno;
1352       rtx dest = SET_DEST (set);
1353       rtx src = SET_SRC (set);
1354 
1355       if (GET_CODE (dest) == SUBREG
1356             && known_eq (GET_MODE_SIZE (GET_MODE (dest)),
1357                            GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))))
1358           dest = SUBREG_REG (dest);
1359       if (GET_CODE (src) == SUBREG
1360             && known_eq (GET_MODE_SIZE (GET_MODE (src)),
1361                            GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))))
1362           src = SUBREG_REG (src);
1363       if (REG_P (src) && REG_P (dest)
1364             && (((regno = REGNO (src)) >= FIRST_PSEUDO_REGISTER
1365                  && (other_regno = REGNO (dest)) < FIRST_PSEUDO_REGISTER)
1366                 || ((regno = REGNO (dest)) >= FIRST_PSEUDO_REGISTER
1367                       && (other_regno = REGNO (src)) < FIRST_PSEUDO_REGISTER)))
1368           {
1369             machine_mode mode = GET_MODE (SET_SRC (set)), cost_mode = mode;
1370             machine_mode hard_reg_mode = GET_MODE(regno_reg_rtx[other_regno]);
1371             poly_int64 pmode_size = GET_MODE_SIZE (mode);
1372             poly_int64 phard_reg_mode_size = GET_MODE_SIZE (hard_reg_mode);
1373             HOST_WIDE_INT mode_size, hard_reg_mode_size;
1374             cost_classes_t cost_classes_ptr = regno_cost_classes[regno];
1375             enum reg_class *cost_classes = cost_classes_ptr->classes;
1376             reg_class_t rclass, hard_reg_class, bigger_hard_reg_class;
1377             int cost_factor = 1, cost, k;
1378             move_table *move_costs;
1379             bool dead_p = find_regno_note (insn, REG_DEAD, REGNO (src));
1380 
1381             hard_reg_class = REGNO_REG_CLASS (other_regno);
1382           bigger_hard_reg_class = ira_pressure_class_translate[hard_reg_class];
1383           /* Target code may return any cost for mode which does not fit the
1384              hard reg class (e.g. DImode for AREG on i386).  Check this and use
1385              a bigger class to get the right cost.  */
1386           if (bigger_hard_reg_class != NO_REGS
1387               && ! ira_hard_reg_in_set_p (other_regno, mode,
1388                                           reg_class_contents[hard_reg_class]))
1389             hard_reg_class = bigger_hard_reg_class;
1390           ira_init_register_move_cost_if_necessary (mode);
1391           ira_init_register_move_cost_if_necessary (hard_reg_mode);
1392             /* Use smaller movement cost for natural hard reg mode or its mode as
1393                operand.  */
1394           if (pmode_size.is_constant (&mode_size)
1395               && phard_reg_mode_size.is_constant (&hard_reg_mode_size))
1396             {
1397                 /* Assume we are moving in the natural modes: */
1398               cost_factor = mode_size / hard_reg_mode_size;
1399               if (mode_size % hard_reg_mode_size != 0)
1400                     cost_factor++;
1401                 if (cost_factor
1402                       * (ira_register_move_cost
1403                          [hard_reg_mode][hard_reg_class][hard_reg_class])
1404                       < (ira_register_move_cost
1405                          [mode][hard_reg_class][hard_reg_class]))
1406                     cost_mode = hard_reg_mode;
1407                 else
1408                     cost_factor = 1;
1409             }
1410           move_costs = ira_register_move_cost[cost_mode];
1411             i = regno == (int) REGNO (src) ? 1 : 0;
1412             for (k = cost_classes_ptr->num - 1; k >= 0; k--)
1413               {
1414                 rclass = cost_classes[k];
1415                 cost = (i == 0
1416                           ? move_costs[hard_reg_class][rclass]
1417                           : move_costs[rclass][hard_reg_class]);
1418                 cost *= cost_factor;
1419                 op_costs[i]->cost[k] = cost * frequency;
1420                 /* If this insn is a single set copying operand 1 to
1421                      operand 0 and one operand is an allocno with the
1422                      other a hard reg or an allocno that prefers a hard
1423                      register that is in its own register class then we
1424                      may want to adjust the cost of that register class to
1425                      -1.
1426 
1427                      Avoid the adjustment if the source does not die to
1428                      avoid stressing of register allocator by preferencing
1429                      two colliding registers into single class.  */
1430                 if (dead_p
1431                       && TEST_HARD_REG_BIT (reg_class_contents[rclass], other_regno)
1432                       && (reg_class_size[(int) rclass]
1433                           == (ira_reg_class_max_nregs
1434                                 [(int) rclass][(int) GET_MODE(src)])))
1435                     {
1436                       if (reg_class_size[rclass] == 1)
1437                         op_costs[i]->cost[k] = -frequency;
1438                       else if (in_hard_reg_set_p (reg_class_contents[rclass],
1439                                                         GET_MODE(src), other_regno))
1440                         op_costs[i]->cost[k] = -frequency;
1441                     }
1442               }
1443             op_costs[i]->mem_cost
1444               = ira_memory_move_cost[mode][hard_reg_class][i] * frequency;
1445             return;
1446           }
1447     }
1448 
1449   for (i = 0; i < recog_data.n_operands; i++)
1450     {
1451       constraints[i] = recog_data.constraints[i];
1452       modes[i] = recog_data.operand_mode[i];
1453     }
1454 
1455   /* If we get here, we are set up to record the costs of all the
1456      operands for this insn.  Start by initializing the costs.  Then
1457      handle any address registers.  Finally record the desired classes
1458      for any allocnos, doing it twice if some pair of operands are
1459      commutative.  */
1460   for (i = 0; i < recog_data.n_operands; i++)
1461     {
1462       rtx op_mem = extract_mem_from_operand (recog_data.operand[i]);
1463       memcpy (op_costs[i], init_cost, struct_costs_size);
1464 
1465       if (GET_CODE (recog_data.operand[i]) == SUBREG)
1466           recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]);
1467 
1468       if (MEM_P (op_mem))
1469           record_address_regs (GET_MODE (op_mem),
1470                                    MEM_ADDR_SPACE (op_mem),
1471                                    XEXP (op_mem, 0),
1472                                    0, MEM, SCRATCH, frequency * 2);
1473       else if (constraints[i][0] == 'p'
1474                  || (insn_extra_address_constraint
1475                        (lookup_constraint (constraints[i]))))
1476           record_address_regs (VOIDmode, ADDR_SPACE_GENERIC,
1477                                    recog_data.operand[i], 0, ADDRESS, SCRATCH,
1478                                    frequency * 2);
1479     }
1480 
1481   /* Check for commutative in a separate loop so everything will have
1482      been initialized.  We must do this even if one operand is a
1483      constant--see addsi3 in m68k.md.  */
1484   for (i = 0; i < (int) recog_data.n_operands - 1; i++)
1485     if (constraints[i][0] == '%')
1486       {
1487           const char *xconstraints[MAX_RECOG_OPERANDS];
1488           int j;
1489 
1490           /* Handle commutative operands by swapping the
1491              constraints.  We assume the modes are the same.  */
1492           for (j = 0; j < recog_data.n_operands; j++)
1493             xconstraints[j] = constraints[j];
1494 
1495           xconstraints[i] = constraints[i+1];
1496           xconstraints[i+1] = constraints[i];
1497           record_reg_classes (recog_data.n_alternatives, recog_data.n_operands,
1498                                   recog_data.operand, modes,
1499                                   xconstraints, insn, pref);
1500       }
1501   record_reg_classes (recog_data.n_alternatives, recog_data.n_operands,
1502                           recog_data.operand, modes,
1503                           constraints, insn, pref);
1504 }
1505 
1506 
1507 
1508 /* Process one insn INSN.  Scan it and record each time it would save
1509    code to put a certain allocnos in a certain class.  Return the last
1510    insn processed, so that the scan can be continued from there.  */
1511 static rtx_insn *
scan_one_insn(rtx_insn * insn)1512 scan_one_insn (rtx_insn *insn)
1513 {
1514   enum rtx_code pat_code;
1515   rtx set, note;
1516   int i, k;
1517   bool counted_mem;
1518 
1519   if (!NONDEBUG_INSN_P (insn))
1520     return insn;
1521 
1522   pat_code = GET_CODE (PATTERN (insn));
1523   if (pat_code == ASM_INPUT)
1524     return insn;
1525 
1526   /* If INSN is a USE/CLOBBER of a pseudo in a mode M then go ahead
1527      and initialize the register move costs of mode M.
1528 
1529      The pseudo may be related to another pseudo via a copy (implicit or
1530      explicit) and if there are no mode M uses/sets of the original
1531      pseudo, then we may leave the register move costs uninitialized for
1532      mode M. */
1533   if (pat_code == USE || pat_code == CLOBBER)
1534     {
1535       rtx x = XEXP (PATTERN (insn), 0);
1536       if (GET_CODE (x) == REG
1537             && REGNO (x) >= FIRST_PSEUDO_REGISTER
1538             && have_regs_of_mode[GET_MODE (x)])
1539         ira_init_register_move_cost_if_necessary (GET_MODE (x));
1540       return insn;
1541     }
1542 
1543   counted_mem = false;
1544   set = single_set (insn);
1545   extract_insn (insn);
1546 
1547   /* If this insn loads a parameter from its stack slot, then it
1548      represents a savings, rather than a cost, if the parameter is
1549      stored in memory.  Record this fact.
1550 
1551      Similarly if we're loading other constants from memory (constant
1552      pool, TOC references, small data areas, etc) and this is the only
1553      assignment to the destination pseudo.
1554 
1555      Don't do this if SET_SRC (set) isn't a general operand, if it is
1556      a memory requiring special instructions to load it, decreasing
1557      mem_cost might result in it being loaded using the specialized
1558      instruction into a register, then stored into stack and loaded
1559      again from the stack.  See PR52208.
1560 
1561      Don't do this if SET_SRC (set) has side effect.  See PR56124.  */
1562   if (set != 0 && REG_P (SET_DEST (set)) && MEM_P (SET_SRC (set))
1563       && (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != NULL_RTX
1564       && ((MEM_P (XEXP (note, 0))
1565              && !side_effects_p (SET_SRC (set)))
1566             || (CONSTANT_P (XEXP (note, 0))
1567                 && targetm.legitimate_constant_p (GET_MODE (SET_DEST (set)),
1568                                                             XEXP (note, 0))
1569                 && REG_N_SETS (REGNO (SET_DEST (set))) == 1))
1570       && general_operand (SET_SRC (set), GET_MODE (SET_SRC (set)))
1571       /* LRA does not use equiv with a symbol for PIC code.  */
1572       && (! ira_use_lra_p || ! pic_offset_table_rtx
1573             || ! contains_symbol_ref_p (XEXP (note, 0))))
1574     {
1575       enum reg_class cl = GENERAL_REGS;
1576       rtx reg = SET_DEST (set);
1577       int num = COST_INDEX (REGNO (reg));
1578 
1579       COSTS (costs, num)->mem_cost
1580           -= ira_memory_move_cost[GET_MODE (reg)][cl][1] * frequency;
1581       record_address_regs (GET_MODE (SET_SRC (set)),
1582                                  MEM_ADDR_SPACE (SET_SRC (set)),
1583                                  XEXP (SET_SRC (set), 0), 0, MEM, SCRATCH,
1584                                  frequency * 2);
1585       counted_mem = true;
1586     }
1587 
1588   record_operand_costs (insn, pref);
1589 
1590   if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
1591     {
1592       const char *p;
1593       fprintf (ira_dump_file, "    Final costs after insn %u", INSN_UID (insn));
1594       if (INSN_CODE (insn) >= 0
1595             && (p = get_insn_name (INSN_CODE (insn))) != NULL)
1596           fprintf (ira_dump_file, " {%s}", p);
1597       fprintf (ira_dump_file, " (freq=%d)\n",
1598                  REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn)));
1599       dump_insn_slim (ira_dump_file, insn);
1600     }
1601 
1602   /* Now add the cost for each operand to the total costs for its
1603      allocno.  */
1604   for (i = 0; i < recog_data.n_operands; i++)
1605     {
1606       rtx op = recog_data.operand[i];
1607 
1608       if (GET_CODE (op) == SUBREG)
1609           op = SUBREG_REG (op);
1610       if (REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER)
1611           {
1612             int regno = REGNO (op);
1613             struct costs *p = COSTS (costs, COST_INDEX (regno));
1614             struct costs *q = op_costs[i];
1615             int *p_costs = p->cost, *q_costs = q->cost;
1616             cost_classes_t cost_classes_ptr = regno_cost_classes[regno];
1617             int add_cost = 0;
1618 
1619             /* If the already accounted for the memory "cost" above, don't
1620                do so again.  */
1621             if (!counted_mem)
1622               {
1623                 add_cost = q->mem_cost;
1624                 if (add_cost > 0 && INT_MAX - add_cost < p->mem_cost)
1625                     p->mem_cost = INT_MAX;
1626                 else
1627                     p->mem_cost += add_cost;
1628               }
1629             if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
1630               {
1631                 fprintf (ira_dump_file, "        op %d(r=%u) MEM:%d(+%d)",
1632                            i, REGNO(op), p->mem_cost, add_cost);
1633               }
1634             for (k = cost_classes_ptr->num - 1; k >= 0; k--)
1635               {
1636                 add_cost = q_costs[k];
1637                 if (add_cost > 0 && INT_MAX - add_cost < p_costs[k])
1638                     p_costs[k] = INT_MAX;
1639                 else
1640                     p_costs[k] += add_cost;
1641                 if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
1642                     {
1643                       fprintf (ira_dump_file, " %s:%d(+%d)",
1644                                  reg_class_names[cost_classes_ptr->classes[k]],
1645                                  p_costs[k], add_cost);
1646                     }
1647               }
1648             if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
1649               fprintf (ira_dump_file, "\n");
1650           }
1651     }
1652   return insn;
1653 }
1654 
1655 
1656 
1657 /* Print allocnos costs to file F.  */
1658 static void
print_allocno_costs(FILE * f)1659 print_allocno_costs (FILE *f)
1660 {
1661   int k;
1662   ira_allocno_t a;
1663   ira_allocno_iterator ai;
1664 
1665   ira_assert (allocno_p);
1666   fprintf (f, "\n");
1667   FOR_EACH_ALLOCNO (a, ai)
1668     {
1669       int i, rclass;
1670       basic_block bb;
1671       int regno = ALLOCNO_REGNO (a);
1672       cost_classes_t cost_classes_ptr = regno_cost_classes[regno];
1673       enum reg_class *cost_classes = cost_classes_ptr->classes;
1674 
1675       i = ALLOCNO_NUM (a);
1676       fprintf (f, "  a%d(r%d,", i, regno);
1677       if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL)
1678           fprintf (f, "b%d", bb->index);
1679       else
1680           fprintf (f, "l%d", ALLOCNO_LOOP_TREE_NODE (a)->loop_num);
1681       fprintf (f, ") costs:");
1682       for (k = 0; k < cost_classes_ptr->num; k++)
1683           {
1684             rclass = cost_classes[k];
1685             fprintf (f, " %s:%d", reg_class_names[rclass],
1686                        COSTS (costs, i)->cost[k]);
1687             if (flag_ira_region == IRA_REGION_ALL
1688                 || flag_ira_region == IRA_REGION_MIXED)
1689               fprintf (f, ",%d", COSTS (total_allocno_costs, i)->cost[k]);
1690           }
1691       fprintf (f, " MEM:%i", COSTS (costs, i)->mem_cost);
1692       if (flag_ira_region == IRA_REGION_ALL
1693             || flag_ira_region == IRA_REGION_MIXED)
1694           fprintf (f, ",%d", COSTS (total_allocno_costs, i)->mem_cost);
1695       fprintf (f, "\n");
1696     }
1697 }
1698 
1699 /* Print pseudo costs to file F.  */
1700 static void
print_pseudo_costs(FILE * f)1701 print_pseudo_costs (FILE *f)
1702 {
1703   int regno, k;
1704   int rclass;
1705   cost_classes_t cost_classes_ptr;
1706   enum reg_class *cost_classes;
1707 
1708   ira_assert (! allocno_p);
1709   fprintf (f, "\n");
1710   for (regno = max_reg_num () - 1; regno >= FIRST_PSEUDO_REGISTER; regno--)
1711     {
1712       if (REG_N_REFS (regno) <= 0)
1713           continue;
1714       cost_classes_ptr = regno_cost_classes[regno];
1715       cost_classes = cost_classes_ptr->classes;
1716       fprintf (f, "  r%d costs:", regno);
1717       for (k = 0; k < cost_classes_ptr->num; k++)
1718           {
1719             rclass = cost_classes[k];
1720             fprintf (f, " %s:%d", reg_class_names[rclass],
1721                        COSTS (costs, regno)->cost[k]);
1722           }
1723       fprintf (f, " MEM:%i\n", COSTS (costs, regno)->mem_cost);
1724     }
1725 }
1726 
1727 /* Traverse the BB represented by LOOP_TREE_NODE to update the allocno
1728    costs.  */
1729 static void
process_bb_for_costs(basic_block bb)1730 process_bb_for_costs (basic_block bb)
1731 {
1732   rtx_insn *insn;
1733 
1734   frequency = REG_FREQ_FROM_BB (bb);
1735   if (frequency == 0)
1736     frequency = 1;
1737   FOR_BB_INSNS (bb, insn)
1738     insn = scan_one_insn (insn);
1739 }
1740 
1741 /* Traverse the BB represented by LOOP_TREE_NODE to update the allocno
1742    costs.  */
1743 static void
process_bb_node_for_costs(ira_loop_tree_node_t loop_tree_node)1744 process_bb_node_for_costs (ira_loop_tree_node_t loop_tree_node)
1745 {
1746   basic_block bb;
1747 
1748   bb = loop_tree_node->bb;
1749   if (bb != NULL)
1750     process_bb_for_costs (bb);
1751 }
1752 
1753 /* Find costs of register classes and memory for allocnos or pseudos
1754    and their best costs.  Set up preferred, alternative and allocno
1755    classes for pseudos.  */
1756 static void
find_costs_and_classes(FILE * dump_file)1757 find_costs_and_classes (FILE *dump_file)
1758 {
1759   int i, k, start, max_cost_classes_num;
1760   int pass;
1761   basic_block bb;
1762   enum reg_class *regno_best_class, new_class;
1763 
1764   init_recog ();
1765   regno_best_class
1766     = (enum reg_class *) ira_allocate (max_reg_num ()
1767                                                * sizeof (enum reg_class));
1768   for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
1769     regno_best_class[i] = NO_REGS;
1770   if (!resize_reg_info () && allocno_p
1771       && pseudo_classes_defined_p && flag_expensive_optimizations)
1772     {
1773       ira_allocno_t a;
1774       ira_allocno_iterator ai;
1775 
1776       pref = pref_buffer;
1777       max_cost_classes_num = 1;
1778       FOR_EACH_ALLOCNO (a, ai)
1779           {
1780             pref[ALLOCNO_NUM (a)] = reg_preferred_class (ALLOCNO_REGNO (a));
1781             setup_regno_cost_classes_by_aclass
1782               (ALLOCNO_REGNO (a), pref[ALLOCNO_NUM (a)]);
1783             max_cost_classes_num
1784               = MAX (max_cost_classes_num,
1785                        regno_cost_classes[ALLOCNO_REGNO (a)]->num);
1786           }
1787       start = 1;
1788     }
1789   else
1790     {
1791       pref = NULL;
1792       max_cost_classes_num = ira_important_classes_num;
1793       for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
1794           if (regno_reg_rtx[i] != NULL_RTX)
1795             setup_regno_cost_classes_by_mode (i, PSEUDO_REGNO_MODE (i));
1796           else
1797             setup_regno_cost_classes_by_aclass (i, ALL_REGS);
1798       start = 0;
1799     }
1800   if (allocno_p)
1801     /* Clear the flag for the next compiled function.  */
1802     pseudo_classes_defined_p = false;
1803   /* Normally we scan the insns once and determine the best class to
1804      use for each allocno.  However, if -fexpensive-optimizations are
1805      on, we do so twice, the second time using the tentative best
1806      classes to guide the selection.  */
1807   for (pass = start; pass <= flag_expensive_optimizations; pass++)
1808     {
1809       if ((!allocno_p || internal_flag_ira_verbose > 0) && dump_file)
1810           fprintf (dump_file,
1811                      "\nPass %i for finding pseudo/allocno costs\n\n", pass);
1812 
1813       if (pass != start)
1814           {
1815             max_cost_classes_num = 1;
1816             for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
1817               {
1818                 setup_regno_cost_classes_by_aclass (i, regno_best_class[i]);
1819                 max_cost_classes_num
1820                     = MAX (max_cost_classes_num, regno_cost_classes[i]->num);
1821               }
1822           }
1823 
1824       struct_costs_size
1825           = sizeof (struct costs) + sizeof (int) * (max_cost_classes_num - 1);
1826       /* Zero out our accumulation of the cost of each class for each
1827            allocno.  */
1828       memset (costs, 0, cost_elements_num * struct_costs_size);
1829 
1830       if (allocno_p)
1831           {
1832             /* Scan the instructions and record each time it would save code
1833                to put a certain allocno in a certain class.  */
1834             ira_traverse_loop_tree (true, ira_loop_tree_root,
1835                                           process_bb_node_for_costs, NULL);
1836 
1837             memcpy (total_allocno_costs, costs,
1838                       max_struct_costs_size * ira_allocnos_num);
1839           }
1840       else
1841           {
1842             basic_block bb;
1843 
1844             FOR_EACH_BB_FN (bb, cfun)
1845               process_bb_for_costs (bb);
1846           }
1847 
1848       if (pass == 0)
1849           pref = pref_buffer;
1850 
1851       /* Now for each allocno look at how desirable each class is and
1852            find which class is preferred.  */
1853       for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
1854           {
1855             ira_allocno_t a, parent_a;
1856             int rclass, a_num, parent_a_num, add_cost;
1857             ira_loop_tree_node_t parent;
1858             int best_cost, allocno_cost;
1859             enum reg_class best, alt_class;
1860             cost_classes_t cost_classes_ptr = regno_cost_classes[i];
1861             enum reg_class *cost_classes;
1862             int *i_costs = temp_costs->cost;
1863             int i_mem_cost;
1864             int equiv_savings = regno_equiv_gains[i];
1865 
1866             if (! allocno_p)
1867               {
1868                 if (regno_reg_rtx[i] == NULL_RTX)
1869                     continue;
1870                 memcpy (temp_costs, COSTS (costs, i), struct_costs_size);
1871                 i_mem_cost = temp_costs->mem_cost;
1872                 cost_classes = cost_classes_ptr->classes;
1873               }
1874             else
1875               {
1876                 if (ira_regno_allocno_map[i] == NULL)
1877                     continue;
1878                 memset (temp_costs, 0, struct_costs_size);
1879                 i_mem_cost = 0;
1880                 cost_classes = cost_classes_ptr->classes;
1881                 /* Find cost of all allocnos with the same regno.  */
1882                 for (a = ira_regno_allocno_map[i];
1883                        a != NULL;
1884                        a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
1885                     {
1886                       int *a_costs, *p_costs;
1887 
1888                       a_num = ALLOCNO_NUM (a);
1889                       if ((flag_ira_region == IRA_REGION_ALL
1890                            || flag_ira_region == IRA_REGION_MIXED)
1891                           && (parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) != NULL
1892                           && (parent_a = parent->regno_allocno_map[i]) != NULL
1893                           /* There are no caps yet.  */
1894                           && bitmap_bit_p (ALLOCNO_LOOP_TREE_NODE
1895                                                (a)->border_allocnos,
1896                                                ALLOCNO_NUM (a)))
1897                         {
1898                           /* Propagate costs to upper levels in the region
1899                                tree.  */
1900                           parent_a_num = ALLOCNO_NUM (parent_a);
1901                           a_costs = COSTS (total_allocno_costs, a_num)->cost;
1902                           p_costs = COSTS (total_allocno_costs, parent_a_num)->cost;
1903                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
1904                               {
1905                                 add_cost = a_costs[k];
1906                                 if (add_cost > 0 && INT_MAX - add_cost < p_costs[k])
1907                                   p_costs[k] = INT_MAX;
1908                                 else
1909                                   p_costs[k] += add_cost;
1910                               }
1911                           add_cost = COSTS (total_allocno_costs, a_num)->mem_cost;
1912                           if (add_cost > 0
1913                                 && (INT_MAX - add_cost
1914                                     < COSTS (total_allocno_costs,
1915                                                parent_a_num)->mem_cost))
1916                               COSTS (total_allocno_costs, parent_a_num)->mem_cost
1917                                 = INT_MAX;
1918                           else
1919                               COSTS (total_allocno_costs, parent_a_num)->mem_cost
1920                                 += add_cost;
1921 
1922                           if (i >= first_moveable_pseudo && i < last_moveable_pseudo)
1923                               COSTS (total_allocno_costs, parent_a_num)->mem_cost = 0;
1924                         }
1925                       a_costs = COSTS (costs, a_num)->cost;
1926                       for (k = cost_classes_ptr->num - 1; k >= 0; k--)
1927                         {
1928                           add_cost = a_costs[k];
1929                           if (add_cost > 0 && INT_MAX - add_cost < i_costs[k])
1930                               i_costs[k] = INT_MAX;
1931                           else
1932                               i_costs[k] += add_cost;
1933                         }
1934                       add_cost = COSTS (costs, a_num)->mem_cost;
1935                       if (add_cost > 0 && INT_MAX - add_cost < i_mem_cost)
1936                         i_mem_cost = INT_MAX;
1937                       else
1938                         i_mem_cost += add_cost;
1939                     }
1940               }
1941             if (i >= first_moveable_pseudo && i < last_moveable_pseudo)
1942               i_mem_cost = 0;
1943             else if (equiv_savings < 0)
1944               i_mem_cost = -equiv_savings;
1945             else if (equiv_savings > 0)
1946               {
1947                 i_mem_cost = 0;
1948                 for (k = cost_classes_ptr->num - 1; k >= 0; k--)
1949                     i_costs[k] += equiv_savings;
1950               }
1951 
1952             best_cost = (1 << (HOST_BITS_PER_INT - 2)) - 1;
1953             best = ALL_REGS;
1954             alt_class = NO_REGS;
1955             /* Find best common class for all allocnos with the same
1956                regno.  */
1957             for (k = 0; k < cost_classes_ptr->num; k++)
1958               {
1959                 rclass = cost_classes[k];
1960                 if (i_costs[k] < best_cost)
1961                     {
1962                       best_cost = i_costs[k];
1963                       best = (enum reg_class) rclass;
1964                     }
1965                 else if (i_costs[k] == best_cost)
1966                     best = ira_reg_class_subunion[best][rclass];
1967                 if (pass == flag_expensive_optimizations
1968                       /* We still prefer registers to memory even at this
1969                          stage if their costs are the same.  We will make
1970                          a final decision during assigning hard registers
1971                          when we have all info including more accurate
1972                          costs which might be affected by assigning hard
1973                          registers to other pseudos because the pseudos
1974                          involved in moves can be coalesced.  */
1975                       && i_costs[k] <= i_mem_cost
1976                       && (reg_class_size[reg_class_subunion[alt_class][rclass]]
1977                           > reg_class_size[alt_class]))
1978                     alt_class = reg_class_subunion[alt_class][rclass];
1979               }
1980             alt_class = ira_allocno_class_translate[alt_class];
1981             if (best_cost > i_mem_cost
1982                 && ! non_spilled_static_chain_regno_p (i))
1983               regno_aclass[i] = NO_REGS;
1984             else if (!optimize && !targetm.class_likely_spilled_p (best))
1985               /* Registers in the alternative class are likely to need
1986                  longer or slower sequences than registers in the best class.
1987                  When optimizing we make some effort to use the best class
1988                  over the alternative class where possible, but at -O0 we
1989                  effectively give the alternative class equal weight.
1990                  We then run the risk of using slower alternative registers
1991                  when plenty of registers from the best class are still free.
1992                  This is especially true because live ranges tend to be very
1993                  short in -O0 code and so register pressure tends to be low.
1994 
1995                  Avoid that by ignoring the alternative class if the best
1996                  class has plenty of registers.
1997 
1998                  The union class arrays give important classes and only
1999                  part of it are allocno classes.  So translate them into
2000                  allocno classes.  */
2001               regno_aclass[i] = ira_allocno_class_translate[best];
2002             else
2003               {
2004                 /* Make the common class the biggest class of best and
2005                      alt_class.  Translate the common class into an
2006                      allocno class too.  */
2007                 regno_aclass[i] = (ira_allocno_class_translate
2008                                          [ira_reg_class_superunion[best][alt_class]]);
2009                 ira_assert (regno_aclass[i] != NO_REGS
2010                                 && ira_reg_allocno_class_p[regno_aclass[i]]);
2011               }
2012             if ((new_class
2013                  = (reg_class) (targetm.ira_change_pseudo_allocno_class
2014                                     (i, regno_aclass[i], best))) != regno_aclass[i])
2015               {
2016                 regno_aclass[i] = new_class;
2017                 if (hard_reg_set_subset_p (reg_class_contents[new_class],
2018                                                    reg_class_contents[best]))
2019                     best = new_class;
2020                 if (hard_reg_set_subset_p (reg_class_contents[new_class],
2021                                                    reg_class_contents[alt_class]))
2022                     alt_class = new_class;
2023               }
2024             if (pass == flag_expensive_optimizations)
2025               {
2026                 if (best_cost > i_mem_cost
2027                       /* Do not assign NO_REGS to static chain pointer
2028                          pseudo when non-local goto is used.  */
2029                       && ! non_spilled_static_chain_regno_p (i))
2030                     best = alt_class = NO_REGS;
2031                 else if (best == alt_class)
2032                     alt_class = NO_REGS;
2033                 setup_reg_classes (i, best, alt_class, regno_aclass[i]);
2034                 if ((!allocno_p || internal_flag_ira_verbose > 2)
2035                       && dump_file != NULL)
2036                     fprintf (dump_file,
2037                                "    r%d: preferred %s, alternative %s, allocno %s\n",
2038                                i, reg_class_names[best], reg_class_names[alt_class],
2039                                reg_class_names[regno_aclass[i]]);
2040               }
2041             regno_best_class[i] = best;
2042             if (! allocno_p)
2043               {
2044                 pref[i] = (best_cost > i_mem_cost
2045                                && ! non_spilled_static_chain_regno_p (i)
2046                                ? NO_REGS : best);
2047                 continue;
2048               }
2049             for (a = ira_regno_allocno_map[i];
2050                  a != NULL;
2051                  a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
2052               {
2053                 enum reg_class aclass = regno_aclass[i];
2054                 int a_num = ALLOCNO_NUM (a);
2055                 int *total_a_costs = COSTS (total_allocno_costs, a_num)->cost;
2056                 int *a_costs = COSTS (costs, a_num)->cost;
2057 
2058                 if (aclass == NO_REGS)
2059                     best = NO_REGS;
2060                 else
2061                     {
2062                       /* Finding best class which is subset of the common
2063                          class.  */
2064                       best_cost = (1 << (HOST_BITS_PER_INT - 2)) - 1;
2065                       allocno_cost = best_cost;
2066                       best = ALL_REGS;
2067                       for (k = 0; k < cost_classes_ptr->num; k++)
2068                         {
2069                           rclass = cost_classes[k];
2070                           if (! ira_class_subset_p[rclass][aclass])
2071                               continue;
2072                           if (total_a_costs[k] < best_cost)
2073                               {
2074                                 best_cost = total_a_costs[k];
2075                                 allocno_cost = a_costs[k];
2076                                 best = (enum reg_class) rclass;
2077                               }
2078                           else if (total_a_costs[k] == best_cost)
2079                               {
2080                                 best = ira_reg_class_subunion[best][rclass];
2081                                 allocno_cost = MAX (allocno_cost, a_costs[k]);
2082                               }
2083                         }
2084                       ALLOCNO_CLASS_COST (a) = allocno_cost;
2085                     }
2086                 if (internal_flag_ira_verbose > 2 && dump_file != NULL
2087                       && (pass == 0 || pref[a_num] != best))
2088                     {
2089                       fprintf (dump_file, "    a%d (r%d,", a_num, i);
2090                       if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL)
2091                         fprintf (dump_file, "b%d", bb->index);
2092                       else
2093                         fprintf (dump_file, "l%d",
2094                                    ALLOCNO_LOOP_TREE_NODE (a)->loop_num);
2095                       fprintf (dump_file, ") best %s, allocno %s\n",
2096                                  reg_class_names[best],
2097                                  reg_class_names[aclass]);
2098                     }
2099                 pref[a_num] = best;
2100                 if (pass == flag_expensive_optimizations && best != aclass
2101                       && ira_class_hard_regs_num[best] > 0
2102                       && (ira_reg_class_max_nregs[best][ALLOCNO_MODE (a)]
2103                           >= ira_class_hard_regs_num[best]))
2104                     {
2105                       int ind = cost_classes_ptr->index[aclass];
2106 
2107                       ira_assert (ind >= 0);
2108                       ira_init_register_move_cost_if_necessary (ALLOCNO_MODE (a));
2109                       ira_add_allocno_pref (a, ira_class_hard_regs[best][0],
2110                                                   (a_costs[ind] - ALLOCNO_CLASS_COST (a))
2111                                                   / (ira_register_move_cost
2112                                                      [ALLOCNO_MODE (a)][best][aclass]));
2113                       for (k = 0; k < cost_classes_ptr->num; k++)
2114                         if (ira_class_subset_p[cost_classes[k]][best])
2115                           a_costs[k] = a_costs[ind];
2116                     }
2117               }
2118           }
2119 
2120       if (internal_flag_ira_verbose > 4 && dump_file)
2121           {
2122             if (allocno_p)
2123               print_allocno_costs (dump_file);
2124             else
2125               print_pseudo_costs (dump_file);
2126             fprintf (dump_file,"\n");
2127           }
2128     }
2129   ira_free (regno_best_class);
2130 }
2131 
2132 
2133 
2134 /* Process moves involving hard regs to modify allocno hard register
2135    costs.  We can do this only after determining allocno class.  If a
2136    hard register forms a register class, then moves with the hard
2137    register are already taken into account in class costs for the
2138    allocno.  */
2139 static void
process_bb_node_for_hard_reg_moves(ira_loop_tree_node_t loop_tree_node)2140 process_bb_node_for_hard_reg_moves (ira_loop_tree_node_t loop_tree_node)
2141 {
2142   int i, freq, src_regno, dst_regno, hard_regno, a_regno;
2143   bool to_p;
2144   ira_allocno_t a, curr_a;
2145   ira_loop_tree_node_t curr_loop_tree_node;
2146   enum reg_class rclass;
2147   basic_block bb;
2148   rtx_insn *insn;
2149   rtx set, src, dst;
2150 
2151   bb = loop_tree_node->bb;
2152   if (bb == NULL)
2153     return;
2154   freq = REG_FREQ_FROM_BB (bb);
2155   if (freq == 0)
2156     freq = 1;
2157   FOR_BB_INSNS (bb, insn)
2158     {
2159       if (!NONDEBUG_INSN_P (insn))
2160           continue;
2161       set = single_set (insn);
2162       if (set == NULL_RTX)
2163           continue;
2164       dst = SET_DEST (set);
2165       src = SET_SRC (set);
2166       if (! REG_P (dst) || ! REG_P (src))
2167           continue;
2168       dst_regno = REGNO (dst);
2169       src_regno = REGNO (src);
2170       if (dst_regno >= FIRST_PSEUDO_REGISTER
2171             && src_regno < FIRST_PSEUDO_REGISTER)
2172           {
2173             hard_regno = src_regno;
2174             a = ira_curr_regno_allocno_map[dst_regno];
2175             to_p = true;
2176           }
2177       else if (src_regno >= FIRST_PSEUDO_REGISTER
2178                  && dst_regno < FIRST_PSEUDO_REGISTER)
2179           {
2180             hard_regno = dst_regno;
2181             a = ira_curr_regno_allocno_map[src_regno];
2182             to_p = false;
2183           }
2184       else
2185           continue;
2186       if (reg_class_size[(int) REGNO_REG_CLASS (hard_regno)]
2187             == (ira_reg_class_max_nregs
2188                 [REGNO_REG_CLASS (hard_regno)][(int) ALLOCNO_MODE(a)]))
2189           /* If the class can provide only one hard reg to the allocno,
2190              we processed the insn record_operand_costs already and we
2191              actually updated the hard reg cost there.  */
2192           continue;
2193       rclass = ALLOCNO_CLASS (a);
2194       if (! TEST_HARD_REG_BIT (reg_class_contents[rclass], hard_regno))
2195           continue;
2196       i = ira_class_hard_reg_index[rclass][hard_regno];
2197       if (i < 0)
2198           continue;
2199       a_regno = ALLOCNO_REGNO (a);
2200       for (curr_loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
2201              curr_loop_tree_node != NULL;
2202              curr_loop_tree_node = curr_loop_tree_node->parent)
2203           if ((curr_a = curr_loop_tree_node->regno_allocno_map[a_regno]) != NULL)
2204             ira_add_allocno_pref (curr_a, hard_regno, freq);
2205       {
2206           int cost;
2207           enum reg_class hard_reg_class;
2208           machine_mode mode;
2209 
2210           mode = ALLOCNO_MODE (a);
2211           hard_reg_class = REGNO_REG_CLASS (hard_regno);
2212           ira_init_register_move_cost_if_necessary (mode);
2213           cost = (to_p ? ira_register_move_cost[mode][hard_reg_class][rclass]
2214                     : ira_register_move_cost[mode][rclass][hard_reg_class]) * freq;
2215           ira_allocate_and_set_costs (&ALLOCNO_HARD_REG_COSTS (a), rclass,
2216                                             ALLOCNO_CLASS_COST (a));
2217           ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a),
2218                                             rclass, 0);
2219           ALLOCNO_HARD_REG_COSTS (a)[i] -= cost;
2220           ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[i] -= cost;
2221           ALLOCNO_CLASS_COST (a) = MIN (ALLOCNO_CLASS_COST (a),
2222                                               ALLOCNO_HARD_REG_COSTS (a)[i]);
2223       }
2224     }
2225 }
2226 
2227 /* After we find hard register and memory costs for allocnos, define
2228    its class and modify hard register cost because insns moving
2229    allocno to/from hard registers.  */
2230 static void
setup_allocno_class_and_costs(void)2231 setup_allocno_class_and_costs (void)
2232 {
2233   int i, j, n, regno, hard_regno, num;
2234   int *reg_costs;
2235   enum reg_class aclass, rclass;
2236   ira_allocno_t a;
2237   ira_allocno_iterator ai;
2238   cost_classes_t cost_classes_ptr;
2239 
2240   ira_assert (allocno_p);
2241   FOR_EACH_ALLOCNO (a, ai)
2242     {
2243       i = ALLOCNO_NUM (a);
2244       regno = ALLOCNO_REGNO (a);
2245       aclass = regno_aclass[regno];
2246       cost_classes_ptr = regno_cost_classes[regno];
2247       ira_assert (pref[i] == NO_REGS || aclass != NO_REGS);
2248       ALLOCNO_MEMORY_COST (a) = COSTS (costs, i)->mem_cost;
2249       ira_set_allocno_class (a, aclass);
2250       if (aclass == NO_REGS)
2251           continue;
2252       if (optimize && ALLOCNO_CLASS (a) != pref[i])
2253           {
2254             n = ira_class_hard_regs_num[aclass];
2255             ALLOCNO_HARD_REG_COSTS (a)
2256               = reg_costs = ira_allocate_cost_vector (aclass);
2257             for (j = n - 1; j >= 0; j--)
2258               {
2259                 hard_regno = ira_class_hard_regs[aclass][j];
2260                 if (TEST_HARD_REG_BIT (reg_class_contents[pref[i]], hard_regno))
2261                     reg_costs[j] = ALLOCNO_CLASS_COST (a);
2262                 else
2263                     {
2264                       rclass = REGNO_REG_CLASS (hard_regno);
2265                       num = cost_classes_ptr->index[rclass];
2266                       if (num < 0)
2267                         {
2268                           num = cost_classes_ptr->hard_regno_index[hard_regno];
2269                           ira_assert (num >= 0);
2270                         }
2271                       reg_costs[j] = COSTS (costs, i)->cost[num];
2272                     }
2273               }
2274           }
2275     }
2276   if (optimize)
2277     ira_traverse_loop_tree (true, ira_loop_tree_root,
2278                                   process_bb_node_for_hard_reg_moves, NULL);
2279 }
2280 
2281 
2282 
2283 /* Function called once during compiler work.  */
2284 void
ira_init_costs_once(void)2285 ira_init_costs_once (void)
2286 {
2287   int i;
2288 
2289   init_cost = NULL;
2290   for (i = 0; i < MAX_RECOG_OPERANDS; i++)
2291     {
2292       op_costs[i] = NULL;
2293       this_op_costs[i] = NULL;
2294     }
2295   temp_costs = NULL;
2296 }
2297 
2298 /* Free allocated temporary cost vectors.  */
2299 void
free_ira_costs()2300 target_ira_int::free_ira_costs ()
2301 {
2302   int i;
2303 
2304   free (x_init_cost);
2305   x_init_cost = NULL;
2306   for (i = 0; i < MAX_RECOG_OPERANDS; i++)
2307     {
2308       free (x_op_costs[i]);
2309       free (x_this_op_costs[i]);
2310       x_op_costs[i] = x_this_op_costs[i] = NULL;
2311     }
2312   free (x_temp_costs);
2313   x_temp_costs = NULL;
2314 }
2315 
2316 /* This is called each time register related information is
2317    changed.  */
2318 void
ira_init_costs(void)2319 ira_init_costs (void)
2320 {
2321   int i;
2322 
2323   this_target_ira_int->free_ira_costs ();
2324   max_struct_costs_size
2325     = sizeof (struct costs) + sizeof (int) * (ira_important_classes_num - 1);
2326   /* Don't use ira_allocate because vectors live through several IRA
2327      calls.  */
2328   init_cost = (struct costs *) xmalloc (max_struct_costs_size);
2329   init_cost->mem_cost = 1000000;
2330   for (i = 0; i < ira_important_classes_num; i++)
2331     init_cost->cost[i] = 1000000;
2332   for (i = 0; i < MAX_RECOG_OPERANDS; i++)
2333     {
2334       op_costs[i] = (struct costs *) xmalloc (max_struct_costs_size);
2335       this_op_costs[i] = (struct costs *) xmalloc (max_struct_costs_size);
2336     }
2337   temp_costs = (struct costs *) xmalloc (max_struct_costs_size);
2338 }
2339 
2340 
2341 
2342 /* Common initialization function for ira_costs and
2343    ira_set_pseudo_classes.  */
2344 static void
init_costs(void)2345 init_costs (void)
2346 {
2347   init_subregs_of_mode ();
2348   costs = (struct costs *) ira_allocate (max_struct_costs_size
2349                                                    * cost_elements_num);
2350   pref_buffer = (enum reg_class *) ira_allocate (sizeof (enum reg_class)
2351                                                              * cost_elements_num);
2352   regno_aclass = (enum reg_class *) ira_allocate (sizeof (enum reg_class)
2353                                                              * max_reg_num ());
2354   regno_equiv_gains = (int *) ira_allocate (sizeof (int) * max_reg_num ());
2355   memset (regno_equiv_gains, 0, sizeof (int) * max_reg_num ());
2356 }
2357 
2358 /* Common finalization function for ira_costs and
2359    ira_set_pseudo_classes.  */
2360 static void
finish_costs(void)2361 finish_costs (void)
2362 {
2363   finish_subregs_of_mode ();
2364   ira_free (regno_equiv_gains);
2365   ira_free (regno_aclass);
2366   ira_free (pref_buffer);
2367   ira_free (costs);
2368 }
2369 
2370 /* Entry function which defines register class, memory and hard
2371    register costs for each allocno.  */
2372 void
ira_costs(void)2373 ira_costs (void)
2374 {
2375   allocno_p = true;
2376   cost_elements_num = ira_allocnos_num;
2377   init_costs ();
2378   total_allocno_costs = (struct costs *) ira_allocate (max_struct_costs_size
2379                                                                    * ira_allocnos_num);
2380   initiate_regno_cost_classes ();
2381   calculate_elim_costs_all_insns ();
2382   find_costs_and_classes (ira_dump_file);
2383   setup_allocno_class_and_costs ();
2384   finish_regno_cost_classes ();
2385   finish_costs ();
2386   ira_free (total_allocno_costs);
2387 }
2388 
2389 /* Entry function which defines classes for pseudos.
2390    Set pseudo_classes_defined_p only if DEFINE_PSEUDO_CLASSES is true.  */
2391 void
ira_set_pseudo_classes(bool define_pseudo_classes,FILE * dump_file)2392 ira_set_pseudo_classes (bool define_pseudo_classes, FILE *dump_file)
2393 {
2394   allocno_p = false;
2395   internal_flag_ira_verbose = flag_ira_verbose;
2396   cost_elements_num = max_reg_num ();
2397   init_costs ();
2398   initiate_regno_cost_classes ();
2399   find_costs_and_classes (dump_file);
2400   finish_regno_cost_classes ();
2401   if (define_pseudo_classes)
2402     pseudo_classes_defined_p = true;
2403 
2404   finish_costs ();
2405 }
2406 
2407 
2408 
2409 /* Change hard register costs for allocnos which lives through
2410    function calls.  This is called only when we found all intersected
2411    calls during building allocno live ranges.  */
2412 void
ira_tune_allocno_costs(void)2413 ira_tune_allocno_costs (void)
2414 {
2415   int j, n, regno;
2416   int cost, min_cost, *reg_costs;
2417   enum reg_class aclass;
2418   machine_mode mode;
2419   ira_allocno_t a;
2420   ira_allocno_iterator ai;
2421   ira_allocno_object_iterator oi;
2422   ira_object_t obj;
2423   bool skip_p;
2424 
2425   FOR_EACH_ALLOCNO (a, ai)
2426     {
2427       aclass = ALLOCNO_CLASS (a);
2428       if (aclass == NO_REGS)
2429           continue;
2430       mode = ALLOCNO_MODE (a);
2431       n = ira_class_hard_regs_num[aclass];
2432       min_cost = INT_MAX;
2433       if (ALLOCNO_CALLS_CROSSED_NUM (a)
2434             != ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a))
2435           {
2436             ira_allocate_and_set_costs
2437               (&ALLOCNO_HARD_REG_COSTS (a), aclass,
2438                ALLOCNO_CLASS_COST (a));
2439             reg_costs = ALLOCNO_HARD_REG_COSTS (a);
2440             for (j = n - 1; j >= 0; j--)
2441               {
2442                 regno = ira_class_hard_regs[aclass][j];
2443                 skip_p = false;
2444                 FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
2445                     {
2446                       if (ira_hard_reg_set_intersection_p (regno, mode,
2447                                                                    OBJECT_CONFLICT_HARD_REGS
2448                                                                    (obj)))
2449                         {
2450                           skip_p = true;
2451                           break;
2452                         }
2453                     }
2454                 if (skip_p)
2455                     continue;
2456                 cost = 0;
2457                 if (ira_need_caller_save_p (a, regno))
2458                     cost += ira_caller_save_cost (a);
2459 #ifdef IRA_HARD_REGNO_ADD_COST_MULTIPLIER
2460                 {
2461                     auto rclass = REGNO_REG_CLASS (regno);
2462                     cost += ((ira_memory_move_cost[mode][rclass][0]
2463                                 + ira_memory_move_cost[mode][rclass][1])
2464                                * ALLOCNO_FREQ (a)
2465                                * IRA_HARD_REGNO_ADD_COST_MULTIPLIER (regno) / 2);
2466                 }
2467 #endif
2468                 if (INT_MAX - cost < reg_costs[j])
2469                     reg_costs[j] = INT_MAX;
2470                 else
2471                     reg_costs[j] += cost;
2472                 if (min_cost > reg_costs[j])
2473                     min_cost = reg_costs[j];
2474               }
2475           }
2476       if (min_cost != INT_MAX)
2477           ALLOCNO_CLASS_COST (a) = min_cost;
2478 
2479       /* Some targets allow pseudos to be allocated to unaligned sequences
2480            of hard registers.  However, selecting an unaligned sequence can
2481            unnecessarily restrict later allocations.  So increase the cost of
2482            unaligned hard regs to encourage the use of aligned hard regs.  */
2483       {
2484           const int nregs = ira_reg_class_max_nregs[aclass][ALLOCNO_MODE (a)];
2485 
2486           if (nregs > 1)
2487             {
2488               ira_allocate_and_set_costs
2489                 (&ALLOCNO_HARD_REG_COSTS (a), aclass, ALLOCNO_CLASS_COST (a));
2490               reg_costs = ALLOCNO_HARD_REG_COSTS (a);
2491               for (j = n - 1; j >= 0; j--)
2492                 {
2493                     regno = ira_non_ordered_class_hard_regs[aclass][j];
2494                     if ((regno % nregs) != 0)
2495                       {
2496                         int index = ira_class_hard_reg_index[aclass][regno];
2497                         ira_assert (index != -1);
2498                         reg_costs[index] += ALLOCNO_FREQ (a);
2499                       }
2500                 }
2501             }
2502       }
2503     }
2504 }
2505 
2506 /* Add COST to the estimated gain for eliminating REGNO with its
2507    equivalence.  If COST is zero, record that no such elimination is
2508    possible.  */
2509 
2510 void
ira_adjust_equiv_reg_cost(unsigned regno,int cost)2511 ira_adjust_equiv_reg_cost (unsigned regno, int cost)
2512 {
2513   if (cost == 0)
2514     regno_equiv_gains[regno] = 0;
2515   else
2516     regno_equiv_gains[regno] += cost;
2517 }
2518 
2519 void
ira_costs_cc_finalize(void)2520 ira_costs_cc_finalize (void)
2521 {
2522   this_target_ira_int->free_ira_costs ();
2523 }
2524