gcc80: Handle TZ specific "%+" format in strftime.
[dragonfly.git] / contrib / gcc-8.0 / gcc / stmt.c
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 \f
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 {
73   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 \f
87 static bool check_unique_operand_names (tree, tree, tree);
88 static char *resolve_operand_name_1 (char *, tree, tree, tree);
89 \f
90 /* Return the rtx-label that corresponds to a LABEL_DECL,
91    creating it if necessary.  */
92
93 rtx_insn *
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 *
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 *
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
134 emit_jump (rtx label)
135 {
136   do_pending_stack_adjust ();
137   emit_jump_insn (targetm.gen_jump (label));
138   emit_barrier ();
139 }
140 \f
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
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 \f
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
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
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
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
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
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
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 *
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 \f
667
668 /* Generate RTL to return directly from the current function.
669    (That is, we bypass any return value.)  */
670
671 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
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 \f
696 /* Return the sum of probabilities of outgoing edges of basic block BB.  */
697
698 static profile_probability
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
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
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
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
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 \f