xref: /dragonfly/contrib/gcc-8.0/gcc/stmt.c (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1 /* Expands front end tree to back end RTL for GCC
2    Copyright (C) 1987-2018 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 /* This file handles the generation of rtl code from tree structure
21    above the level of expressions, using subroutines in exp*.c and emit-rtl.c.
22    The functions whose names start with `expand_' are called by the
23    expander to generate RTL instructions for various kinds of constructs.  */
24 
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "backend.h"
29 #include "target.h"
30 #include "rtl.h"
31 #include "tree.h"
32 #include "gimple.h"
33 #include "cfghooks.h"
34 #include "predict.h"
35 #include "memmodel.h"
36 #include "tm_p.h"
37 #include "optabs.h"
38 #include "regs.h"
39 #include "emit-rtl.h"
40 #include "pretty-print.h"
41 #include "diagnostic-core.h"
42 
43 #include "fold-const.h"
44 #include "varasm.h"
45 #include "stor-layout.h"
46 #include "dojump.h"
47 #include "explow.h"
48 #include "stmt.h"
49 #include "expr.h"
50 #include "langhooks.h"
51 #include "cfganal.h"
52 #include "tree-cfg.h"
53 #include "params.h"
54 #include "dumpfile.h"
55 #include "builtins.h"
56 
57 
58 /* Functions and data structures for expanding case statements.  */
59 
60 /* Case label structure, used to hold info on labels within case
61    statements.  We handle "range" labels; for a single-value label
62    as in C, the high and low limits are the same.
63 
64    We start with a vector of case nodes sorted in ascending order, and
65    the default label as the last element in the vector.
66 
67    Switch statements are expanded in jump table form.
68 
69 */
70 
71 struct simple_case_node
72 {
simple_case_nodesimple_case_node73   simple_case_node (tree low, tree high, tree code_label):
74     m_low (low), m_high (high), m_code_label (code_label)
75   {}
76 
77   /* Lowest index value for this label.  */
78   tree m_low;
79   /* Highest index value for this label.  */
80   tree m_high;
81   /* Label to jump to when node matches.  */
82   tree m_code_label;
83 };
84 
85 extern basic_block label_to_block_fn (struct function *, tree);
86 
87 static bool check_unique_operand_names (tree, tree, tree);
88 static char *resolve_operand_name_1 (char *, tree, tree, tree);
89 
90 /* Return the rtx-label that corresponds to a LABEL_DECL,
91    creating it if necessary.  */
92 
93 rtx_insn *
label_rtx(tree label)94 label_rtx (tree label)
95 {
96   gcc_assert (TREE_CODE (label) == LABEL_DECL);
97 
98   if (!DECL_RTL_SET_P (label))
99     {
100       rtx_code_label *r = gen_label_rtx ();
101       SET_DECL_RTL (label, r);
102       if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
103           LABEL_PRESERVE_P (r) = 1;
104     }
105 
106   return as_a <rtx_insn *> (DECL_RTL (label));
107 }
108 
109 /* As above, but also put it on the forced-reference list of the
110    function that contains it.  */
111 rtx_insn *
force_label_rtx(tree label)112 force_label_rtx (tree label)
113 {
114   rtx_insn *ref = label_rtx (label);
115   tree function = decl_function_context (label);
116 
117   gcc_assert (function);
118 
119   vec_safe_push (forced_labels, ref);
120   return ref;
121 }
122 
123 /* As label_rtx, but ensures (in check build), that returned value is
124    an existing label (i.e. rtx with code CODE_LABEL).  */
125 rtx_code_label *
jump_target_rtx(tree label)126 jump_target_rtx (tree label)
127 {
128   return as_a <rtx_code_label *> (label_rtx (label));
129 }
130 
131 /* Add an unconditional jump to LABEL as the next sequential instruction.  */
132 
133 void
emit_jump(rtx label)134 emit_jump (rtx label)
135 {
136   do_pending_stack_adjust ();
137   emit_jump_insn (targetm.gen_jump (label));
138   emit_barrier ();
139 }
140 
141 /* Handle goto statements and the labels that they can go to.  */
142 
143 /* Specify the location in the RTL code of a label LABEL,
144    which is a LABEL_DECL tree node.
145 
146    This is used for the kind of label that the user can jump to with a
147    goto statement, and for alternatives of a switch or case statement.
148    RTL labels generated for loops and conditionals don't go through here;
149    they are generated directly at the RTL level, by other functions below.
150 
151    Note that this has nothing to do with defining label *names*.
152    Languages vary in how they do that and what that even means.  */
153 
154 void
expand_label(tree label)155 expand_label (tree label)
156 {
157   rtx_code_label *label_r = jump_target_rtx (label);
158 
159   do_pending_stack_adjust ();
160   emit_label (label_r);
161   if (DECL_NAME (label))
162     LABEL_NAME (DECL_RTL (label)) = IDENTIFIER_POINTER (DECL_NAME (label));
163 
164   if (DECL_NONLOCAL (label))
165     {
166       expand_builtin_setjmp_receiver (NULL);
167       nonlocal_goto_handler_labels
168           = gen_rtx_INSN_LIST (VOIDmode, label_r,
169                                    nonlocal_goto_handler_labels);
170     }
171 
172   if (FORCED_LABEL (label))
173     vec_safe_push<rtx_insn *> (forced_labels, label_r);
174 
175   if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
176     maybe_set_first_label_num (label_r);
177 }
178 
179 /* Parse the output constraint pointed to by *CONSTRAINT_P.  It is the
180    OPERAND_NUMth output operand, indexed from zero.  There are NINPUTS
181    inputs and NOUTPUTS outputs to this extended-asm.  Upon return,
182    *ALLOWS_MEM will be TRUE iff the constraint allows the use of a
183    memory operand.  Similarly, *ALLOWS_REG will be TRUE iff the
184    constraint allows the use of a register operand.  And, *IS_INOUT
185    will be true if the operand is read-write, i.e., if it is used as
186    an input as well as an output.  If *CONSTRAINT_P is not in
187    canonical form, it will be made canonical.  (Note that `+' will be
188    replaced with `=' as part of this process.)
189 
190    Returns TRUE if all went well; FALSE if an error occurred.  */
191 
192 bool
parse_output_constraint(const char ** constraint_p,int operand_num,int ninputs,int noutputs,bool * allows_mem,bool * allows_reg,bool * is_inout)193 parse_output_constraint (const char **constraint_p, int operand_num,
194                                int ninputs, int noutputs, bool *allows_mem,
195                                bool *allows_reg, bool *is_inout)
196 {
197   const char *constraint = *constraint_p;
198   const char *p;
199 
200   /* Assume the constraint doesn't allow the use of either a register
201      or memory.  */
202   *allows_mem = false;
203   *allows_reg = false;
204 
205   /* Allow the `=' or `+' to not be at the beginning of the string,
206      since it wasn't explicitly documented that way, and there is a
207      large body of code that puts it last.  Swap the character to
208      the front, so as not to uglify any place else.  */
209   p = strchr (constraint, '=');
210   if (!p)
211     p = strchr (constraint, '+');
212 
213   /* If the string doesn't contain an `=', issue an error
214      message.  */
215   if (!p)
216     {
217       error ("output operand constraint lacks %<=%>");
218       return false;
219     }
220 
221   /* If the constraint begins with `+', then the operand is both read
222      from and written to.  */
223   *is_inout = (*p == '+');
224 
225   /* Canonicalize the output constraint so that it begins with `='.  */
226   if (p != constraint || *is_inout)
227     {
228       char *buf;
229       size_t c_len = strlen (constraint);
230 
231       if (p != constraint)
232           warning (0, "output constraint %qc for operand %d "
233                      "is not at the beginning",
234                      *p, operand_num);
235 
236       /* Make a copy of the constraint.  */
237       buf = XALLOCAVEC (char, c_len + 1);
238       strcpy (buf, constraint);
239       /* Swap the first character and the `=' or `+'.  */
240       buf[p - constraint] = buf[0];
241       /* Make sure the first character is an `='.  (Until we do this,
242            it might be a `+'.)  */
243       buf[0] = '=';
244       /* Replace the constraint with the canonicalized string.  */
245       *constraint_p = ggc_alloc_string (buf, c_len);
246       constraint = *constraint_p;
247     }
248 
249   /* Loop through the constraint string.  */
250   for (p = constraint + 1; *p; )
251     {
252       switch (*p)
253           {
254           case '+':
255           case '=':
256             error ("operand constraint contains incorrectly positioned "
257                      "%<+%> or %<=%>");
258             return false;
259 
260           case '%':
261             if (operand_num + 1 == ninputs + noutputs)
262               {
263                 error ("%<%%%> constraint used with last operand");
264                 return false;
265               }
266             break;
267 
268           case '?':  case '!':  case '*':  case '&':  case '#':
269           case '$':  case '^':
270           case 'E':  case 'F':  case 'G':  case 'H':
271           case 's':  case 'i':  case 'n':
272           case 'I':  case 'J':  case 'K':  case 'L':  case 'M':
273           case 'N':  case 'O':  case 'P':  case ',':
274             break;
275 
276           case '0':  case '1':  case '2':  case '3':  case '4':
277           case '5':  case '6':  case '7':  case '8':  case '9':
278           case '[':
279             error ("matching constraint not valid in output operand");
280             return false;
281 
282           case '<':  case '>':
283             /* ??? Before flow, auto inc/dec insns are not supposed to exist,
284                excepting those that expand_call created.  So match memory
285                and hope.  */
286             *allows_mem = true;
287             break;
288 
289           case 'g':  case 'X':
290             *allows_reg = true;
291             *allows_mem = true;
292             break;
293 
294           default:
295             if (!ISALPHA (*p))
296               break;
297             enum constraint_num cn = lookup_constraint (p);
298             if (reg_class_for_constraint (cn) != NO_REGS
299                 || insn_extra_address_constraint (cn))
300               *allows_reg = true;
301             else if (insn_extra_memory_constraint (cn))
302               *allows_mem = true;
303             else
304               insn_extra_constraint_allows_reg_mem (cn, allows_reg, allows_mem);
305             break;
306           }
307 
308       for (size_t len = CONSTRAINT_LEN (*p, p); len; len--, p++)
309           if (*p == '\0')
310             break;
311     }
312 
313   return true;
314 }
315 
316 /* Similar, but for input constraints.  */
317 
318 bool
parse_input_constraint(const char ** constraint_p,int input_num,int ninputs,int noutputs,int ninout,const char * const * constraints,bool * allows_mem,bool * allows_reg)319 parse_input_constraint (const char **constraint_p, int input_num,
320                               int ninputs, int noutputs, int ninout,
321                               const char * const * constraints,
322                               bool *allows_mem, bool *allows_reg)
323 {
324   const char *constraint = *constraint_p;
325   const char *orig_constraint = constraint;
326   size_t c_len = strlen (constraint);
327   size_t j;
328   bool saw_match = false;
329 
330   /* Assume the constraint doesn't allow the use of either
331      a register or memory.  */
332   *allows_mem = false;
333   *allows_reg = false;
334 
335   /* Make sure constraint has neither `=', `+', nor '&'.  */
336 
337   for (j = 0; j < c_len; j += CONSTRAINT_LEN (constraint[j], constraint+j))
338     switch (constraint[j])
339       {
340       case '+':  case '=':  case '&':
341           if (constraint == orig_constraint)
342             {
343               error ("input operand constraint contains %qc", constraint[j]);
344               return false;
345             }
346           break;
347 
348       case '%':
349           if (constraint == orig_constraint
350               && input_num + 1 == ninputs - ninout)
351             {
352               error ("%<%%%> constraint used with last operand");
353               return false;
354             }
355           break;
356 
357       case '<':  case '>':
358       case '?':  case '!':  case '*':  case '#':
359       case '$':  case '^':
360       case 'E':  case 'F':  case 'G':  case 'H':
361       case 's':  case 'i':  case 'n':
362       case 'I':  case 'J':  case 'K':  case 'L':  case 'M':
363       case 'N':  case 'O':  case 'P':  case ',':
364           break;
365 
366           /* Whether or not a numeric constraint allows a register is
367              decided by the matching constraint, and so there is no need
368              to do anything special with them.  We must handle them in
369              the default case, so that we don't unnecessarily force
370              operands to memory.  */
371       case '0':  case '1':  case '2':  case '3':  case '4':
372       case '5':  case '6':  case '7':  case '8':  case '9':
373           {
374             char *end;
375             unsigned long match;
376 
377             saw_match = true;
378 
379             match = strtoul (constraint + j, &end, 10);
380             if (match >= (unsigned long) noutputs)
381               {
382                 error ("matching constraint references invalid operand number");
383                 return false;
384               }
385 
386             /* Try and find the real constraint for this dup.  Only do this
387                if the matching constraint is the only alternative.  */
388             if (*end == '\0'
389                 && (j == 0 || (j == 1 && constraint[0] == '%')))
390               {
391                 constraint = constraints[match];
392                 *constraint_p = constraint;
393                 c_len = strlen (constraint);
394                 j = 0;
395                 /* ??? At the end of the loop, we will skip the first part of
396                      the matched constraint.  This assumes not only that the
397                      other constraint is an output constraint, but also that
398                      the '=' or '+' come first.  */
399                 break;
400               }
401             else
402               j = end - constraint;
403             /* Anticipate increment at end of loop.  */
404             j--;
405           }
406           /* Fall through.  */
407 
408       case 'g':  case 'X':
409           *allows_reg = true;
410           *allows_mem = true;
411           break;
412 
413       default:
414           if (! ISALPHA (constraint[j]))
415             {
416               error ("invalid punctuation %qc in constraint", constraint[j]);
417               return false;
418             }
419           enum constraint_num cn = lookup_constraint (constraint + j);
420           if (reg_class_for_constraint (cn) != NO_REGS
421               || insn_extra_address_constraint (cn))
422             *allows_reg = true;
423           else if (insn_extra_memory_constraint (cn)
424                      || insn_extra_special_memory_constraint (cn))
425             *allows_mem = true;
426           else
427             insn_extra_constraint_allows_reg_mem (cn, allows_reg, allows_mem);
428           break;
429       }
430 
431   if (saw_match && !*allows_reg)
432     warning (0, "matching constraint does not allow a register");
433 
434   return true;
435 }
436 
437 /* Return DECL iff there's an overlap between *REGS and DECL, where DECL
438    can be an asm-declared register.  Called via walk_tree.  */
439 
440 static tree
decl_overlaps_hard_reg_set_p(tree * declp,int * walk_subtrees ATTRIBUTE_UNUSED,void * data)441 decl_overlaps_hard_reg_set_p (tree *declp, int *walk_subtrees ATTRIBUTE_UNUSED,
442                                     void *data)
443 {
444   tree decl = *declp;
445   const HARD_REG_SET *const regs = (const HARD_REG_SET *) data;
446 
447   if (VAR_P (decl))
448     {
449       if (DECL_HARD_REGISTER (decl)
450             && REG_P (DECL_RTL (decl))
451             && REGNO (DECL_RTL (decl)) < FIRST_PSEUDO_REGISTER)
452           {
453             rtx reg = DECL_RTL (decl);
454 
455             if (overlaps_hard_reg_set_p (*regs, GET_MODE (reg), REGNO (reg)))
456               return decl;
457           }
458       walk_subtrees = 0;
459     }
460   else if (TYPE_P (decl) || TREE_CODE (decl) == PARM_DECL)
461     walk_subtrees = 0;
462   return NULL_TREE;
463 }
464 
465 /* If there is an overlap between *REGS and DECL, return the first overlap
466    found.  */
467 tree
tree_overlaps_hard_reg_set(tree decl,HARD_REG_SET * regs)468 tree_overlaps_hard_reg_set (tree decl, HARD_REG_SET *regs)
469 {
470   return walk_tree (&decl, decl_overlaps_hard_reg_set_p, regs, NULL);
471 }
472 
473 
474 /* A subroutine of expand_asm_operands.  Check that all operand names
475    are unique.  Return true if so.  We rely on the fact that these names
476    are identifiers, and so have been canonicalized by get_identifier,
477    so all we need are pointer comparisons.  */
478 
479 static bool
check_unique_operand_names(tree outputs,tree inputs,tree labels)480 check_unique_operand_names (tree outputs, tree inputs, tree labels)
481 {
482   tree i, j, i_name = NULL_TREE;
483 
484   for (i = outputs; i ; i = TREE_CHAIN (i))
485     {
486       i_name = TREE_PURPOSE (TREE_PURPOSE (i));
487       if (! i_name)
488           continue;
489 
490       for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
491           if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
492             goto failure;
493     }
494 
495   for (i = inputs; i ; i = TREE_CHAIN (i))
496     {
497       i_name = TREE_PURPOSE (TREE_PURPOSE (i));
498       if (! i_name)
499           continue;
500 
501       for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
502           if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
503             goto failure;
504       for (j = outputs; j ; j = TREE_CHAIN (j))
505           if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
506             goto failure;
507     }
508 
509   for (i = labels; i ; i = TREE_CHAIN (i))
510     {
511       i_name = TREE_PURPOSE (i);
512       if (! i_name)
513           continue;
514 
515       for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
516           if (simple_cst_equal (i_name, TREE_PURPOSE (j)))
517             goto failure;
518       for (j = inputs; j ; j = TREE_CHAIN (j))
519           if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
520             goto failure;
521     }
522 
523   return true;
524 
525  failure:
526   error ("duplicate asm operand name %qs", TREE_STRING_POINTER (i_name));
527   return false;
528 }
529 
530 /* Resolve the names of the operands in *POUTPUTS and *PINPUTS to numbers,
531    and replace the name expansions in STRING and in the constraints to
532    those numbers.  This is generally done in the front end while creating
533    the ASM_EXPR generic tree that eventually becomes the GIMPLE_ASM.  */
534 
535 tree
resolve_asm_operand_names(tree string,tree outputs,tree inputs,tree labels)536 resolve_asm_operand_names (tree string, tree outputs, tree inputs, tree labels)
537 {
538   char *buffer;
539   char *p;
540   const char *c;
541   tree t;
542 
543   check_unique_operand_names (outputs, inputs, labels);
544 
545   /* Substitute [<name>] in input constraint strings.  There should be no
546      named operands in output constraints.  */
547   for (t = inputs; t ; t = TREE_CHAIN (t))
548     {
549       c = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
550       if (strchr (c, '[') != NULL)
551           {
552             p = buffer = xstrdup (c);
553             while ((p = strchr (p, '[')) != NULL)
554               p = resolve_operand_name_1 (p, outputs, inputs, NULL);
555             TREE_VALUE (TREE_PURPOSE (t))
556               = build_string (strlen (buffer), buffer);
557             free (buffer);
558           }
559     }
560 
561   /* Now check for any needed substitutions in the template.  */
562   c = TREE_STRING_POINTER (string);
563   while ((c = strchr (c, '%')) != NULL)
564     {
565       if (c[1] == '[')
566           break;
567       else if (ISALPHA (c[1]) && c[2] == '[')
568           break;
569       else
570           {
571             c += 1 + (c[1] == '%');
572             continue;
573           }
574     }
575 
576   if (c)
577     {
578       /* OK, we need to make a copy so we can perform the substitutions.
579            Assume that we will not need extra space--we get to remove '['
580            and ']', which means we cannot have a problem until we have more
581            than 999 operands.  */
582       buffer = xstrdup (TREE_STRING_POINTER (string));
583       p = buffer + (c - TREE_STRING_POINTER (string));
584 
585       while ((p = strchr (p, '%')) != NULL)
586           {
587             if (p[1] == '[')
588               p += 1;
589             else if (ISALPHA (p[1]) && p[2] == '[')
590               p += 2;
591             else
592               {
593                 p += 1 + (p[1] == '%');
594                 continue;
595               }
596 
597             p = resolve_operand_name_1 (p, outputs, inputs, labels);
598           }
599 
600       string = build_string (strlen (buffer), buffer);
601       free (buffer);
602     }
603 
604   return string;
605 }
606 
607 /* A subroutine of resolve_operand_names.  P points to the '[' for a
608    potential named operand of the form [<name>].  In place, replace
609    the name and brackets with a number.  Return a pointer to the
610    balance of the string after substitution.  */
611 
612 static char *
resolve_operand_name_1(char * p,tree outputs,tree inputs,tree labels)613 resolve_operand_name_1 (char *p, tree outputs, tree inputs, tree labels)
614 {
615   char *q;
616   int op;
617   tree t;
618 
619   /* Collect the operand name.  */
620   q = strchr (++p, ']');
621   if (!q)
622     {
623       error ("missing close brace for named operand");
624       return strchr (p, '\0');
625     }
626   *q = '\0';
627 
628   /* Resolve the name to a number.  */
629   for (op = 0, t = outputs; t ; t = TREE_CHAIN (t), op++)
630     {
631       tree name = TREE_PURPOSE (TREE_PURPOSE (t));
632       if (name && strcmp (TREE_STRING_POINTER (name), p) == 0)
633           goto found;
634     }
635   for (t = inputs; t ; t = TREE_CHAIN (t), op++)
636     {
637       tree name = TREE_PURPOSE (TREE_PURPOSE (t));
638       if (name && strcmp (TREE_STRING_POINTER (name), p) == 0)
639           goto found;
640     }
641   for (t = labels; t ; t = TREE_CHAIN (t), op++)
642     {
643       tree name = TREE_PURPOSE (t);
644       if (name && strcmp (TREE_STRING_POINTER (name), p) == 0)
645           goto found;
646     }
647 
648   error ("undefined named operand %qs", identifier_to_locale (p));
649   op = 0;
650 
651  found:
652   /* Replace the name with the number.  Unfortunately, not all libraries
653      get the return value of sprintf correct, so search for the end of the
654      generated string by hand.  */
655   sprintf (--p, "%d", op);
656   p = strchr (p, '\0');
657 
658   /* Verify the no extra buffer space assumption.  */
659   gcc_assert (p <= q);
660 
661   /* Shift the rest of the buffer down to fill the gap.  */
662   memmove (p, q + 1, strlen (q + 1) + 1);
663 
664   return p;
665 }
666 
667 
668 /* Generate RTL to return directly from the current function.
669    (That is, we bypass any return value.)  */
670 
671 void
expand_naked_return(void)672 expand_naked_return (void)
673 {
674   rtx_code_label *end_label;
675 
676   clear_pending_stack_adjust ();
677   do_pending_stack_adjust ();
678 
679   end_label = naked_return_label;
680   if (end_label == 0)
681     end_label = naked_return_label = gen_label_rtx ();
682 
683   emit_jump (end_label);
684 }
685 
686 /* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. PROB
687    is the probability of jumping to LABEL.  */
688 static void
do_jump_if_equal(machine_mode mode,rtx op0,rtx op1,rtx_code_label * label,int unsignedp,profile_probability prob)689 do_jump_if_equal (machine_mode mode, rtx op0, rtx op1, rtx_code_label *label,
690                       int unsignedp, profile_probability prob)
691 {
692   do_compare_rtx_and_jump (op0, op1, EQ, unsignedp, mode,
693                                  NULL_RTX, NULL, label, prob);
694 }
695 
696 /* Return the sum of probabilities of outgoing edges of basic block BB.  */
697 
698 static profile_probability
get_outgoing_edge_probs(basic_block bb)699 get_outgoing_edge_probs (basic_block bb)
700 {
701   edge e;
702   edge_iterator ei;
703   profile_probability prob_sum = profile_probability::never ();
704   if (!bb)
705     return profile_probability::never ();
706   FOR_EACH_EDGE (e, ei, bb->succs)
707     prob_sum += e->probability;
708   return prob_sum;
709 }
710 
711 /* Computes the conditional probability of jumping to a target if the branch
712    instruction is executed.
713    TARGET_PROB is the estimated probability of jumping to a target relative
714    to some basic block BB.
715    BASE_PROB is the probability of reaching the branch instruction relative
716    to the same basic block BB.  */
717 
718 static inline profile_probability
conditional_probability(profile_probability target_prob,profile_probability base_prob)719 conditional_probability (profile_probability target_prob,
720                                profile_probability base_prob)
721 {
722   return target_prob / base_prob;
723 }
724 
725 /* Generate a dispatch tabler, switching on INDEX_EXPR and jumping to
726    one of the labels in CASE_LIST or to the DEFAULT_LABEL.
727    MINVAL, MAXVAL, and RANGE are the extrema and range of the case
728    labels in CASE_LIST. STMT_BB is the basic block containing the statement.
729 
730    First, a jump insn is emitted.  First we try "casesi".  If that
731    fails, try "tablejump".   A target *must* have one of them (or both).
732 
733    Then, a table with the target labels is emitted.
734 
735    The process is unaware of the CFG.  The caller has to fix up
736    the CFG itself.  This is done in cfgexpand.c.  */
737 
738 static void
emit_case_dispatch_table(tree index_expr,tree index_type,auto_vec<simple_case_node> & case_list,rtx default_label,edge default_edge,tree minval,tree maxval,tree range,basic_block stmt_bb)739 emit_case_dispatch_table (tree index_expr, tree index_type,
740                                 auto_vec<simple_case_node> &case_list,
741                                 rtx default_label,
742                                 edge default_edge,  tree minval, tree maxval,
743                                 tree range, basic_block stmt_bb)
744 {
745   int i, ncases;
746   rtx *labelvec;
747   rtx_insn *fallback_label = label_rtx (case_list[0].m_code_label);
748   rtx_code_label *table_label = gen_label_rtx ();
749   bool has_gaps = false;
750   profile_probability default_prob = default_edge ? default_edge->probability
751                                                               : profile_probability::never ();
752   profile_probability base = get_outgoing_edge_probs (stmt_bb);
753   bool try_with_tablejump = false;
754 
755   profile_probability new_default_prob = conditional_probability (default_prob,
756                                                                                   base);
757 
758   if (! try_casesi (index_type, index_expr, minval, range,
759                         table_label, default_label, fallback_label,
760                     new_default_prob))
761     {
762       /* Index jumptables from zero for suitable values of minval to avoid
763            a subtraction.  For the rationale see:
764            "http://gcc.gnu.org/ml/gcc-patches/2001-10/msg01234.html".  */
765       if (optimize_insn_for_speed_p ()
766             && compare_tree_int (minval, 0) > 0
767             && compare_tree_int (minval, 3) < 0)
768           {
769             minval = build_int_cst (index_type, 0);
770             range = maxval;
771           has_gaps = true;
772           }
773       try_with_tablejump = true;
774     }
775 
776   /* Get table of labels to jump to, in order of case index.  */
777 
778   ncases = tree_to_shwi (range) + 1;
779   labelvec = XALLOCAVEC (rtx, ncases);
780   memset (labelvec, 0, ncases * sizeof (rtx));
781 
782   for (unsigned j = 0; j < case_list.length (); j++)
783     {
784       simple_case_node *n = &case_list[j];
785       /* Compute the low and high bounds relative to the minimum
786            value since that should fit in a HOST_WIDE_INT while the
787            actual values may not.  */
788       HOST_WIDE_INT i_low
789           = tree_to_uhwi (fold_build2 (MINUS_EXPR, index_type,
790                                              n->m_low, minval));
791       HOST_WIDE_INT i_high
792           = tree_to_uhwi (fold_build2 (MINUS_EXPR, index_type,
793                                              n->m_high, minval));
794       HOST_WIDE_INT i;
795 
796       for (i = i_low; i <= i_high; i ++)
797           labelvec[i]
798             = gen_rtx_LABEL_REF (Pmode, label_rtx (n->m_code_label));
799     }
800 
801   /* The dispatch table may contain gaps, including at the beginning of
802      the table if we tried to avoid the minval subtraction.  We fill the
803      dispatch table slots associated with the gaps with the default case label.
804      However, in the event the default case is unreachable, we then use
805      any label from one of the case statements.  */
806   rtx gap_label = (default_label) ? default_label : fallback_label;
807 
808   for (i = 0; i < ncases; i++)
809     if (labelvec[i] == 0)
810       {
811           has_gaps = true;
812           labelvec[i] = gen_rtx_LABEL_REF (Pmode, gap_label);
813       }
814 
815   if (has_gaps && default_label)
816     {
817       /* There is at least one entry in the jump table that jumps
818          to default label. The default label can either be reached
819          through the indirect jump or the direct conditional jump
820          before that. Split the probability of reaching the
821          default label among these two jumps.  */
822       new_default_prob
823           = conditional_probability (default_prob.apply_scale (1, 2), base);
824       default_prob = default_prob.apply_scale (1, 2);
825       base -= default_prob;
826     }
827   else
828     {
829       base -= default_prob;
830       default_prob = profile_probability::never ();
831     }
832 
833   if (default_edge)
834     default_edge->probability = default_prob;
835 
836   /* We have altered the probability of the default edge. So the probabilities
837      of all other edges need to be adjusted so that it sums up to
838      REG_BR_PROB_BASE.  */
839   if (base > profile_probability::never ())
840     {
841       edge e;
842       edge_iterator ei;
843       FOR_EACH_EDGE (e, ei, stmt_bb->succs)
844         e->probability /= base;
845     }
846 
847   if (try_with_tablejump)
848     {
849       bool ok = try_tablejump (index_type, index_expr, minval, range,
850                                table_label, default_label, new_default_prob);
851       gcc_assert (ok);
852     }
853   /* Output the table.  */
854   emit_label (table_label);
855 
856   if (CASE_VECTOR_PC_RELATIVE || flag_pic)
857     emit_jump_table_data (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
858                                                              gen_rtx_LABEL_REF (Pmode,
859                                                                                     table_label),
860                                                              gen_rtvec_v (ncases, labelvec),
861                                                              const0_rtx, const0_rtx));
862   else
863     emit_jump_table_data (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE,
864                                                       gen_rtvec_v (ncases, labelvec)));
865 
866   /* Record no drop-through after the table.  */
867   emit_barrier ();
868 }
869 
870 /* Terminate a case Ada or switch (C) statement
871    in which ORIG_INDEX is the expression to be tested.
872    If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
873    type as given in the source before any compiler conversions.
874    Generate the code to test it and jump to the right place.  */
875 
876 void
expand_case(gswitch * stmt)877 expand_case (gswitch *stmt)
878 {
879   tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE;
880   rtx_code_label *default_label;
881   unsigned int count;
882   int i;
883   int ncases = gimple_switch_num_labels (stmt);
884   tree index_expr = gimple_switch_index (stmt);
885   tree index_type = TREE_TYPE (index_expr);
886   tree elt;
887   basic_block bb = gimple_bb (stmt);
888 
889   auto_vec<simple_case_node> case_list;
890 
891   /* An ERROR_MARK occurs for various reasons including invalid data type.
892      ??? Can this still happen, with GIMPLE and all?  */
893   if (index_type == error_mark_node)
894     return;
895 
896   /* cleanup_tree_cfg removes all SWITCH_EXPR with their index
897      expressions being INTEGER_CST.  */
898   gcc_assert (TREE_CODE (index_expr) != INTEGER_CST);
899 
900   /* Optimization of switch statements with only one label has already
901      occurred, so we should never see them at this point.  */
902   gcc_assert (ncases > 1);
903 
904   do_pending_stack_adjust ();
905 
906   /* Find the default case target label.  */
907   tree default_lab = CASE_LABEL (gimple_switch_default_label (stmt));
908   default_label = jump_target_rtx (default_lab);
909   basic_block default_bb = label_to_block_fn (cfun, default_lab);
910   edge default_edge = find_edge (bb, default_bb);
911 
912   /* Get upper and lower bounds of case values.  */
913   elt = gimple_switch_label (stmt, 1);
914   minval = fold_convert (index_type, CASE_LOW (elt));
915   elt = gimple_switch_label (stmt, ncases - 1);
916   if (CASE_HIGH (elt))
917     maxval = fold_convert (index_type, CASE_HIGH (elt));
918   else
919     maxval = fold_convert (index_type, CASE_LOW (elt));
920 
921   /* Compute span of values.  */
922   range = fold_build2 (MINUS_EXPR, index_type, maxval, minval);
923 
924   /* Listify the labels queue and gather some numbers to decide
925      how to expand this switch().  */
926   count = 0;
927 
928   for (i = ncases - 1; i >= 1; --i)
929     {
930       elt = gimple_switch_label (stmt, i);
931       tree low = CASE_LOW (elt);
932       gcc_assert (low);
933       tree high = CASE_HIGH (elt);
934       gcc_assert (! high || tree_int_cst_lt (low, high));
935       tree lab = CASE_LABEL (elt);
936 
937       /* Count the elements.
938            A range counts double, since it requires two compares.  */
939       count++;
940       if (high)
941           count++;
942 
943       /* The bounds on the case range, LOW and HIGH, have to be converted
944            to case's index type TYPE.  Note that the original type of the
945            case index in the source code is usually "lost" during
946            gimplification due to type promotion, but the case labels retain the
947            original type.  Make sure to drop overflow flags.  */
948       low = fold_convert (index_type, low);
949       if (TREE_OVERFLOW (low))
950           low = wide_int_to_tree (index_type, wi::to_wide (low));
951 
952       /* The canonical from of a case label in GIMPLE is that a simple case
953            has an empty CASE_HIGH.  For the casesi and tablejump expanders,
954            the back ends want simple cases to have high == low.  */
955       if (! high)
956           high = low;
957       high = fold_convert (index_type, high);
958       if (TREE_OVERFLOW (high))
959           high = wide_int_to_tree (index_type, wi::to_wide (high));
960 
961       case_list.safe_push (simple_case_node (low, high, lab));
962     }
963 
964   /* cleanup_tree_cfg removes all SWITCH_EXPR with a single
965      destination, such as one with a default case only.
966      It also removes cases that are out of range for the switch
967      type, so we should never get a zero here.  */
968   gcc_assert (count > 0);
969 
970   rtx_insn *before_case = get_last_insn ();
971 
972   /* Decide how to expand this switch.
973      The two options at this point are a dispatch table (casesi or
974      tablejump) or a decision tree.  */
975 
976     {
977       /* If the default case is unreachable, then set default_label to NULL
978            so that we omit the range check when generating the dispatch table.
979            We also remove the edge to the unreachable default case.  The block
980            itself will be automatically removed later.  */
981       if (EDGE_COUNT (default_edge->dest->succs) == 0
982             && gimple_seq_unreachable_p (bb_seq (default_edge->dest)))
983           {
984             default_label = NULL;
985             remove_edge (default_edge);
986             default_edge = NULL;
987           }
988       emit_case_dispatch_table (index_expr, index_type,
989                                         case_list, default_label, default_edge,
990                                         minval, maxval, range, bb);
991     }
992 
993   reorder_insns (NEXT_INSN (before_case), get_last_insn (), before_case);
994 
995   free_temp_slots ();
996 }
997 
998 /* Expand the dispatch to a short decrement chain if there are few cases
999    to dispatch to.  Likewise if neither casesi nor tablejump is available,
1000    or if flag_jump_tables is set.  Otherwise, expand as a casesi or a
1001    tablejump.  The index mode is always the mode of integer_type_node.
1002    Trap if no case matches the index.
1003 
1004    DISPATCH_INDEX is the index expression to switch on.  It should be a
1005    memory or register operand.
1006 
1007    DISPATCH_TABLE is a set of case labels.  The set should be sorted in
1008    ascending order, be contiguous, starting with value 0, and contain only
1009    single-valued case labels.  */
1010 
1011 void
expand_sjlj_dispatch_table(rtx dispatch_index,vec<tree> dispatch_table)1012 expand_sjlj_dispatch_table (rtx dispatch_index,
1013                                   vec<tree> dispatch_table)
1014 {
1015   tree index_type = integer_type_node;
1016   machine_mode index_mode = TYPE_MODE (index_type);
1017 
1018   int ncases = dispatch_table.length ();
1019 
1020   do_pending_stack_adjust ();
1021   rtx_insn *before_case = get_last_insn ();
1022 
1023   /* Expand as a decrement-chain if there are 5 or fewer dispatch
1024      labels.  This covers more than 98% of the cases in libjava,
1025      and seems to be a reasonable compromise between the "old way"
1026      of expanding as a decision tree or dispatch table vs. the "new
1027      way" with decrement chain or dispatch table.  */
1028   if (dispatch_table.length () <= 5
1029       || (!targetm.have_casesi () && !targetm.have_tablejump ())
1030       || !flag_jump_tables)
1031     {
1032       /* Expand the dispatch as a decrement chain:
1033 
1034            "switch(index) {case 0: do_0; case 1: do_1; ...; case N: do_N;}"
1035 
1036            ==>
1037 
1038            if (index == 0) do_0; else index--;
1039            if (index == 0) do_1; else index--;
1040            ...
1041            if (index == 0) do_N; else index--;
1042 
1043            This is more efficient than a dispatch table on most machines.
1044            The last "index--" is redundant but the code is trivially dead
1045            and will be cleaned up by later passes.  */
1046       rtx index = copy_to_mode_reg (index_mode, dispatch_index);
1047       rtx zero = CONST0_RTX (index_mode);
1048       for (int i = 0; i < ncases; i++)
1049         {
1050             tree elt = dispatch_table[i];
1051             rtx_code_label *lab = jump_target_rtx (CASE_LABEL (elt));
1052             do_jump_if_equal (index_mode, index, zero, lab, 0,
1053                                   profile_probability::uninitialized ());
1054             force_expand_binop (index_mode, sub_optab,
1055                                     index, CONST1_RTX (index_mode),
1056                                     index, 0, OPTAB_DIRECT);
1057           }
1058     }
1059   else
1060     {
1061       /* Similar to expand_case, but much simpler.  */
1062       auto_vec<simple_case_node> case_list;
1063       tree index_expr = make_tree (index_type, dispatch_index);
1064       tree minval = build_int_cst (index_type, 0);
1065       tree maxval = CASE_LOW (dispatch_table.last ());
1066       tree range = maxval;
1067       rtx_code_label *default_label = gen_label_rtx ();
1068 
1069       for (int i = ncases - 1; i >= 0; --i)
1070           {
1071             tree elt = dispatch_table[i];
1072             tree high = CASE_HIGH (elt);
1073             if (high == NULL_TREE)
1074               high = CASE_LOW (elt);
1075             case_list.safe_push (simple_case_node (CASE_LOW (elt), high,
1076                                                              CASE_LABEL (elt)));
1077           }
1078 
1079       emit_case_dispatch_table (index_expr, index_type,
1080                                         case_list, default_label, NULL,
1081                                         minval, maxval, range,
1082                                         BLOCK_FOR_INSN (before_case));
1083       emit_label (default_label);
1084     }
1085 
1086   /* Dispatching something not handled?  Trap!  */
1087   expand_builtin_trap ();
1088 
1089   reorder_insns (NEXT_INSN (before_case), get_last_insn (), before_case);
1090 
1091   free_temp_slots ();
1092 }
1093 
1094 
1095