re PR middle-end/91603 (Unaligned access in expand_assignment)
[official-gcc.git] / gcc / stmt.c
blob17f43d14d88a993c85a9a99222d5b8c350cfe174
1 /* Expands front end tree to back end RTL for GCC
2 Copyright (C) 1987-2019 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
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. */
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"
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"
58 /* Functions and data structures for expanding case statements. */
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.
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.
67 Switch statements are expanded in jump table form.
71 class simple_case_node
73 public:
74 simple_case_node (tree low, tree high, tree code_label):
75 m_low (low), m_high (high), m_code_label (code_label)
78 /* Lowest index value for this label. */
79 tree m_low;
80 /* Highest index value for this label. */
81 tree m_high;
82 /* Label to jump to when node matches. */
83 tree m_code_label;
86 static bool check_unique_operand_names (tree, tree, tree);
87 static char *resolve_operand_name_1 (char *, tree, tree, tree);
89 /* Return the rtx-label that corresponds to a LABEL_DECL,
90 creating it if necessary. */
92 rtx_insn *
93 label_rtx (tree label)
95 gcc_assert (TREE_CODE (label) == LABEL_DECL);
97 if (!DECL_RTL_SET_P (label))
99 rtx_code_label *r = gen_label_rtx ();
100 SET_DECL_RTL (label, r);
101 if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
102 LABEL_PRESERVE_P (r) = 1;
105 return as_a <rtx_insn *> (DECL_RTL (label));
108 /* As above, but also put it on the forced-reference list of the
109 function that contains it. */
110 rtx_insn *
111 force_label_rtx (tree label)
113 rtx_insn *ref = label_rtx (label);
114 tree function = decl_function_context (label);
116 gcc_assert (function);
118 vec_safe_push (forced_labels, ref);
119 return ref;
122 /* As label_rtx, but ensures (in check build), that returned value is
123 an existing label (i.e. rtx with code CODE_LABEL). */
124 rtx_code_label *
125 jump_target_rtx (tree label)
127 return as_a <rtx_code_label *> (label_rtx (label));
130 /* Add an unconditional jump to LABEL as the next sequential instruction. */
132 void
133 emit_jump (rtx label)
135 do_pending_stack_adjust ();
136 emit_jump_insn (targetm.gen_jump (label));
137 emit_barrier ();
140 /* Handle goto statements and the labels that they can go to. */
142 /* Specify the location in the RTL code of a label LABEL,
143 which is a LABEL_DECL tree node.
145 This is used for the kind of label that the user can jump to with a
146 goto statement, and for alternatives of a switch or case statement.
147 RTL labels generated for loops and conditionals don't go through here;
148 they are generated directly at the RTL level, by other functions below.
150 Note that this has nothing to do with defining label *names*.
151 Languages vary in how they do that and what that even means. */
153 void
154 expand_label (tree label)
156 rtx_code_label *label_r = jump_target_rtx (label);
158 do_pending_stack_adjust ();
159 emit_label (label_r);
160 if (DECL_NAME (label))
161 LABEL_NAME (DECL_RTL (label)) = IDENTIFIER_POINTER (DECL_NAME (label));
163 if (DECL_NONLOCAL (label))
165 expand_builtin_setjmp_receiver (NULL);
166 nonlocal_goto_handler_labels
167 = gen_rtx_INSN_LIST (VOIDmode, label_r,
168 nonlocal_goto_handler_labels);
171 if (FORCED_LABEL (label))
172 vec_safe_push<rtx_insn *> (forced_labels, label_r);
174 if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
175 maybe_set_first_label_num (label_r);
178 /* Parse the output constraint pointed to by *CONSTRAINT_P. It is the
179 OPERAND_NUMth output operand, indexed from zero. There are NINPUTS
180 inputs and NOUTPUTS outputs to this extended-asm. Upon return,
181 *ALLOWS_MEM will be TRUE iff the constraint allows the use of a
182 memory operand. Similarly, *ALLOWS_REG will be TRUE iff the
183 constraint allows the use of a register operand. And, *IS_INOUT
184 will be true if the operand is read-write, i.e., if it is used as
185 an input as well as an output. If *CONSTRAINT_P is not in
186 canonical form, it will be made canonical. (Note that `+' will be
187 replaced with `=' as part of this process.)
189 Returns TRUE if all went well; FALSE if an error occurred. */
191 bool
192 parse_output_constraint (const char **constraint_p, int operand_num,
193 int ninputs, int noutputs, bool *allows_mem,
194 bool *allows_reg, bool *is_inout)
196 const char *constraint = *constraint_p;
197 const char *p;
199 /* Assume the constraint doesn't allow the use of either a register
200 or memory. */
201 *allows_mem = false;
202 *allows_reg = false;
204 /* Allow the `=' or `+' to not be at the beginning of the string,
205 since it wasn't explicitly documented that way, and there is a
206 large body of code that puts it last. Swap the character to
207 the front, so as not to uglify any place else. */
208 p = strchr (constraint, '=');
209 if (!p)
210 p = strchr (constraint, '+');
212 /* If the string doesn't contain an `=', issue an error
213 message. */
214 if (!p)
216 error ("output operand constraint lacks %<=%>");
217 return false;
220 /* If the constraint begins with `+', then the operand is both read
221 from and written to. */
222 *is_inout = (*p == '+');
224 /* Canonicalize the output constraint so that it begins with `='. */
225 if (p != constraint || *is_inout)
227 char *buf;
228 size_t c_len = strlen (constraint);
230 if (p != constraint)
231 warning (0, "output constraint %qc for operand %d "
232 "is not at the beginning",
233 *p, operand_num);
235 /* Make a copy of the constraint. */
236 buf = XALLOCAVEC (char, c_len + 1);
237 strcpy (buf, constraint);
238 /* Swap the first character and the `=' or `+'. */
239 buf[p - constraint] = buf[0];
240 /* Make sure the first character is an `='. (Until we do this,
241 it might be a `+'.) */
242 buf[0] = '=';
243 /* Replace the constraint with the canonicalized string. */
244 *constraint_p = ggc_alloc_string (buf, c_len);
245 constraint = *constraint_p;
248 /* Loop through the constraint string. */
249 for (p = constraint + 1; *p; )
251 switch (*p)
253 case '+':
254 case '=':
255 error ("operand constraint contains incorrectly positioned "
256 "%<+%> or %<=%>");
257 return false;
259 case '%':
260 if (operand_num + 1 == ninputs + noutputs)
262 error ("%<%%%> constraint used with last operand");
263 return false;
265 break;
267 case '?': case '!': case '*': case '&': case '#':
268 case '$': case '^':
269 case 'E': case 'F': case 'G': case 'H':
270 case 's': case 'i': case 'n':
271 case 'I': case 'J': case 'K': case 'L': case 'M':
272 case 'N': case 'O': case 'P': case ',':
273 break;
275 case '0': case '1': case '2': case '3': case '4':
276 case '5': case '6': case '7': case '8': case '9':
277 case '[':
278 error ("matching constraint not valid in output operand");
279 return false;
281 case '<': case '>':
282 /* ??? Before flow, auto inc/dec insns are not supposed to exist,
283 excepting those that expand_call created. So match memory
284 and hope. */
285 *allows_mem = true;
286 break;
288 case 'g': case 'X':
289 *allows_reg = true;
290 *allows_mem = true;
291 break;
293 default:
294 if (!ISALPHA (*p))
295 break;
296 enum constraint_num cn = lookup_constraint (p);
297 if (reg_class_for_constraint (cn) != NO_REGS
298 || insn_extra_address_constraint (cn))
299 *allows_reg = true;
300 else if (insn_extra_memory_constraint (cn))
301 *allows_mem = true;
302 else
303 insn_extra_constraint_allows_reg_mem (cn, allows_reg, allows_mem);
304 break;
307 for (size_t len = CONSTRAINT_LEN (*p, p); len; len--, p++)
308 if (*p == '\0')
309 break;
312 return true;
315 /* Similar, but for input constraints. */
317 bool
318 parse_input_constraint (const char **constraint_p, int input_num,
319 int ninputs, int noutputs, int ninout,
320 const char * const * constraints,
321 bool *allows_mem, bool *allows_reg)
323 const char *constraint = *constraint_p;
324 const char *orig_constraint = constraint;
325 size_t c_len = strlen (constraint);
326 size_t j;
327 bool saw_match = false;
329 /* Assume the constraint doesn't allow the use of either
330 a register or memory. */
331 *allows_mem = false;
332 *allows_reg = false;
334 /* Make sure constraint has neither `=', `+', nor '&'. */
336 for (j = 0; j < c_len; j += CONSTRAINT_LEN (constraint[j], constraint+j))
337 switch (constraint[j])
339 case '+': case '=': case '&':
340 if (constraint == orig_constraint)
342 error ("input operand constraint contains %qc", constraint[j]);
343 return false;
345 break;
347 case '%':
348 if (constraint == orig_constraint
349 && input_num + 1 == ninputs - ninout)
351 error ("%<%%%> constraint used with last operand");
352 return false;
354 break;
356 case '<': case '>':
357 case '?': case '!': case '*': case '#':
358 case '$': case '^':
359 case 'E': case 'F': case 'G': case 'H':
360 case 's': case 'i': case 'n':
361 case 'I': case 'J': case 'K': case 'L': case 'M':
362 case 'N': case 'O': case 'P': case ',':
363 break;
365 /* Whether or not a numeric constraint allows a register is
366 decided by the matching constraint, and so there is no need
367 to do anything special with them. We must handle them in
368 the default case, so that we don't unnecessarily force
369 operands to memory. */
370 case '0': case '1': case '2': case '3': case '4':
371 case '5': case '6': case '7': case '8': case '9':
373 char *end;
374 unsigned long match;
376 saw_match = true;
378 match = strtoul (constraint + j, &end, 10);
379 if (match >= (unsigned long) noutputs)
381 error ("matching constraint references invalid operand number");
382 return false;
385 /* Try and find the real constraint for this dup. Only do this
386 if the matching constraint is the only alternative. */
387 if (*end == '\0'
388 && (j == 0 || (j == 1 && constraint[0] == '%')))
390 constraint = constraints[match];
391 *constraint_p = constraint;
392 c_len = strlen (constraint);
393 j = 0;
394 /* ??? At the end of the loop, we will skip the first part of
395 the matched constraint. This assumes not only that the
396 other constraint is an output constraint, but also that
397 the '=' or '+' come first. */
398 break;
400 else
401 j = end - constraint;
402 /* Anticipate increment at end of loop. */
403 j--;
405 /* Fall through. */
407 case 'g': case 'X':
408 *allows_reg = true;
409 *allows_mem = true;
410 break;
412 default:
413 if (! ISALPHA (constraint[j]))
415 error ("invalid punctuation %qc in constraint", constraint[j]);
416 return false;
418 enum constraint_num cn = lookup_constraint (constraint + j);
419 if (reg_class_for_constraint (cn) != NO_REGS
420 || insn_extra_address_constraint (cn))
421 *allows_reg = true;
422 else if (insn_extra_memory_constraint (cn)
423 || insn_extra_special_memory_constraint (cn))
424 *allows_mem = true;
425 else
426 insn_extra_constraint_allows_reg_mem (cn, allows_reg, allows_mem);
427 break;
430 if (saw_match && !*allows_reg)
431 warning (0, "matching constraint does not allow a register");
433 return true;
436 /* Return DECL iff there's an overlap between *REGS and DECL, where DECL
437 can be an asm-declared register. Called via walk_tree. */
439 static tree
440 decl_overlaps_hard_reg_set_p (tree *declp, int *walk_subtrees ATTRIBUTE_UNUSED,
441 void *data)
443 tree decl = *declp;
444 const HARD_REG_SET *const regs = (const HARD_REG_SET *) data;
446 if (VAR_P (decl))
448 if (DECL_HARD_REGISTER (decl)
449 && REG_P (DECL_RTL (decl))
450 && REGNO (DECL_RTL (decl)) < FIRST_PSEUDO_REGISTER)
452 rtx reg = DECL_RTL (decl);
454 if (overlaps_hard_reg_set_p (*regs, GET_MODE (reg), REGNO (reg)))
455 return decl;
457 walk_subtrees = 0;
459 else if (TYPE_P (decl) || TREE_CODE (decl) == PARM_DECL)
460 walk_subtrees = 0;
461 return NULL_TREE;
464 /* If there is an overlap between *REGS and DECL, return the first overlap
465 found. */
466 tree
467 tree_overlaps_hard_reg_set (tree decl, HARD_REG_SET *regs)
469 return walk_tree (&decl, decl_overlaps_hard_reg_set_p, regs, NULL);
473 /* A subroutine of expand_asm_operands. Check that all operand names
474 are unique. Return true if so. We rely on the fact that these names
475 are identifiers, and so have been canonicalized by get_identifier,
476 so all we need are pointer comparisons. */
478 static bool
479 check_unique_operand_names (tree outputs, tree inputs, tree labels)
481 tree i, j, i_name = NULL_TREE;
483 for (i = outputs; i ; i = TREE_CHAIN (i))
485 i_name = TREE_PURPOSE (TREE_PURPOSE (i));
486 if (! i_name)
487 continue;
489 for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
490 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
491 goto failure;
494 for (i = inputs; i ; i = TREE_CHAIN (i))
496 i_name = TREE_PURPOSE (TREE_PURPOSE (i));
497 if (! i_name)
498 continue;
500 for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
501 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
502 goto failure;
503 for (j = outputs; j ; j = TREE_CHAIN (j))
504 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
505 goto failure;
508 for (i = labels; i ; i = TREE_CHAIN (i))
510 i_name = TREE_PURPOSE (i);
511 if (! i_name)
512 continue;
514 for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
515 if (simple_cst_equal (i_name, TREE_PURPOSE (j)))
516 goto failure;
517 for (j = inputs; j ; j = TREE_CHAIN (j))
518 if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
519 goto failure;
522 return true;
524 failure:
525 error ("duplicate %<asm%> operand name %qs", TREE_STRING_POINTER (i_name));
526 return false;
529 /* Resolve the names of the operands in *POUTPUTS and *PINPUTS to numbers,
530 and replace the name expansions in STRING and in the constraints to
531 those numbers. This is generally done in the front end while creating
532 the ASM_EXPR generic tree that eventually becomes the GIMPLE_ASM. */
534 tree
535 resolve_asm_operand_names (tree string, tree outputs, tree inputs, tree labels)
537 char *buffer;
538 char *p;
539 const char *c;
540 tree t;
542 check_unique_operand_names (outputs, inputs, labels);
544 /* Substitute [<name>] in input constraint strings. There should be no
545 named operands in output constraints. */
546 for (t = inputs; t ; t = TREE_CHAIN (t))
548 c = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
549 if (strchr (c, '[') != NULL)
551 p = buffer = xstrdup (c);
552 while ((p = strchr (p, '[')) != NULL)
553 p = resolve_operand_name_1 (p, outputs, inputs, NULL);
554 TREE_VALUE (TREE_PURPOSE (t))
555 = build_string (strlen (buffer), buffer);
556 free (buffer);
560 /* Now check for any needed substitutions in the template. */
561 c = TREE_STRING_POINTER (string);
562 while ((c = strchr (c, '%')) != NULL)
564 if (c[1] == '[')
565 break;
566 else if (ISALPHA (c[1]) && c[2] == '[')
567 break;
568 else
570 c += 1 + (c[1] == '%');
571 continue;
575 if (c)
577 /* OK, we need to make a copy so we can perform the substitutions.
578 Assume that we will not need extra space--we get to remove '['
579 and ']', which means we cannot have a problem until we have more
580 than 999 operands. */
581 buffer = xstrdup (TREE_STRING_POINTER (string));
582 p = buffer + (c - TREE_STRING_POINTER (string));
584 while ((p = strchr (p, '%')) != NULL)
586 if (p[1] == '[')
587 p += 1;
588 else if (ISALPHA (p[1]) && p[2] == '[')
589 p += 2;
590 else
592 p += 1 + (p[1] == '%');
593 continue;
596 p = resolve_operand_name_1 (p, outputs, inputs, labels);
599 string = build_string (strlen (buffer), buffer);
600 free (buffer);
603 return string;
606 /* A subroutine of resolve_operand_names. P points to the '[' for a
607 potential named operand of the form [<name>]. In place, replace
608 the name and brackets with a number. Return a pointer to the
609 balance of the string after substitution. */
611 static char *
612 resolve_operand_name_1 (char *p, tree outputs, tree inputs, tree labels)
614 char *q;
615 int op;
616 tree t;
618 /* Collect the operand name. */
619 q = strchr (++p, ']');
620 if (!q)
622 error ("missing close brace for named operand");
623 return strchr (p, '\0');
625 *q = '\0';
627 /* Resolve the name to a number. */
628 for (op = 0, t = outputs; t ; t = TREE_CHAIN (t), op++)
630 tree name = TREE_PURPOSE (TREE_PURPOSE (t));
631 if (name && strcmp (TREE_STRING_POINTER (name), p) == 0)
632 goto found;
634 for (t = inputs; t ; t = TREE_CHAIN (t), op++)
636 tree name = TREE_PURPOSE (TREE_PURPOSE (t));
637 if (name && strcmp (TREE_STRING_POINTER (name), p) == 0)
638 goto found;
640 for (t = labels; t ; t = TREE_CHAIN (t), op++)
642 tree name = TREE_PURPOSE (t);
643 if (name && strcmp (TREE_STRING_POINTER (name), p) == 0)
644 goto found;
647 error ("undefined named operand %qs", identifier_to_locale (p));
648 op = 0;
650 found:
651 /* Replace the name with the number. Unfortunately, not all libraries
652 get the return value of sprintf correct, so search for the end of the
653 generated string by hand. */
654 sprintf (--p, "%d", op);
655 p = strchr (p, '\0');
657 /* Verify the no extra buffer space assumption. */
658 gcc_assert (p <= q);
660 /* Shift the rest of the buffer down to fill the gap. */
661 memmove (p, q + 1, strlen (q + 1) + 1);
663 return p;
667 /* Generate RTL to return directly from the current function.
668 (That is, we bypass any return value.) */
670 void
671 expand_naked_return (void)
673 rtx_code_label *end_label;
675 clear_pending_stack_adjust ();
676 do_pending_stack_adjust ();
678 end_label = naked_return_label;
679 if (end_label == 0)
680 end_label = naked_return_label = gen_label_rtx ();
682 emit_jump (end_label);
685 /* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. PROB
686 is the probability of jumping to LABEL. */
687 static void
688 do_jump_if_equal (machine_mode mode, rtx op0, rtx op1, rtx_code_label *label,
689 int unsignedp, profile_probability prob)
691 do_compare_rtx_and_jump (op0, op1, EQ, unsignedp, mode,
692 NULL_RTX, NULL, label, prob);
695 /* Return the sum of probabilities of outgoing edges of basic block BB. */
697 static profile_probability
698 get_outgoing_edge_probs (basic_block bb)
700 edge e;
701 edge_iterator ei;
702 profile_probability prob_sum = profile_probability::never ();
703 if (!bb)
704 return profile_probability::never ();
705 FOR_EACH_EDGE (e, ei, bb->succs)
706 prob_sum += e->probability;
707 return prob_sum;
710 /* Computes the conditional probability of jumping to a target if the branch
711 instruction is executed.
712 TARGET_PROB is the estimated probability of jumping to a target relative
713 to some basic block BB.
714 BASE_PROB is the probability of reaching the branch instruction relative
715 to the same basic block BB. */
717 static inline profile_probability
718 conditional_probability (profile_probability target_prob,
719 profile_probability base_prob)
721 return target_prob / base_prob;
724 /* Generate a dispatch tabler, switching on INDEX_EXPR and jumping to
725 one of the labels in CASE_LIST or to the DEFAULT_LABEL.
726 MINVAL, MAXVAL, and RANGE are the extrema and range of the case
727 labels in CASE_LIST. STMT_BB is the basic block containing the statement.
729 First, a jump insn is emitted. First we try "casesi". If that
730 fails, try "tablejump". A target *must* have one of them (or both).
732 Then, a table with the target labels is emitted.
734 The process is unaware of the CFG. The caller has to fix up
735 the CFG itself. This is done in cfgexpand.c. */
737 static void
738 emit_case_dispatch_table (tree index_expr, tree index_type,
739 auto_vec<simple_case_node> &case_list,
740 rtx default_label,
741 edge default_edge, tree minval, tree maxval,
742 tree range, basic_block stmt_bb)
744 int i, ncases;
745 rtx *labelvec;
746 rtx_insn *fallback_label = label_rtx (case_list[0].m_code_label);
747 rtx_code_label *table_label = gen_label_rtx ();
748 bool has_gaps = false;
749 profile_probability default_prob = default_edge ? default_edge->probability
750 : profile_probability::never ();
751 profile_probability base = get_outgoing_edge_probs (stmt_bb);
752 bool try_with_tablejump = false;
754 profile_probability new_default_prob = conditional_probability (default_prob,
755 base);
757 if (! try_casesi (index_type, index_expr, minval, range,
758 table_label, default_label, fallback_label,
759 new_default_prob))
761 /* Index jumptables from zero for suitable values of minval to avoid
762 a subtraction. For the rationale see:
763 "http://gcc.gnu.org/ml/gcc-patches/2001-10/msg01234.html". */
764 if (optimize_insn_for_speed_p ()
765 && compare_tree_int (minval, 0) > 0
766 && compare_tree_int (minval, 3) < 0)
768 minval = build_int_cst (index_type, 0);
769 range = maxval;
770 has_gaps = true;
772 try_with_tablejump = true;
775 /* Get table of labels to jump to, in order of case index. */
777 ncases = tree_to_shwi (range) + 1;
778 labelvec = XALLOCAVEC (rtx, ncases);
779 memset (labelvec, 0, ncases * sizeof (rtx));
781 for (unsigned j = 0; j < case_list.length (); j++)
783 simple_case_node *n = &case_list[j];
784 /* Compute the low and high bounds relative to the minimum
785 value since that should fit in a HOST_WIDE_INT while the
786 actual values may not. */
787 HOST_WIDE_INT i_low
788 = tree_to_uhwi (fold_build2 (MINUS_EXPR, index_type,
789 n->m_low, minval));
790 HOST_WIDE_INT i_high
791 = tree_to_uhwi (fold_build2 (MINUS_EXPR, index_type,
792 n->m_high, minval));
793 HOST_WIDE_INT i;
795 for (i = i_low; i <= i_high; i ++)
796 labelvec[i]
797 = gen_rtx_LABEL_REF (Pmode, label_rtx (n->m_code_label));
800 /* The dispatch table may contain gaps, including at the beginning of
801 the table if we tried to avoid the minval subtraction. We fill the
802 dispatch table slots associated with the gaps with the default case label.
803 However, in the event the default case is unreachable, we then use
804 any label from one of the case statements. */
805 rtx gap_label = (default_label) ? default_label : fallback_label;
807 for (i = 0; i < ncases; i++)
808 if (labelvec[i] == 0)
810 has_gaps = true;
811 labelvec[i] = gen_rtx_LABEL_REF (Pmode, gap_label);
814 if (has_gaps && default_label)
816 /* There is at least one entry in the jump table that jumps
817 to default label. The default label can either be reached
818 through the indirect jump or the direct conditional jump
819 before that. Split the probability of reaching the
820 default label among these two jumps. */
821 new_default_prob
822 = conditional_probability (default_prob.apply_scale (1, 2), base);
823 default_prob = default_prob.apply_scale (1, 2);
824 base -= default_prob;
826 else
828 base -= default_prob;
829 default_prob = profile_probability::never ();
832 if (default_edge)
833 default_edge->probability = default_prob;
835 /* We have altered the probability of the default edge. So the probabilities
836 of all other edges need to be adjusted so that it sums up to
837 REG_BR_PROB_BASE. */
838 if (base > profile_probability::never ())
840 edge e;
841 edge_iterator ei;
842 FOR_EACH_EDGE (e, ei, stmt_bb->succs)
843 e->probability /= base;
846 if (try_with_tablejump)
848 bool ok = try_tablejump (index_type, index_expr, minval, range,
849 table_label, default_label, new_default_prob);
850 gcc_assert (ok);
852 /* Output the table. */
853 emit_label (table_label);
855 if (CASE_VECTOR_PC_RELATIVE
856 || (flag_pic && targetm.asm_out.generate_pic_addr_diff_vec ()))
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)));
866 /* Record no drop-through after the table. */
867 emit_barrier ();
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. */
876 void
877 expand_case (gswitch *stmt)
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 gimple *def_stmt;
890 auto_vec<simple_case_node> case_list;
892 /* An ERROR_MARK occurs for various reasons including invalid data type.
893 ??? Can this still happen, with GIMPLE and all? */
894 if (index_type == error_mark_node)
895 return;
897 /* cleanup_tree_cfg removes all SWITCH_EXPR with their index
898 expressions being INTEGER_CST. */
899 gcc_assert (TREE_CODE (index_expr) != INTEGER_CST);
901 /* Optimization of switch statements with only one label has already
902 occurred, so we should never see them at this point. */
903 gcc_assert (ncases > 1);
905 do_pending_stack_adjust ();
907 /* Find the default case target label. */
908 tree default_lab = CASE_LABEL (gimple_switch_default_label (stmt));
909 default_label = jump_target_rtx (default_lab);
910 basic_block default_bb = label_to_block (cfun, default_lab);
911 edge default_edge = find_edge (bb, default_bb);
913 /* Get upper and lower bounds of case values. */
914 elt = gimple_switch_label (stmt, 1);
915 minval = fold_convert (index_type, CASE_LOW (elt));
916 elt = gimple_switch_label (stmt, ncases - 1);
917 if (CASE_HIGH (elt))
918 maxval = fold_convert (index_type, CASE_HIGH (elt));
919 else
920 maxval = fold_convert (index_type, CASE_LOW (elt));
922 /* Try to narrow the index type if it's larger than a word.
923 That is mainly for -O0 where an equivalent optimization
924 done by forward propagation is not run and is aimed at
925 avoiding a call to a comparison routine of libgcc. */
926 if (TYPE_PRECISION (index_type) > BITS_PER_WORD
927 && TREE_CODE (index_expr) == SSA_NAME
928 && (def_stmt = SSA_NAME_DEF_STMT (index_expr))
929 && is_gimple_assign (def_stmt)
930 && gimple_assign_rhs_code (def_stmt) == NOP_EXPR)
932 tree inner_index_expr = gimple_assign_rhs1 (def_stmt);
933 tree inner_index_type = TREE_TYPE (inner_index_expr);
935 if (INTEGRAL_TYPE_P (inner_index_type)
936 && TYPE_PRECISION (inner_index_type) <= BITS_PER_WORD
937 && int_fits_type_p (minval, inner_index_type)
938 && int_fits_type_p (maxval, inner_index_type))
940 index_expr = inner_index_expr;
941 index_type = inner_index_type;
942 minval = fold_convert (index_type, minval);
943 maxval = fold_convert (index_type, maxval);
947 /* Compute span of values. */
948 range = fold_build2 (MINUS_EXPR, index_type, maxval, minval);
950 /* Listify the labels queue and gather some numbers to decide
951 how to expand this switch(). */
952 count = 0;
954 for (i = ncases - 1; i >= 1; --i)
956 elt = gimple_switch_label (stmt, i);
957 tree low = CASE_LOW (elt);
958 gcc_assert (low);
959 tree high = CASE_HIGH (elt);
960 gcc_assert (! high || tree_int_cst_lt (low, high));
961 tree lab = CASE_LABEL (elt);
963 /* Count the elements.
964 A range counts double, since it requires two compares. */
965 count++;
966 if (high)
967 count++;
969 /* The bounds on the case range, LOW and HIGH, have to be converted
970 to case's index type TYPE. Note that the original type of the
971 case index in the source code is usually "lost" during
972 gimplification due to type promotion, but the case labels retain the
973 original type. Make sure to drop overflow flags. */
974 low = fold_convert (index_type, low);
975 if (TREE_OVERFLOW (low))
976 low = wide_int_to_tree (index_type, wi::to_wide (low));
978 /* The canonical from of a case label in GIMPLE is that a simple case
979 has an empty CASE_HIGH. For the casesi and tablejump expanders,
980 the back ends want simple cases to have high == low. */
981 if (! high)
982 high = low;
983 high = fold_convert (index_type, high);
984 if (TREE_OVERFLOW (high))
985 high = wide_int_to_tree (index_type, wi::to_wide (high));
987 case_list.safe_push (simple_case_node (low, high, lab));
990 /* cleanup_tree_cfg removes all SWITCH_EXPR with a single
991 destination, such as one with a default case only.
992 It also removes cases that are out of range for the switch
993 type, so we should never get a zero here. */
994 gcc_assert (count > 0);
996 rtx_insn *before_case = get_last_insn ();
998 /* If the default case is unreachable, then set default_label to NULL
999 so that we omit the range check when generating the dispatch table.
1000 We also remove the edge to the unreachable default case. The block
1001 itself will be automatically removed later. */
1002 if (EDGE_COUNT (default_edge->dest->succs) == 0
1003 && gimple_seq_unreachable_p (bb_seq (default_edge->dest)))
1005 default_label = NULL;
1006 remove_edge (default_edge);
1007 default_edge = NULL;
1010 emit_case_dispatch_table (index_expr, index_type,
1011 case_list, default_label, default_edge,
1012 minval, maxval, range, bb);
1014 reorder_insns (NEXT_INSN (before_case), get_last_insn (), before_case);
1016 free_temp_slots ();
1019 /* Expand the dispatch to a short decrement chain if there are few cases
1020 to dispatch to. Likewise if neither casesi nor tablejump is available,
1021 or if flag_jump_tables is set. Otherwise, expand as a casesi or a
1022 tablejump. The index mode is always the mode of integer_type_node.
1023 Trap if no case matches the index.
1025 DISPATCH_INDEX is the index expression to switch on. It should be a
1026 memory or register operand.
1028 DISPATCH_TABLE is a set of case labels. The set should be sorted in
1029 ascending order, be contiguous, starting with value 0, and contain only
1030 single-valued case labels. */
1032 void
1033 expand_sjlj_dispatch_table (rtx dispatch_index,
1034 vec<tree> dispatch_table)
1036 tree index_type = integer_type_node;
1037 machine_mode index_mode = TYPE_MODE (index_type);
1039 int ncases = dispatch_table.length ();
1041 do_pending_stack_adjust ();
1042 rtx_insn *before_case = get_last_insn ();
1044 /* Expand as a decrement-chain if there are 5 or fewer dispatch
1045 labels. This covers more than 98% of the cases in libjava,
1046 and seems to be a reasonable compromise between the "old way"
1047 of expanding as a decision tree or dispatch table vs. the "new
1048 way" with decrement chain or dispatch table. */
1049 if (dispatch_table.length () <= 5
1050 || (!targetm.have_casesi () && !targetm.have_tablejump ())
1051 || !flag_jump_tables)
1053 /* Expand the dispatch as a decrement chain:
1055 "switch(index) {case 0: do_0; case 1: do_1; ...; case N: do_N;}"
1059 if (index == 0) do_0; else index--;
1060 if (index == 0) do_1; else index--;
1062 if (index == 0) do_N; else index--;
1064 This is more efficient than a dispatch table on most machines.
1065 The last "index--" is redundant but the code is trivially dead
1066 and will be cleaned up by later passes. */
1067 rtx index = copy_to_mode_reg (index_mode, dispatch_index);
1068 rtx zero = CONST0_RTX (index_mode);
1069 for (int i = 0; i < ncases; i++)
1071 tree elt = dispatch_table[i];
1072 rtx_code_label *lab = jump_target_rtx (CASE_LABEL (elt));
1073 do_jump_if_equal (index_mode, index, zero, lab, 0,
1074 profile_probability::uninitialized ());
1075 force_expand_binop (index_mode, sub_optab,
1076 index, CONST1_RTX (index_mode),
1077 index, 0, OPTAB_DIRECT);
1080 else
1082 /* Similar to expand_case, but much simpler. */
1083 auto_vec<simple_case_node> case_list;
1084 tree index_expr = make_tree (index_type, dispatch_index);
1085 tree minval = build_int_cst (index_type, 0);
1086 tree maxval = CASE_LOW (dispatch_table.last ());
1087 tree range = maxval;
1088 rtx_code_label *default_label = gen_label_rtx ();
1090 for (int i = ncases - 1; i >= 0; --i)
1092 tree elt = dispatch_table[i];
1093 tree high = CASE_HIGH (elt);
1094 if (high == NULL_TREE)
1095 high = CASE_LOW (elt);
1096 case_list.safe_push (simple_case_node (CASE_LOW (elt), high,
1097 CASE_LABEL (elt)));
1100 emit_case_dispatch_table (index_expr, index_type,
1101 case_list, default_label, NULL,
1102 minval, maxval, range,
1103 BLOCK_FOR_INSN (before_case));
1104 emit_label (default_label);
1107 /* Dispatching something not handled? Trap! */
1108 expand_builtin_trap ();
1110 reorder_insns (NEXT_INSN (before_case), get_last_insn (), before_case);
1112 free_temp_slots ();