1 /* Expands front end tree to back end RTL for GCC
2 Copyright (C) 1987-2017 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
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
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. */
27 #include "coretypes.h"
34 #include "alloc-pool.h"
40 #include "pretty-print.h"
41 #include "diagnostic-core.h"
43 #include "fold-const.h"
45 #include "stor-layout.h"
50 #include "langhooks.h"
57 /* Functions and data structures for expanding case statements. */
59 /* Case label structure, used to hold info on labels within case
60 statements. We handle "range" labels; for a single-value label
61 as in C, the high and low limits are the same.
63 We start with a vector of case nodes sorted in ascending order, and
64 the default label as the last element in the vector. Before expanding
65 to RTL, we transform this vector into a list linked via the RIGHT
66 fields in the case_node struct. Nodes with higher case values are
69 Switch statements can be output in three forms. A branch table is
70 used if there are more than a few labels and the labels are dense
71 within the range between the smallest and largest case value. If a
72 branch table is used, no further manipulations are done with the case
75 The alternative to the use of a branch table is to generate a series
76 of compare and jump insns. When that is done, we use the LEFT, RIGHT,
77 and PARENT fields to hold a binary tree. Initially the tree is
78 totally unbalanced, with everything on the right. We balance the tree
79 with nodes on the left having lower case values than the parent
80 and nodes on the right having higher values. We then output the tree
83 For very small, suitable switch statements, we can generate a series
84 of simple bit test and branches instead. */
88 struct case_node
*left
; /* Left son in binary tree */
89 struct case_node
*right
; /* Right son in binary tree; also node chain */
90 struct case_node
*parent
; /* Parent of node in binary tree */
91 tree low
; /* Lowest index value for this label */
92 tree high
; /* Highest index value for this label */
93 tree code_label
; /* Label to jump to when node matches */
94 int prob
; /* Probability of taking this case. */
95 /* Probability of reaching subtree rooted at this node */
99 typedef struct case_node
*case_node_ptr
;
101 extern basic_block
label_to_block_fn (struct function
*, tree
);
103 static bool check_unique_operand_names (tree
, tree
, tree
);
104 static char *resolve_operand_name_1 (char *, tree
, tree
, tree
);
105 static void balance_case_nodes (case_node_ptr
*, case_node_ptr
);
106 static int node_has_low_bound (case_node_ptr
, tree
);
107 static int node_has_high_bound (case_node_ptr
, tree
);
108 static int node_is_bounded (case_node_ptr
, tree
);
109 static void emit_case_nodes (rtx
, case_node_ptr
, rtx_code_label
*, int, tree
);
111 /* Return the rtx-label that corresponds to a LABEL_DECL,
112 creating it if necessary. */
115 label_rtx (tree label
)
117 gcc_assert (TREE_CODE (label
) == LABEL_DECL
);
119 if (!DECL_RTL_SET_P (label
))
121 rtx_code_label
*r
= gen_label_rtx ();
122 SET_DECL_RTL (label
, r
);
123 if (FORCED_LABEL (label
) || DECL_NONLOCAL (label
))
124 LABEL_PRESERVE_P (r
) = 1;
127 return as_a
<rtx_insn
*> (DECL_RTL (label
));
130 /* As above, but also put it on the forced-reference list of the
131 function that contains it. */
133 force_label_rtx (tree label
)
135 rtx_insn
*ref
= label_rtx (label
);
136 tree function
= decl_function_context (label
);
138 gcc_assert (function
);
140 vec_safe_push (forced_labels
, ref
);
144 /* As label_rtx, but ensures (in check build), that returned value is
145 an existing label (i.e. rtx with code CODE_LABEL). */
147 jump_target_rtx (tree label
)
149 return as_a
<rtx_code_label
*> (label_rtx (label
));
152 /* Add an unconditional jump to LABEL as the next sequential instruction. */
155 emit_jump (rtx label
)
157 do_pending_stack_adjust ();
158 emit_jump_insn (targetm
.gen_jump (label
));
162 /* Handle goto statements and the labels that they can go to. */
164 /* Specify the location in the RTL code of a label LABEL,
165 which is a LABEL_DECL tree node.
167 This is used for the kind of label that the user can jump to with a
168 goto statement, and for alternatives of a switch or case statement.
169 RTL labels generated for loops and conditionals don't go through here;
170 they are generated directly at the RTL level, by other functions below.
172 Note that this has nothing to do with defining label *names*.
173 Languages vary in how they do that and what that even means. */
176 expand_label (tree label
)
178 rtx_code_label
*label_r
= jump_target_rtx (label
);
180 do_pending_stack_adjust ();
181 emit_label (label_r
);
182 if (DECL_NAME (label
))
183 LABEL_NAME (DECL_RTL (label
)) = IDENTIFIER_POINTER (DECL_NAME (label
));
185 if (DECL_NONLOCAL (label
))
187 expand_builtin_setjmp_receiver (NULL
);
188 nonlocal_goto_handler_labels
189 = gen_rtx_INSN_LIST (VOIDmode
, label_r
,
190 nonlocal_goto_handler_labels
);
193 if (FORCED_LABEL (label
))
194 vec_safe_push
<rtx_insn
*> (forced_labels
, label_r
);
196 if (DECL_NONLOCAL (label
) || FORCED_LABEL (label
))
197 maybe_set_first_label_num (label_r
);
200 /* Parse the output constraint pointed to by *CONSTRAINT_P. It is the
201 OPERAND_NUMth output operand, indexed from zero. There are NINPUTS
202 inputs and NOUTPUTS outputs to this extended-asm. Upon return,
203 *ALLOWS_MEM will be TRUE iff the constraint allows the use of a
204 memory operand. Similarly, *ALLOWS_REG will be TRUE iff the
205 constraint allows the use of a register operand. And, *IS_INOUT
206 will be true if the operand is read-write, i.e., if it is used as
207 an input as well as an output. If *CONSTRAINT_P is not in
208 canonical form, it will be made canonical. (Note that `+' will be
209 replaced with `=' as part of this process.)
211 Returns TRUE if all went well; FALSE if an error occurred. */
214 parse_output_constraint (const char **constraint_p
, int operand_num
,
215 int ninputs
, int noutputs
, bool *allows_mem
,
216 bool *allows_reg
, bool *is_inout
)
218 const char *constraint
= *constraint_p
;
221 /* Assume the constraint doesn't allow the use of either a register
226 /* Allow the `=' or `+' to not be at the beginning of the string,
227 since it wasn't explicitly documented that way, and there is a
228 large body of code that puts it last. Swap the character to
229 the front, so as not to uglify any place else. */
230 p
= strchr (constraint
, '=');
232 p
= strchr (constraint
, '+');
234 /* If the string doesn't contain an `=', issue an error
238 error ("output operand constraint lacks %<=%>");
242 /* If the constraint begins with `+', then the operand is both read
243 from and written to. */
244 *is_inout
= (*p
== '+');
246 /* Canonicalize the output constraint so that it begins with `='. */
247 if (p
!= constraint
|| *is_inout
)
250 size_t c_len
= strlen (constraint
);
253 warning (0, "output constraint %qc for operand %d "
254 "is not at the beginning",
257 /* Make a copy of the constraint. */
258 buf
= XALLOCAVEC (char, c_len
+ 1);
259 strcpy (buf
, constraint
);
260 /* Swap the first character and the `=' or `+'. */
261 buf
[p
- constraint
] = buf
[0];
262 /* Make sure the first character is an `='. (Until we do this,
263 it might be a `+'.) */
265 /* Replace the constraint with the canonicalized string. */
266 *constraint_p
= ggc_alloc_string (buf
, c_len
);
267 constraint
= *constraint_p
;
270 /* Loop through the constraint string. */
271 for (p
= constraint
+ 1; *p
; p
+= CONSTRAINT_LEN (*p
, p
))
276 error ("operand constraint contains incorrectly positioned "
281 if (operand_num
+ 1 == ninputs
+ noutputs
)
283 error ("%<%%%> constraint used with last operand");
288 case '?': case '!': case '*': case '&': case '#':
290 case 'E': case 'F': case 'G': case 'H':
291 case 's': case 'i': case 'n':
292 case 'I': case 'J': case 'K': case 'L': case 'M':
293 case 'N': case 'O': case 'P': case ',':
296 case '0': case '1': case '2': case '3': case '4':
297 case '5': case '6': case '7': case '8': case '9':
299 error ("matching constraint not valid in output operand");
303 /* ??? Before flow, auto inc/dec insns are not supposed to exist,
304 excepting those that expand_call created. So match memory
317 enum constraint_num cn
= lookup_constraint (p
);
318 if (reg_class_for_constraint (cn
) != NO_REGS
319 || insn_extra_address_constraint (cn
))
321 else if (insn_extra_memory_constraint (cn
))
324 insn_extra_constraint_allows_reg_mem (cn
, allows_reg
, allows_mem
);
331 /* Similar, but for input constraints. */
334 parse_input_constraint (const char **constraint_p
, int input_num
,
335 int ninputs
, int noutputs
, int ninout
,
336 const char * const * constraints
,
337 bool *allows_mem
, bool *allows_reg
)
339 const char *constraint
= *constraint_p
;
340 const char *orig_constraint
= constraint
;
341 size_t c_len
= strlen (constraint
);
343 bool saw_match
= false;
345 /* Assume the constraint doesn't allow the use of either
346 a register or memory. */
350 /* Make sure constraint has neither `=', `+', nor '&'. */
352 for (j
= 0; j
< c_len
; j
+= CONSTRAINT_LEN (constraint
[j
], constraint
+j
))
353 switch (constraint
[j
])
355 case '+': case '=': case '&':
356 if (constraint
== orig_constraint
)
358 error ("input operand constraint contains %qc", constraint
[j
]);
364 if (constraint
== orig_constraint
365 && input_num
+ 1 == ninputs
- ninout
)
367 error ("%<%%%> constraint used with last operand");
373 case '?': case '!': case '*': case '#':
375 case 'E': case 'F': case 'G': case 'H':
376 case 's': case 'i': case 'n':
377 case 'I': case 'J': case 'K': case 'L': case 'M':
378 case 'N': case 'O': case 'P': case ',':
381 /* Whether or not a numeric constraint allows a register is
382 decided by the matching constraint, and so there is no need
383 to do anything special with them. We must handle them in
384 the default case, so that we don't unnecessarily force
385 operands to memory. */
386 case '0': case '1': case '2': case '3': case '4':
387 case '5': case '6': case '7': case '8': case '9':
394 match
= strtoul (constraint
+ j
, &end
, 10);
395 if (match
>= (unsigned long) noutputs
)
397 error ("matching constraint references invalid operand number");
401 /* Try and find the real constraint for this dup. Only do this
402 if the matching constraint is the only alternative. */
404 && (j
== 0 || (j
== 1 && constraint
[0] == '%')))
406 constraint
= constraints
[match
];
407 *constraint_p
= constraint
;
408 c_len
= strlen (constraint
);
410 /* ??? At the end of the loop, we will skip the first part of
411 the matched constraint. This assumes not only that the
412 other constraint is an output constraint, but also that
413 the '=' or '+' come first. */
417 j
= end
- constraint
;
418 /* Anticipate increment at end of loop. */
429 if (! ISALPHA (constraint
[j
]))
431 error ("invalid punctuation %qc in constraint", constraint
[j
]);
434 enum constraint_num cn
= lookup_constraint (constraint
+ j
);
435 if (reg_class_for_constraint (cn
) != NO_REGS
436 || insn_extra_address_constraint (cn
))
438 else if (insn_extra_memory_constraint (cn
)
439 || insn_extra_special_memory_constraint (cn
))
442 insn_extra_constraint_allows_reg_mem (cn
, allows_reg
, allows_mem
);
446 if (saw_match
&& !*allows_reg
)
447 warning (0, "matching constraint does not allow a register");
452 /* Return DECL iff there's an overlap between *REGS and DECL, where DECL
453 can be an asm-declared register. Called via walk_tree. */
456 decl_overlaps_hard_reg_set_p (tree
*declp
, int *walk_subtrees ATTRIBUTE_UNUSED
,
460 const HARD_REG_SET
*const regs
= (const HARD_REG_SET
*) data
;
464 if (DECL_HARD_REGISTER (decl
)
465 && REG_P (DECL_RTL (decl
))
466 && REGNO (DECL_RTL (decl
)) < FIRST_PSEUDO_REGISTER
)
468 rtx reg
= DECL_RTL (decl
);
470 if (overlaps_hard_reg_set_p (*regs
, GET_MODE (reg
), REGNO (reg
)))
475 else if (TYPE_P (decl
) || TREE_CODE (decl
) == PARM_DECL
)
480 /* If there is an overlap between *REGS and DECL, return the first overlap
483 tree_overlaps_hard_reg_set (tree decl
, HARD_REG_SET
*regs
)
485 return walk_tree (&decl
, decl_overlaps_hard_reg_set_p
, regs
, NULL
);
489 /* A subroutine of expand_asm_operands. Check that all operand names
490 are unique. Return true if so. We rely on the fact that these names
491 are identifiers, and so have been canonicalized by get_identifier,
492 so all we need are pointer comparisons. */
495 check_unique_operand_names (tree outputs
, tree inputs
, tree labels
)
497 tree i
, j
, i_name
= NULL_TREE
;
499 for (i
= outputs
; i
; i
= TREE_CHAIN (i
))
501 i_name
= TREE_PURPOSE (TREE_PURPOSE (i
));
505 for (j
= TREE_CHAIN (i
); j
; j
= TREE_CHAIN (j
))
506 if (simple_cst_equal (i_name
, TREE_PURPOSE (TREE_PURPOSE (j
))))
510 for (i
= inputs
; i
; i
= TREE_CHAIN (i
))
512 i_name
= TREE_PURPOSE (TREE_PURPOSE (i
));
516 for (j
= TREE_CHAIN (i
); j
; j
= TREE_CHAIN (j
))
517 if (simple_cst_equal (i_name
, TREE_PURPOSE (TREE_PURPOSE (j
))))
519 for (j
= outputs
; j
; j
= TREE_CHAIN (j
))
520 if (simple_cst_equal (i_name
, TREE_PURPOSE (TREE_PURPOSE (j
))))
524 for (i
= labels
; i
; i
= TREE_CHAIN (i
))
526 i_name
= TREE_PURPOSE (i
);
530 for (j
= TREE_CHAIN (i
); j
; j
= TREE_CHAIN (j
))
531 if (simple_cst_equal (i_name
, TREE_PURPOSE (j
)))
533 for (j
= inputs
; j
; j
= TREE_CHAIN (j
))
534 if (simple_cst_equal (i_name
, TREE_PURPOSE (TREE_PURPOSE (j
))))
541 error ("duplicate asm operand name %qs", TREE_STRING_POINTER (i_name
));
545 /* Resolve the names of the operands in *POUTPUTS and *PINPUTS to numbers,
546 and replace the name expansions in STRING and in the constraints to
547 those numbers. This is generally done in the front end while creating
548 the ASM_EXPR generic tree that eventually becomes the GIMPLE_ASM. */
551 resolve_asm_operand_names (tree string
, tree outputs
, tree inputs
, tree labels
)
558 check_unique_operand_names (outputs
, inputs
, labels
);
560 /* Substitute [<name>] in input constraint strings. There should be no
561 named operands in output constraints. */
562 for (t
= inputs
; t
; t
= TREE_CHAIN (t
))
564 c
= TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t
)));
565 if (strchr (c
, '[') != NULL
)
567 p
= buffer
= xstrdup (c
);
568 while ((p
= strchr (p
, '[')) != NULL
)
569 p
= resolve_operand_name_1 (p
, outputs
, inputs
, NULL
);
570 TREE_VALUE (TREE_PURPOSE (t
))
571 = build_string (strlen (buffer
), buffer
);
576 /* Now check for any needed substitutions in the template. */
577 c
= TREE_STRING_POINTER (string
);
578 while ((c
= strchr (c
, '%')) != NULL
)
582 else if (ISALPHA (c
[1]) && c
[2] == '[')
586 c
+= 1 + (c
[1] == '%');
593 /* OK, we need to make a copy so we can perform the substitutions.
594 Assume that we will not need extra space--we get to remove '['
595 and ']', which means we cannot have a problem until we have more
596 than 999 operands. */
597 buffer
= xstrdup (TREE_STRING_POINTER (string
));
598 p
= buffer
+ (c
- TREE_STRING_POINTER (string
));
600 while ((p
= strchr (p
, '%')) != NULL
)
604 else if (ISALPHA (p
[1]) && p
[2] == '[')
608 p
+= 1 + (p
[1] == '%');
612 p
= resolve_operand_name_1 (p
, outputs
, inputs
, labels
);
615 string
= build_string (strlen (buffer
), buffer
);
622 /* A subroutine of resolve_operand_names. P points to the '[' for a
623 potential named operand of the form [<name>]. In place, replace
624 the name and brackets with a number. Return a pointer to the
625 balance of the string after substitution. */
628 resolve_operand_name_1 (char *p
, tree outputs
, tree inputs
, tree labels
)
634 /* Collect the operand name. */
635 q
= strchr (++p
, ']');
638 error ("missing close brace for named operand");
639 return strchr (p
, '\0');
643 /* Resolve the name to a number. */
644 for (op
= 0, t
= outputs
; t
; t
= TREE_CHAIN (t
), op
++)
646 tree name
= TREE_PURPOSE (TREE_PURPOSE (t
));
647 if (name
&& strcmp (TREE_STRING_POINTER (name
), p
) == 0)
650 for (t
= inputs
; t
; t
= TREE_CHAIN (t
), op
++)
652 tree name
= TREE_PURPOSE (TREE_PURPOSE (t
));
653 if (name
&& strcmp (TREE_STRING_POINTER (name
), p
) == 0)
656 for (t
= labels
; t
; t
= TREE_CHAIN (t
), op
++)
658 tree name
= TREE_PURPOSE (t
);
659 if (name
&& strcmp (TREE_STRING_POINTER (name
), p
) == 0)
663 error ("undefined named operand %qs", identifier_to_locale (p
));
667 /* Replace the name with the number. Unfortunately, not all libraries
668 get the return value of sprintf correct, so search for the end of the
669 generated string by hand. */
670 sprintf (--p
, "%d", op
);
671 p
= strchr (p
, '\0');
673 /* Verify the no extra buffer space assumption. */
676 /* Shift the rest of the buffer down to fill the gap. */
677 memmove (p
, q
+ 1, strlen (q
+ 1) + 1);
683 /* Generate RTL to return directly from the current function.
684 (That is, we bypass any return value.) */
687 expand_naked_return (void)
689 rtx_code_label
*end_label
;
691 clear_pending_stack_adjust ();
692 do_pending_stack_adjust ();
694 end_label
= naked_return_label
;
696 end_label
= naked_return_label
= gen_label_rtx ();
698 emit_jump (end_label
);
701 /* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. PROB
702 is the probability of jumping to LABEL. */
704 do_jump_if_equal (machine_mode mode
, rtx op0
, rtx op1
, rtx_code_label
*label
,
705 int unsignedp
, int prob
)
707 gcc_assert (prob
<= REG_BR_PROB_BASE
);
708 do_compare_rtx_and_jump (op0
, op1
, EQ
, unsignedp
, mode
,
709 NULL_RTX
, NULL
, label
, prob
);
712 /* Do the insertion of a case label into case_list. The labels are
713 fed to us in descending order from the sorted vector of case labels used
714 in the tree part of the middle end. So the list we construct is
715 sorted in ascending order.
717 LABEL is the case label to be inserted. LOW and HIGH are the bounds
718 against which the index is compared to jump to LABEL and PROB is the
719 estimated probability LABEL is reached from the switch statement. */
721 static struct case_node
*
722 add_case_node (struct case_node
*head
, tree low
, tree high
,
723 tree label
, int prob
,
724 object_allocator
<case_node
> &case_node_pool
)
728 gcc_checking_assert (low
);
729 gcc_checking_assert (high
&& (TREE_TYPE (low
) == TREE_TYPE (high
)));
731 /* Add this label to the chain. */
732 r
= case_node_pool
.allocate ();
735 r
->code_label
= label
;
736 r
->parent
= r
->left
= NULL
;
738 r
->subtree_prob
= prob
;
743 /* Dump ROOT, a list or tree of case nodes, to file. */
746 dump_case_nodes (FILE *f
, struct case_node
*root
,
747 int indent_step
, int indent_level
)
753 dump_case_nodes (f
, root
->left
, indent_step
, indent_level
);
756 fprintf (f
, "%*s", indent_step
* indent_level
, "");
757 print_dec (root
->low
, f
, TYPE_SIGN (TREE_TYPE (root
->low
)));
758 if (!tree_int_cst_equal (root
->low
, root
->high
))
760 fprintf (f
, " ... ");
761 print_dec (root
->high
, f
, TYPE_SIGN (TREE_TYPE (root
->high
)));
765 dump_case_nodes (f
, root
->right
, indent_step
, indent_level
);
768 /* Return the smallest number of different values for which it is best to use a
769 jump-table instead of a tree of conditional branches. */
772 case_values_threshold (void)
774 unsigned int threshold
= PARAM_VALUE (PARAM_CASE_VALUES_THRESHOLD
);
777 threshold
= targetm
.case_values_threshold ();
782 /* Return true if a switch should be expanded as a decision tree.
783 RANGE is the difference between highest and lowest case.
784 UNIQ is number of unique case node targets, not counting the default case.
785 COUNT is the number of comparisons needed, not counting the default case. */
788 expand_switch_as_decision_tree_p (tree range
,
789 unsigned int uniq ATTRIBUTE_UNUSED
,
794 /* If neither casesi or tablejump is available, or flag_jump_tables
795 over-ruled us, we really have no choice. */
796 if (!targetm
.have_casesi () && !targetm
.have_tablejump ())
798 if (!flag_jump_tables
)
800 #ifndef ASM_OUTPUT_ADDR_DIFF_ELT
805 /* If the switch is relatively small such that the cost of one
806 indirect jump on the target are higher than the cost of a
807 decision tree, go with the decision tree.
809 If range of values is much bigger than number of values,
810 or if it is too large to represent in a HOST_WIDE_INT,
811 make a sequence of conditional branches instead of a dispatch.
813 The definition of "much bigger" depends on whether we are
814 optimizing for size or for speed. If the former, the maximum
815 ratio range/count = 3, because this was found to be the optimal
816 ratio for size on i686-pc-linux-gnu, see PR11823. The ratio
817 10 is much older, and was probably selected after an extensive
818 benchmarking investigation on numerous platforms. Or maybe it
819 just made sense to someone at some point in the history of GCC,
821 max_ratio
= optimize_insn_for_size_p () ? 3 : 10;
822 if (count
< case_values_threshold ()
823 || ! tree_fits_uhwi_p (range
)
824 || compare_tree_int (range
, max_ratio
* count
) > 0)
830 /* Generate a decision tree, switching on INDEX_EXPR and jumping to
831 one of the labels in CASE_LIST or to the DEFAULT_LABEL.
832 DEFAULT_PROB is the estimated probability that it jumps to
835 We generate a binary decision tree to select the appropriate target
836 code. This is done as follows:
838 If the index is a short or char that we do not have
839 an insn to handle comparisons directly, convert it to
840 a full integer now, rather than letting each comparison
841 generate the conversion.
843 Load the index into a register.
845 The list of cases is rearranged into a binary tree,
846 nearly optimal assuming equal probability for each case.
848 The tree is transformed into RTL, eliminating redundant
849 test conditions at the same time.
851 If program flow could reach the end of the decision tree
852 an unconditional jump to the default code is emitted.
854 The above process is unaware of the CFG. The caller has to fix up
855 the CFG itself. This is done in cfgexpand.c. */
858 emit_case_decision_tree (tree index_expr
, tree index_type
,
859 case_node_ptr case_list
, rtx_code_label
*default_label
,
862 rtx index
= expand_normal (index_expr
);
864 if (GET_MODE_CLASS (GET_MODE (index
)) == MODE_INT
865 && ! have_insn_for (COMPARE
, GET_MODE (index
)))
867 int unsignedp
= TYPE_UNSIGNED (index_type
);
868 machine_mode wider_mode
;
869 for (wider_mode
= GET_MODE (index
); wider_mode
!= VOIDmode
;
870 wider_mode
= GET_MODE_WIDER_MODE (wider_mode
))
871 if (have_insn_for (COMPARE
, wider_mode
))
873 index
= convert_to_mode (wider_mode
, index
, unsignedp
);
878 do_pending_stack_adjust ();
882 index
= copy_to_reg (index
);
883 if (TREE_CODE (index_expr
) == SSA_NAME
)
884 set_reg_attrs_for_decl_rtl (index_expr
, index
);
887 balance_case_nodes (&case_list
, NULL
);
889 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
891 int indent_step
= ceil_log2 (TYPE_PRECISION (index_type
)) + 2;
892 fprintf (dump_file
, ";; Expanding GIMPLE switch as decision tree:\n");
893 dump_case_nodes (dump_file
, case_list
, indent_step
, 0);
896 emit_case_nodes (index
, case_list
, default_label
, default_prob
, index_type
);
898 emit_jump (default_label
);
901 /* Return the sum of probabilities of outgoing edges of basic block BB. */
904 get_outgoing_edge_probs (basic_block bb
)
911 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
912 prob_sum
+= e
->probability
;
916 /* Computes the conditional probability of jumping to a target if the branch
917 instruction is executed.
918 TARGET_PROB is the estimated probability of jumping to a target relative
919 to some basic block BB.
920 BASE_PROB is the probability of reaching the branch instruction relative
921 to the same basic block BB. */
924 conditional_probability (int target_prob
, int base_prob
)
928 gcc_assert (target_prob
>= 0);
929 gcc_assert (target_prob
<= base_prob
);
930 return GCOV_COMPUTE_SCALE (target_prob
, base_prob
);
935 /* Generate a dispatch tabler, switching on INDEX_EXPR and jumping to
936 one of the labels in CASE_LIST or to the DEFAULT_LABEL.
937 MINVAL, MAXVAL, and RANGE are the extrema and range of the case
938 labels in CASE_LIST. STMT_BB is the basic block containing the statement.
940 First, a jump insn is emitted. First we try "casesi". If that
941 fails, try "tablejump". A target *must* have one of them (or both).
943 Then, a table with the target labels is emitted.
945 The process is unaware of the CFG. The caller has to fix up
946 the CFG itself. This is done in cfgexpand.c. */
949 emit_case_dispatch_table (tree index_expr
, tree index_type
,
950 struct case_node
*case_list
, rtx default_label
,
951 tree minval
, tree maxval
, tree range
,
957 rtx_insn
*fallback_label
= label_rtx (case_list
->code_label
);
958 rtx_code_label
*table_label
= gen_label_rtx ();
959 bool has_gaps
= false;
960 edge default_edge
= stmt_bb
? EDGE_SUCC (stmt_bb
, 0) : NULL
;
961 int default_prob
= default_edge
? default_edge
->probability
: 0;
962 int base
= get_outgoing_edge_probs (stmt_bb
);
963 bool try_with_tablejump
= false;
965 int new_default_prob
= conditional_probability (default_prob
,
968 if (! try_casesi (index_type
, index_expr
, minval
, range
,
969 table_label
, default_label
, fallback_label
,
972 /* Index jumptables from zero for suitable values of minval to avoid
973 a subtraction. For the rationale see:
974 "http://gcc.gnu.org/ml/gcc-patches/2001-10/msg01234.html". */
975 if (optimize_insn_for_speed_p ()
976 && compare_tree_int (minval
, 0) > 0
977 && compare_tree_int (minval
, 3) < 0)
979 minval
= build_int_cst (index_type
, 0);
983 try_with_tablejump
= true;
986 /* Get table of labels to jump to, in order of case index. */
988 ncases
= tree_to_shwi (range
) + 1;
989 labelvec
= XALLOCAVEC (rtx
, ncases
);
990 memset (labelvec
, 0, ncases
* sizeof (rtx
));
992 for (n
= case_list
; n
; n
= n
->right
)
994 /* Compute the low and high bounds relative to the minimum
995 value since that should fit in a HOST_WIDE_INT while the
996 actual values may not. */
998 = tree_to_uhwi (fold_build2 (MINUS_EXPR
, index_type
,
1000 HOST_WIDE_INT i_high
1001 = tree_to_uhwi (fold_build2 (MINUS_EXPR
, index_type
,
1005 for (i
= i_low
; i
<= i_high
; i
++)
1007 = gen_rtx_LABEL_REF (Pmode
, label_rtx (n
->code_label
));
1010 /* Fill in the gaps with the default. We may have gaps at
1011 the beginning if we tried to avoid the minval subtraction,
1012 so substitute some label even if the default label was
1013 deemed unreachable. */
1015 default_label
= fallback_label
;
1016 for (i
= 0; i
< ncases
; i
++)
1017 if (labelvec
[i
] == 0)
1020 labelvec
[i
] = gen_rtx_LABEL_REF (Pmode
, default_label
);
1025 /* There is at least one entry in the jump table that jumps
1026 to default label. The default label can either be reached
1027 through the indirect jump or the direct conditional jump
1028 before that. Split the probability of reaching the
1029 default label among these two jumps. */
1030 new_default_prob
= conditional_probability (default_prob
/2,
1033 base
-= default_prob
;
1037 base
-= default_prob
;
1042 default_edge
->probability
= default_prob
;
1044 /* We have altered the probability of the default edge. So the probabilities
1045 of all other edges need to be adjusted so that it sums up to
1046 REG_BR_PROB_BASE. */
1051 FOR_EACH_EDGE (e
, ei
, stmt_bb
->succs
)
1052 e
->probability
= GCOV_COMPUTE_SCALE (e
->probability
, base
);
1055 if (try_with_tablejump
)
1057 bool ok
= try_tablejump (index_type
, index_expr
, minval
, range
,
1058 table_label
, default_label
, new_default_prob
);
1061 /* Output the table. */
1062 emit_label (table_label
);
1064 if (CASE_VECTOR_PC_RELATIVE
|| flag_pic
)
1065 emit_jump_table_data (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE
,
1066 gen_rtx_LABEL_REF (Pmode
,
1068 gen_rtvec_v (ncases
, labelvec
),
1069 const0_rtx
, const0_rtx
));
1071 emit_jump_table_data (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE
,
1072 gen_rtvec_v (ncases
, labelvec
)));
1074 /* Record no drop-through after the table. */
1078 /* Reset the aux field of all outgoing edges of basic block BB. */
1081 reset_out_edges_aux (basic_block bb
)
1085 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1089 /* Compute the number of case labels that correspond to each outgoing edge of
1090 STMT. Record this information in the aux field of the edge. */
1093 compute_cases_per_edge (gswitch
*stmt
)
1095 basic_block bb
= gimple_bb (stmt
);
1096 reset_out_edges_aux (bb
);
1097 int ncases
= gimple_switch_num_labels (stmt
);
1098 for (int i
= ncases
- 1; i
>= 1; --i
)
1100 tree elt
= gimple_switch_label (stmt
, i
);
1101 tree lab
= CASE_LABEL (elt
);
1102 basic_block case_bb
= label_to_block_fn (cfun
, lab
);
1103 edge case_edge
= find_edge (bb
, case_bb
);
1104 case_edge
->aux
= (void *)((intptr_t)(case_edge
->aux
) + 1);
1108 /* Terminate a case (Pascal/Ada) or switch (C) statement
1109 in which ORIG_INDEX is the expression to be tested.
1110 If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
1111 type as given in the source before any compiler conversions.
1112 Generate the code to test it and jump to the right place. */
1115 expand_case (gswitch
*stmt
)
1117 tree minval
= NULL_TREE
, maxval
= NULL_TREE
, range
= NULL_TREE
;
1118 rtx_code_label
*default_label
= NULL
;
1119 unsigned int count
, uniq
;
1121 int ncases
= gimple_switch_num_labels (stmt
);
1122 tree index_expr
= gimple_switch_index (stmt
);
1123 tree index_type
= TREE_TYPE (index_expr
);
1125 basic_block bb
= gimple_bb (stmt
);
1127 /* A list of case labels; it is first built as a list and it may then
1128 be rearranged into a nearly balanced binary tree. */
1129 struct case_node
*case_list
= 0;
1131 /* A pool for case nodes. */
1132 object_allocator
<case_node
> case_node_pool ("struct case_node pool");
1134 /* An ERROR_MARK occurs for various reasons including invalid data type.
1135 ??? Can this still happen, with GIMPLE and all? */
1136 if (index_type
== error_mark_node
)
1139 /* cleanup_tree_cfg removes all SWITCH_EXPR with their index
1140 expressions being INTEGER_CST. */
1141 gcc_assert (TREE_CODE (index_expr
) != INTEGER_CST
);
1144 do_pending_stack_adjust ();
1146 /* Find the default case target label. */
1147 default_label
= jump_target_rtx
1148 (CASE_LABEL (gimple_switch_default_label (stmt
)));
1149 edge default_edge
= EDGE_SUCC (bb
, 0);
1150 int default_prob
= default_edge
->probability
;
1152 /* Get upper and lower bounds of case values. */
1153 elt
= gimple_switch_label (stmt
, 1);
1154 minval
= fold_convert (index_type
, CASE_LOW (elt
));
1155 elt
= gimple_switch_label (stmt
, ncases
- 1);
1156 if (CASE_HIGH (elt
))
1157 maxval
= fold_convert (index_type
, CASE_HIGH (elt
));
1159 maxval
= fold_convert (index_type
, CASE_LOW (elt
));
1161 /* Compute span of values. */
1162 range
= fold_build2 (MINUS_EXPR
, index_type
, maxval
, minval
);
1164 /* Listify the labels queue and gather some numbers to decide
1165 how to expand this switch(). */
1168 hash_set
<tree
> seen_labels
;
1169 compute_cases_per_edge (stmt
);
1171 for (i
= ncases
- 1; i
>= 1; --i
)
1173 elt
= gimple_switch_label (stmt
, i
);
1174 tree low
= CASE_LOW (elt
);
1176 tree high
= CASE_HIGH (elt
);
1177 gcc_assert (! high
|| tree_int_cst_lt (low
, high
));
1178 tree lab
= CASE_LABEL (elt
);
1180 /* Count the elements.
1181 A range counts double, since it requires two compares. */
1186 /* If we have not seen this label yet, then increase the
1187 number of unique case node targets seen. */
1188 if (!seen_labels
.add (lab
))
1191 /* The bounds on the case range, LOW and HIGH, have to be converted
1192 to case's index type TYPE. Note that the original type of the
1193 case index in the source code is usually "lost" during
1194 gimplification due to type promotion, but the case labels retain the
1195 original type. Make sure to drop overflow flags. */
1196 low
= fold_convert (index_type
, low
);
1197 if (TREE_OVERFLOW (low
))
1198 low
= wide_int_to_tree (index_type
, low
);
1200 /* The canonical from of a case label in GIMPLE is that a simple case
1201 has an empty CASE_HIGH. For the casesi and tablejump expanders,
1202 the back ends want simple cases to have high == low. */
1205 high
= fold_convert (index_type
, high
);
1206 if (TREE_OVERFLOW (high
))
1207 high
= wide_int_to_tree (index_type
, high
);
1209 basic_block case_bb
= label_to_block_fn (cfun
, lab
);
1210 edge case_edge
= find_edge (bb
, case_bb
);
1211 case_list
= add_case_node (
1212 case_list
, low
, high
, lab
,
1213 case_edge
->probability
/ (intptr_t)(case_edge
->aux
),
1216 reset_out_edges_aux (bb
);
1218 /* cleanup_tree_cfg removes all SWITCH_EXPR with a single
1219 destination, such as one with a default case only.
1220 It also removes cases that are out of range for the switch
1221 type, so we should never get a zero here. */
1222 gcc_assert (count
> 0);
1224 rtx_insn
*before_case
= get_last_insn ();
1226 /* Decide how to expand this switch.
1227 The two options at this point are a dispatch table (casesi or
1228 tablejump) or a decision tree. */
1230 if (expand_switch_as_decision_tree_p (range
, uniq
, count
))
1231 emit_case_decision_tree (index_expr
, index_type
,
1232 case_list
, default_label
,
1235 emit_case_dispatch_table (index_expr
, index_type
,
1236 case_list
, default_label
,
1237 minval
, maxval
, range
, bb
);
1239 reorder_insns (NEXT_INSN (before_case
), get_last_insn (), before_case
);
1244 /* Expand the dispatch to a short decrement chain if there are few cases
1245 to dispatch to. Likewise if neither casesi nor tablejump is available,
1246 or if flag_jump_tables is set. Otherwise, expand as a casesi or a
1247 tablejump. The index mode is always the mode of integer_type_node.
1248 Trap if no case matches the index.
1250 DISPATCH_INDEX is the index expression to switch on. It should be a
1251 memory or register operand.
1253 DISPATCH_TABLE is a set of case labels. The set should be sorted in
1254 ascending order, be contiguous, starting with value 0, and contain only
1255 single-valued case labels. */
1258 expand_sjlj_dispatch_table (rtx dispatch_index
,
1259 vec
<tree
> dispatch_table
)
1261 tree index_type
= integer_type_node
;
1262 machine_mode index_mode
= TYPE_MODE (index_type
);
1264 int ncases
= dispatch_table
.length ();
1266 do_pending_stack_adjust ();
1267 rtx_insn
*before_case
= get_last_insn ();
1269 /* Expand as a decrement-chain if there are 5 or fewer dispatch
1270 labels. This covers more than 98% of the cases in libjava,
1271 and seems to be a reasonable compromise between the "old way"
1272 of expanding as a decision tree or dispatch table vs. the "new
1273 way" with decrement chain or dispatch table. */
1274 if (dispatch_table
.length () <= 5
1275 || (!targetm
.have_casesi () && !targetm
.have_tablejump ())
1276 || !flag_jump_tables
)
1278 /* Expand the dispatch as a decrement chain:
1280 "switch(index) {case 0: do_0; case 1: do_1; ...; case N: do_N;}"
1284 if (index == 0) do_0; else index--;
1285 if (index == 0) do_1; else index--;
1287 if (index == 0) do_N; else index--;
1289 This is more efficient than a dispatch table on most machines.
1290 The last "index--" is redundant but the code is trivially dead
1291 and will be cleaned up by later passes. */
1292 rtx index
= copy_to_mode_reg (index_mode
, dispatch_index
);
1293 rtx zero
= CONST0_RTX (index_mode
);
1294 for (int i
= 0; i
< ncases
; i
++)
1296 tree elt
= dispatch_table
[i
];
1297 rtx_code_label
*lab
= jump_target_rtx (CASE_LABEL (elt
));
1298 do_jump_if_equal (index_mode
, index
, zero
, lab
, 0, -1);
1299 force_expand_binop (index_mode
, sub_optab
,
1300 index
, CONST1_RTX (index_mode
),
1301 index
, 0, OPTAB_DIRECT
);
1306 /* Similar to expand_case, but much simpler. */
1307 struct case_node
*case_list
= 0;
1308 object_allocator
<case_node
> case_node_pool ("struct sjlj_case pool");
1309 tree index_expr
= make_tree (index_type
, dispatch_index
);
1310 tree minval
= build_int_cst (index_type
, 0);
1311 tree maxval
= CASE_LOW (dispatch_table
.last ());
1312 tree range
= maxval
;
1313 rtx_code_label
*default_label
= gen_label_rtx ();
1315 for (int i
= ncases
- 1; i
>= 0; --i
)
1317 tree elt
= dispatch_table
[i
];
1318 tree low
= CASE_LOW (elt
);
1319 tree lab
= CASE_LABEL (elt
);
1320 case_list
= add_case_node (case_list
, low
, low
, lab
, 0, case_node_pool
);
1323 emit_case_dispatch_table (index_expr
, index_type
,
1324 case_list
, default_label
,
1325 minval
, maxval
, range
,
1326 BLOCK_FOR_INSN (before_case
));
1327 emit_label (default_label
);
1330 /* Dispatching something not handled? Trap! */
1331 expand_builtin_trap ();
1333 reorder_insns (NEXT_INSN (before_case
), get_last_insn (), before_case
);
1339 /* Take an ordered list of case nodes
1340 and transform them into a near optimal binary tree,
1341 on the assumption that any target code selection value is as
1342 likely as any other.
1344 The transformation is performed by splitting the ordered
1345 list into two equal sections plus a pivot. The parts are
1346 then attached to the pivot as left and right branches. Each
1347 branch is then transformed recursively. */
1350 balance_case_nodes (case_node_ptr
*head
, case_node_ptr parent
)
1362 /* Count the number of entries on branch. Also count the ranges. */
1366 if (!tree_int_cst_equal (np
->low
, np
->high
))
1375 /* Split this list if it is long enough for that to help. */
1379 /* If there are just three nodes, split at the middle one. */
1381 npp
= &(*npp
)->right
;
1384 /* Find the place in the list that bisects the list's total cost,
1385 where ranges count as 2.
1386 Here I gets half the total cost. */
1387 i
= (i
+ ranges
+ 1) / 2;
1390 /* Skip nodes while their cost does not reach that amount. */
1391 if (!tree_int_cst_equal ((*npp
)->low
, (*npp
)->high
))
1396 npp
= &(*npp
)->right
;
1401 np
->parent
= parent
;
1404 /* Optimize each of the two split parts. */
1405 balance_case_nodes (&np
->left
, np
);
1406 balance_case_nodes (&np
->right
, np
);
1407 np
->subtree_prob
= np
->prob
;
1408 np
->subtree_prob
+= np
->left
->subtree_prob
;
1409 np
->subtree_prob
+= np
->right
->subtree_prob
;
1413 /* Else leave this branch as one level,
1414 but fill in `parent' fields. */
1416 np
->parent
= parent
;
1417 np
->subtree_prob
= np
->prob
;
1418 for (; np
->right
; np
= np
->right
)
1420 np
->right
->parent
= np
;
1421 (*head
)->subtree_prob
+= np
->right
->subtree_prob
;
1427 /* Search the parent sections of the case node tree
1428 to see if a test for the lower bound of NODE would be redundant.
1429 INDEX_TYPE is the type of the index expression.
1431 The instructions to generate the case decision tree are
1432 output in the same order as nodes are processed so it is
1433 known that if a parent node checks the range of the current
1434 node minus one that the current node is bounded at its lower
1435 span. Thus the test would be redundant. */
1438 node_has_low_bound (case_node_ptr node
, tree index_type
)
1441 case_node_ptr pnode
;
1443 /* If the lower bound of this node is the lowest value in the index type,
1444 we need not test it. */
1446 if (tree_int_cst_equal (node
->low
, TYPE_MIN_VALUE (index_type
)))
1449 /* If this node has a left branch, the value at the left must be less
1450 than that at this node, so it cannot be bounded at the bottom and
1451 we need not bother testing any further. */
1456 low_minus_one
= fold_build2 (MINUS_EXPR
, TREE_TYPE (node
->low
),
1458 build_int_cst (TREE_TYPE (node
->low
), 1));
1460 /* If the subtraction above overflowed, we can't verify anything.
1461 Otherwise, look for a parent that tests our value - 1. */
1463 if (! tree_int_cst_lt (low_minus_one
, node
->low
))
1466 for (pnode
= node
->parent
; pnode
; pnode
= pnode
->parent
)
1467 if (tree_int_cst_equal (low_minus_one
, pnode
->high
))
1473 /* Search the parent sections of the case node tree
1474 to see if a test for the upper bound of NODE would be redundant.
1475 INDEX_TYPE is the type of the index expression.
1477 The instructions to generate the case decision tree are
1478 output in the same order as nodes are processed so it is
1479 known that if a parent node checks the range of the current
1480 node plus one that the current node is bounded at its upper
1481 span. Thus the test would be redundant. */
1484 node_has_high_bound (case_node_ptr node
, tree index_type
)
1487 case_node_ptr pnode
;
1489 /* If there is no upper bound, obviously no test is needed. */
1491 if (TYPE_MAX_VALUE (index_type
) == NULL
)
1494 /* If the upper bound of this node is the highest value in the type
1495 of the index expression, we need not test against it. */
1497 if (tree_int_cst_equal (node
->high
, TYPE_MAX_VALUE (index_type
)))
1500 /* If this node has a right branch, the value at the right must be greater
1501 than that at this node, so it cannot be bounded at the top and
1502 we need not bother testing any further. */
1507 high_plus_one
= fold_build2 (PLUS_EXPR
, TREE_TYPE (node
->high
),
1509 build_int_cst (TREE_TYPE (node
->high
), 1));
1511 /* If the addition above overflowed, we can't verify anything.
1512 Otherwise, look for a parent that tests our value + 1. */
1514 if (! tree_int_cst_lt (node
->high
, high_plus_one
))
1517 for (pnode
= node
->parent
; pnode
; pnode
= pnode
->parent
)
1518 if (tree_int_cst_equal (high_plus_one
, pnode
->low
))
1524 /* Search the parent sections of the
1525 case node tree to see if both tests for the upper and lower
1526 bounds of NODE would be redundant. */
1529 node_is_bounded (case_node_ptr node
, tree index_type
)
1531 return (node_has_low_bound (node
, index_type
)
1532 && node_has_high_bound (node
, index_type
));
1536 /* Emit step-by-step code to select a case for the value of INDEX.
1537 The thus generated decision tree follows the form of the
1538 case-node binary tree NODE, whose nodes represent test conditions.
1539 INDEX_TYPE is the type of the index of the switch.
1541 Care is taken to prune redundant tests from the decision tree
1542 by detecting any boundary conditions already checked by
1543 emitted rtx. (See node_has_high_bound, node_has_low_bound
1544 and node_is_bounded, above.)
1546 Where the test conditions can be shown to be redundant we emit
1547 an unconditional jump to the target code. As a further
1548 optimization, the subordinates of a tree node are examined to
1549 check for bounded nodes. In this case conditional and/or
1550 unconditional jumps as a result of the boundary check for the
1551 current node are arranged to target the subordinates associated
1552 code for out of bound conditions on the current node.
1554 We can assume that when control reaches the code generated here,
1555 the index value has already been compared with the parents
1556 of this node, and determined to be on the same side of each parent
1557 as this node is. Thus, if this node tests for the value 51,
1558 and a parent tested for 52, we don't need to consider
1559 the possibility of a value greater than 51. If another parent
1560 tests for the value 50, then this node need not test anything. */
1563 emit_case_nodes (rtx index
, case_node_ptr node
, rtx_code_label
*default_label
,
1564 int default_prob
, tree index_type
)
1566 /* If INDEX has an unsigned type, we must make unsigned branches. */
1567 int unsignedp
= TYPE_UNSIGNED (index_type
);
1569 int prob
= node
->prob
, subtree_prob
= node
->subtree_prob
;
1570 machine_mode mode
= GET_MODE (index
);
1571 machine_mode imode
= TYPE_MODE (index_type
);
1573 /* Handle indices detected as constant during RTL expansion. */
1574 if (mode
== VOIDmode
)
1577 /* See if our parents have already tested everything for us.
1578 If they have, emit an unconditional jump for this node. */
1579 if (node_is_bounded (node
, index_type
))
1580 emit_jump (label_rtx (node
->code_label
));
1582 else if (tree_int_cst_equal (node
->low
, node
->high
))
1584 probability
= conditional_probability (prob
, subtree_prob
+ default_prob
);
1585 /* Node is single valued. First see if the index expression matches
1586 this node and then check our children, if any. */
1587 do_jump_if_equal (mode
, index
,
1588 convert_modes (mode
, imode
,
1589 expand_normal (node
->low
),
1591 jump_target_rtx (node
->code_label
),
1592 unsignedp
, probability
);
1593 /* Since this case is taken at this point, reduce its weight from
1595 subtree_prob
-= prob
;
1596 if (node
->right
!= 0 && node
->left
!= 0)
1598 /* This node has children on both sides.
1599 Dispatch to one side or the other
1600 by comparing the index value with this node's value.
1601 If one subtree is bounded, check that one first,
1602 so we can avoid real branches in the tree. */
1604 if (node_is_bounded (node
->right
, index_type
))
1606 probability
= conditional_probability (
1608 subtree_prob
+ default_prob
);
1609 emit_cmp_and_jump_insns (index
,
1612 expand_normal (node
->high
),
1614 GT
, NULL_RTX
, mode
, unsignedp
,
1615 label_rtx (node
->right
->code_label
),
1617 emit_case_nodes (index
, node
->left
, default_label
, default_prob
,
1621 else if (node_is_bounded (node
->left
, index_type
))
1623 probability
= conditional_probability (
1625 subtree_prob
+ default_prob
);
1626 emit_cmp_and_jump_insns (index
,
1629 expand_normal (node
->high
),
1631 LT
, NULL_RTX
, mode
, unsignedp
,
1632 label_rtx (node
->left
->code_label
),
1634 emit_case_nodes (index
, node
->right
, default_label
, default_prob
,
1638 /* If both children are single-valued cases with no
1639 children, finish up all the work. This way, we can save
1640 one ordered comparison. */
1641 else if (tree_int_cst_equal (node
->right
->low
, node
->right
->high
)
1642 && node
->right
->left
== 0
1643 && node
->right
->right
== 0
1644 && tree_int_cst_equal (node
->left
->low
, node
->left
->high
)
1645 && node
->left
->left
== 0
1646 && node
->left
->right
== 0)
1648 /* Neither node is bounded. First distinguish the two sides;
1649 then emit the code for one side at a time. */
1651 /* See if the value matches what the right hand side
1653 probability
= conditional_probability (
1655 subtree_prob
+ default_prob
);
1656 do_jump_if_equal (mode
, index
,
1657 convert_modes (mode
, imode
,
1658 expand_normal (node
->right
->low
),
1660 jump_target_rtx (node
->right
->code_label
),
1661 unsignedp
, probability
);
1663 /* See if the value matches what the left hand side
1665 probability
= conditional_probability (
1667 subtree_prob
+ default_prob
);
1668 do_jump_if_equal (mode
, index
,
1669 convert_modes (mode
, imode
,
1670 expand_normal (node
->left
->low
),
1672 jump_target_rtx (node
->left
->code_label
),
1673 unsignedp
, probability
);
1678 /* Neither node is bounded. First distinguish the two sides;
1679 then emit the code for one side at a time. */
1682 = build_decl (curr_insn_location (),
1683 LABEL_DECL
, NULL_TREE
, void_type_node
);
1685 /* The default label could be reached either through the right
1686 subtree or the left subtree. Divide the probability
1688 probability
= conditional_probability (
1689 node
->right
->subtree_prob
+ default_prob
/2,
1690 subtree_prob
+ default_prob
);
1691 /* See if the value is on the right. */
1692 emit_cmp_and_jump_insns (index
,
1695 expand_normal (node
->high
),
1697 GT
, NULL_RTX
, mode
, unsignedp
,
1698 label_rtx (test_label
),
1702 /* Value must be on the left.
1703 Handle the left-hand subtree. */
1704 emit_case_nodes (index
, node
->left
, default_label
, default_prob
, index_type
);
1705 /* If left-hand subtree does nothing,
1708 emit_jump (default_label
);
1710 /* Code branches here for the right-hand subtree. */
1711 expand_label (test_label
);
1712 emit_case_nodes (index
, node
->right
, default_label
, default_prob
, index_type
);
1716 else if (node
->right
!= 0 && node
->left
== 0)
1718 /* Here we have a right child but no left so we issue a conditional
1719 branch to default and process the right child.
1721 Omit the conditional branch to default if the right child
1722 does not have any children and is single valued; it would
1723 cost too much space to save so little time. */
1725 if (node
->right
->right
|| node
->right
->left
1726 || !tree_int_cst_equal (node
->right
->low
, node
->right
->high
))
1728 if (!node_has_low_bound (node
, index_type
))
1730 probability
= conditional_probability (
1732 subtree_prob
+ default_prob
);
1733 emit_cmp_and_jump_insns (index
,
1736 expand_normal (node
->high
),
1738 LT
, NULL_RTX
, mode
, unsignedp
,
1744 emit_case_nodes (index
, node
->right
, default_label
, default_prob
, index_type
);
1748 probability
= conditional_probability (
1749 node
->right
->subtree_prob
,
1750 subtree_prob
+ default_prob
);
1751 /* We cannot process node->right normally
1752 since we haven't ruled out the numbers less than
1753 this node's value. So handle node->right explicitly. */
1754 do_jump_if_equal (mode
, index
,
1757 expand_normal (node
->right
->low
),
1759 jump_target_rtx (node
->right
->code_label
),
1760 unsignedp
, probability
);
1764 else if (node
->right
== 0 && node
->left
!= 0)
1766 /* Just one subtree, on the left. */
1767 if (node
->left
->left
|| node
->left
->right
1768 || !tree_int_cst_equal (node
->left
->low
, node
->left
->high
))
1770 if (!node_has_high_bound (node
, index_type
))
1772 probability
= conditional_probability (
1774 subtree_prob
+ default_prob
);
1775 emit_cmp_and_jump_insns (index
,
1778 expand_normal (node
->high
),
1780 GT
, NULL_RTX
, mode
, unsignedp
,
1786 emit_case_nodes (index
, node
->left
, default_label
,
1787 default_prob
, index_type
);
1791 probability
= conditional_probability (
1792 node
->left
->subtree_prob
,
1793 subtree_prob
+ default_prob
);
1794 /* We cannot process node->left normally
1795 since we haven't ruled out the numbers less than
1796 this node's value. So handle node->left explicitly. */
1797 do_jump_if_equal (mode
, index
,
1800 expand_normal (node
->left
->low
),
1802 jump_target_rtx (node
->left
->code_label
),
1803 unsignedp
, probability
);
1809 /* Node is a range. These cases are very similar to those for a single
1810 value, except that we do not start by testing whether this node
1811 is the one to branch to. */
1813 if (node
->right
!= 0 && node
->left
!= 0)
1815 /* Node has subtrees on both sides.
1816 If the right-hand subtree is bounded,
1817 test for it first, since we can go straight there.
1818 Otherwise, we need to make a branch in the control structure,
1819 then handle the two subtrees. */
1820 tree test_label
= 0;
1822 if (node_is_bounded (node
->right
, index_type
))
1824 /* Right hand node is fully bounded so we can eliminate any
1825 testing and branch directly to the target code. */
1826 probability
= conditional_probability (
1827 node
->right
->subtree_prob
,
1828 subtree_prob
+ default_prob
);
1829 emit_cmp_and_jump_insns (index
,
1832 expand_normal (node
->high
),
1834 GT
, NULL_RTX
, mode
, unsignedp
,
1835 label_rtx (node
->right
->code_label
),
1840 /* Right hand node requires testing.
1841 Branch to a label where we will handle it later. */
1843 test_label
= build_decl (curr_insn_location (),
1844 LABEL_DECL
, NULL_TREE
, void_type_node
);
1845 probability
= conditional_probability (
1846 node
->right
->subtree_prob
+ default_prob
/2,
1847 subtree_prob
+ default_prob
);
1848 emit_cmp_and_jump_insns (index
,
1851 expand_normal (node
->high
),
1853 GT
, NULL_RTX
, mode
, unsignedp
,
1854 label_rtx (test_label
),
1859 /* Value belongs to this node or to the left-hand subtree. */
1861 probability
= conditional_probability (
1863 subtree_prob
+ default_prob
);
1864 emit_cmp_and_jump_insns (index
,
1867 expand_normal (node
->low
),
1869 GE
, NULL_RTX
, mode
, unsignedp
,
1870 label_rtx (node
->code_label
),
1873 /* Handle the left-hand subtree. */
1874 emit_case_nodes (index
, node
->left
, default_label
, default_prob
, index_type
);
1876 /* If right node had to be handled later, do that now. */
1880 /* If the left-hand subtree fell through,
1881 don't let it fall into the right-hand subtree. */
1883 emit_jump (default_label
);
1885 expand_label (test_label
);
1886 emit_case_nodes (index
, node
->right
, default_label
, default_prob
, index_type
);
1890 else if (node
->right
!= 0 && node
->left
== 0)
1892 /* Deal with values to the left of this node,
1893 if they are possible. */
1894 if (!node_has_low_bound (node
, index_type
))
1896 probability
= conditional_probability (
1898 subtree_prob
+ default_prob
);
1899 emit_cmp_and_jump_insns (index
,
1902 expand_normal (node
->low
),
1904 LT
, NULL_RTX
, mode
, unsignedp
,
1910 /* Value belongs to this node or to the right-hand subtree. */
1912 probability
= conditional_probability (
1914 subtree_prob
+ default_prob
);
1915 emit_cmp_and_jump_insns (index
,
1918 expand_normal (node
->high
),
1920 LE
, NULL_RTX
, mode
, unsignedp
,
1921 label_rtx (node
->code_label
),
1924 emit_case_nodes (index
, node
->right
, default_label
, default_prob
, index_type
);
1927 else if (node
->right
== 0 && node
->left
!= 0)
1929 /* Deal with values to the right of this node,
1930 if they are possible. */
1931 if (!node_has_high_bound (node
, index_type
))
1933 probability
= conditional_probability (
1935 subtree_prob
+ default_prob
);
1936 emit_cmp_and_jump_insns (index
,
1939 expand_normal (node
->high
),
1941 GT
, NULL_RTX
, mode
, unsignedp
,
1947 /* Value belongs to this node or to the left-hand subtree. */
1949 probability
= conditional_probability (
1951 subtree_prob
+ default_prob
);
1952 emit_cmp_and_jump_insns (index
,
1955 expand_normal (node
->low
),
1957 GE
, NULL_RTX
, mode
, unsignedp
,
1958 label_rtx (node
->code_label
),
1961 emit_case_nodes (index
, node
->left
, default_label
, default_prob
, index_type
);
1966 /* Node has no children so we check low and high bounds to remove
1967 redundant tests. Only one of the bounds can exist,
1968 since otherwise this node is bounded--a case tested already. */
1969 int high_bound
= node_has_high_bound (node
, index_type
);
1970 int low_bound
= node_has_low_bound (node
, index_type
);
1972 if (!high_bound
&& low_bound
)
1974 probability
= conditional_probability (
1976 subtree_prob
+ default_prob
);
1977 emit_cmp_and_jump_insns (index
,
1980 expand_normal (node
->high
),
1982 GT
, NULL_RTX
, mode
, unsignedp
,
1987 else if (!low_bound
&& high_bound
)
1989 probability
= conditional_probability (
1991 subtree_prob
+ default_prob
);
1992 emit_cmp_and_jump_insns (index
,
1995 expand_normal (node
->low
),
1997 LT
, NULL_RTX
, mode
, unsignedp
,
2001 else if (!low_bound
&& !high_bound
)
2003 /* Widen LOW and HIGH to the same width as INDEX. */
2004 tree type
= lang_hooks
.types
.type_for_mode (mode
, unsignedp
);
2005 tree low
= build1 (CONVERT_EXPR
, type
, node
->low
);
2006 tree high
= build1 (CONVERT_EXPR
, type
, node
->high
);
2007 rtx low_rtx
, new_index
, new_bound
;
2009 /* Instead of doing two branches, emit one unsigned branch for
2010 (index-low) > (high-low). */
2011 low_rtx
= expand_expr (low
, NULL_RTX
, mode
, EXPAND_NORMAL
);
2012 new_index
= expand_simple_binop (mode
, MINUS
, index
, low_rtx
,
2013 NULL_RTX
, unsignedp
,
2015 new_bound
= expand_expr (fold_build2 (MINUS_EXPR
, type
,
2017 NULL_RTX
, mode
, EXPAND_NORMAL
);
2019 probability
= conditional_probability (
2021 subtree_prob
+ default_prob
);
2022 emit_cmp_and_jump_insns (new_index
, new_bound
, GT
, NULL_RTX
,
2023 mode
, 1, default_label
, probability
);
2026 emit_jump (jump_target_rtx (node
->code_label
));