1 /* Expands front end tree to back end RTL for GCC
2 Copyright (C) 1987-2022 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.cc.
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"
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.
66 Switch statements are expanded in jump table form.
70 class simple_case_node
73 simple_case_node (tree low
, tree high
, tree code_label
):
74 m_low (low
), m_high (high
), m_code_label (code_label
)
77 /* Lowest index value for this label. */
79 /* Highest index value for this label. */
81 /* Label to jump to when node matches. */
85 static bool check_unique_operand_names (tree
, tree
, tree
);
86 static char *resolve_operand_name_1 (char *, tree
, tree
, tree
);
88 /* Return the rtx-label that corresponds to a LABEL_DECL,
89 creating it if necessary. */
92 label_rtx (tree label
)
94 gcc_assert (TREE_CODE (label
) == LABEL_DECL
);
96 if (!DECL_RTL_SET_P (label
))
98 rtx_code_label
*r
= gen_label_rtx ();
99 SET_DECL_RTL (label
, r
);
100 if (FORCED_LABEL (label
) || DECL_NONLOCAL (label
))
101 LABEL_PRESERVE_P (r
) = 1;
104 return as_a
<rtx_insn
*> (DECL_RTL (label
));
107 /* As above, but also put it on the forced-reference list of the
108 function that contains it. */
110 force_label_rtx (tree label
)
112 rtx_insn
*ref
= label_rtx (label
);
113 tree function
= decl_function_context (label
);
115 gcc_assert (function
);
117 vec_safe_push (forced_labels
, ref
);
121 /* As label_rtx, but ensures (in check build), that returned value is
122 an existing label (i.e. rtx with code CODE_LABEL). */
124 jump_target_rtx (tree label
)
126 return as_a
<rtx_code_label
*> (label_rtx (label
));
129 /* Add an unconditional jump to LABEL as the next sequential instruction. */
132 emit_jump (rtx label
)
134 do_pending_stack_adjust ();
135 emit_jump_insn (targetm
.gen_jump (label
));
139 /* Handle goto statements and the labels that they can go to. */
141 /* Specify the location in the RTL code of a label LABEL,
142 which is a LABEL_DECL tree node.
144 This is used for the kind of label that the user can jump to with a
145 goto statement, and for alternatives of a switch or case statement.
146 RTL labels generated for loops and conditionals don't go through here;
147 they are generated directly at the RTL level, by other functions below.
149 Note that this has nothing to do with defining label *names*.
150 Languages vary in how they do that and what that even means. */
153 expand_label (tree label
)
155 rtx_code_label
*label_r
= jump_target_rtx (label
);
157 do_pending_stack_adjust ();
158 emit_label (label_r
);
159 if (DECL_NAME (label
))
160 LABEL_NAME (DECL_RTL (label
)) = IDENTIFIER_POINTER (DECL_NAME (label
));
162 if (DECL_NONLOCAL (label
))
164 expand_builtin_setjmp_receiver (NULL
);
165 nonlocal_goto_handler_labels
166 = gen_rtx_INSN_LIST (VOIDmode
, label_r
,
167 nonlocal_goto_handler_labels
);
170 if (FORCED_LABEL (label
))
171 vec_safe_push
<rtx_insn
*> (forced_labels
, label_r
);
173 if (DECL_NONLOCAL (label
) || FORCED_LABEL (label
))
174 maybe_set_first_label_num (label_r
);
177 /* Parse the output constraint pointed to by *CONSTRAINT_P. It is the
178 OPERAND_NUMth output operand, indexed from zero. There are NINPUTS
179 inputs and NOUTPUTS outputs to this extended-asm. Upon return,
180 *ALLOWS_MEM will be TRUE iff the constraint allows the use of a
181 memory operand. Similarly, *ALLOWS_REG will be TRUE iff the
182 constraint allows the use of a register operand. And, *IS_INOUT
183 will be true if the operand is read-write, i.e., if it is used as
184 an input as well as an output. If *CONSTRAINT_P is not in
185 canonical form, it will be made canonical. (Note that `+' will be
186 replaced with `=' as part of this process.)
188 Returns TRUE if all went well; FALSE if an error occurred. */
191 parse_output_constraint (const char **constraint_p
, int operand_num
,
192 int ninputs
, int noutputs
, bool *allows_mem
,
193 bool *allows_reg
, bool *is_inout
)
195 const char *constraint
= *constraint_p
;
198 /* Assume the constraint doesn't allow the use of either a register
203 /* Allow the `=' or `+' to not be at the beginning of the string,
204 since it wasn't explicitly documented that way, and there is a
205 large body of code that puts it last. Swap the character to
206 the front, so as not to uglify any place else. */
207 p
= strchr (constraint
, '=');
209 p
= strchr (constraint
, '+');
211 /* If the string doesn't contain an `=', issue an error
215 error ("output operand constraint lacks %<=%>");
219 /* If the constraint begins with `+', then the operand is both read
220 from and written to. */
221 *is_inout
= (*p
== '+');
223 /* Canonicalize the output constraint so that it begins with `='. */
224 if (p
!= constraint
|| *is_inout
)
227 size_t c_len
= strlen (constraint
);
230 warning (0, "output constraint %qc for operand %d "
231 "is not at the beginning",
234 /* Make a copy of the constraint. */
235 buf
= XALLOCAVEC (char, c_len
+ 1);
236 strcpy (buf
, constraint
);
237 /* Swap the first character and the `=' or `+'. */
238 buf
[p
- constraint
] = buf
[0];
239 /* Make sure the first character is an `='. (Until we do this,
240 it might be a `+'.) */
242 /* Replace the constraint with the canonicalized string. */
243 *constraint_p
= ggc_alloc_string (buf
, c_len
);
244 constraint
= *constraint_p
;
247 /* Loop through the constraint string. */
248 for (p
= constraint
+ 1; *p
; )
254 error ("operand constraint contains incorrectly positioned "
259 if (operand_num
+ 1 == ninputs
+ noutputs
)
261 error ("%<%%%> constraint used with last operand");
266 case '?': case '!': case '*': case '&': case '#':
268 case 'E': case 'F': case 'G': case 'H':
269 case 's': case 'i': case 'n':
270 case 'I': case 'J': case 'K': case 'L': case 'M':
271 case 'N': case 'O': case 'P': case ',':
274 case '0': case '1': case '2': case '3': case '4':
275 case '5': case '6': case '7': case '8': case '9':
277 error ("matching constraint not valid in output operand");
281 /* ??? Before flow, auto inc/dec insns are not supposed to exist,
282 excepting those that expand_call created. So match memory
295 enum constraint_num cn
= lookup_constraint (p
);
296 if (reg_class_for_constraint (cn
) != NO_REGS
297 || insn_extra_address_constraint (cn
))
299 else if (insn_extra_memory_constraint (cn
))
302 insn_extra_constraint_allows_reg_mem (cn
, allows_reg
, allows_mem
);
306 for (size_t len
= CONSTRAINT_LEN (*p
, p
); len
; len
--, p
++)
314 /* Similar, but for input constraints. */
317 parse_input_constraint (const char **constraint_p
, int input_num
,
318 int ninputs
, int noutputs
, int ninout
,
319 const char * const * constraints
,
320 bool *allows_mem
, bool *allows_reg
)
322 const char *constraint
= *constraint_p
;
323 const char *orig_constraint
= constraint
;
324 size_t c_len
= strlen (constraint
);
326 bool saw_match
= false;
328 /* Assume the constraint doesn't allow the use of either
329 a register or memory. */
333 /* Make sure constraint has neither `=', `+', nor '&'. */
335 for (j
= 0; j
< c_len
; j
+= CONSTRAINT_LEN (constraint
[j
], constraint
+j
))
336 switch (constraint
[j
])
338 case '+': case '=': case '&':
339 if (constraint
== orig_constraint
)
341 error ("input operand constraint contains %qc", constraint
[j
]);
347 if (constraint
== orig_constraint
348 && input_num
+ 1 == ninputs
- ninout
)
350 error ("%<%%%> constraint used with last operand");
356 case '?': case '!': case '*': case '#':
358 case 'E': case 'F': case 'G': case 'H':
359 case 's': case 'i': case 'n':
360 case 'I': case 'J': case 'K': case 'L': case 'M':
361 case 'N': case 'O': case 'P': case ',':
364 /* Whether or not a numeric constraint allows a register is
365 decided by the matching constraint, and so there is no need
366 to do anything special with them. We must handle them in
367 the default case, so that we don't unnecessarily force
368 operands to memory. */
369 case '0': case '1': case '2': case '3': case '4':
370 case '5': case '6': case '7': case '8': case '9':
377 match
= strtoul (constraint
+ j
, &end
, 10);
378 if (match
>= (unsigned long) noutputs
)
380 error ("matching constraint references invalid operand number");
384 /* Try and find the real constraint for this dup. Only do this
385 if the matching constraint is the only alternative. */
387 && (j
== 0 || (j
== 1 && constraint
[0] == '%')))
389 constraint
= constraints
[match
];
390 *constraint_p
= constraint
;
391 c_len
= strlen (constraint
);
393 /* ??? At the end of the loop, we will skip the first part of
394 the matched constraint. This assumes not only that the
395 other constraint is an output constraint, but also that
396 the '=' or '+' come first. */
400 j
= end
- constraint
;
401 /* Anticipate increment at end of loop. */
412 if (! ISALPHA (constraint
[j
]))
414 error ("invalid punctuation %qc in constraint", constraint
[j
]);
417 enum constraint_num cn
= lookup_constraint (constraint
+ j
);
418 if (reg_class_for_constraint (cn
) != NO_REGS
419 || insn_extra_address_constraint (cn
))
421 else if (insn_extra_memory_constraint (cn
)
422 || insn_extra_special_memory_constraint (cn
)
423 || insn_extra_relaxed_memory_constraint (cn
))
426 insn_extra_constraint_allows_reg_mem (cn
, allows_reg
, allows_mem
);
430 if (saw_match
&& !*allows_reg
)
431 warning (0, "matching constraint does not allow a register");
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. */
440 decl_overlaps_hard_reg_set_p (tree
*declp
, int *walk_subtrees ATTRIBUTE_UNUSED
,
444 const HARD_REG_SET
*const regs
= (const HARD_REG_SET
*) data
;
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
)))
459 else if (TYPE_P (decl
) || TREE_CODE (decl
) == PARM_DECL
)
464 /* If there is an overlap between *REGS and DECL, return the first overlap
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. */
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
));
489 for (j
= TREE_CHAIN (i
); j
; j
= TREE_CHAIN (j
))
490 if (simple_cst_equal (i_name
, TREE_PURPOSE (TREE_PURPOSE (j
))))
494 for (i
= inputs
; i
; i
= TREE_CHAIN (i
))
496 i_name
= TREE_PURPOSE (TREE_PURPOSE (i
));
500 for (j
= TREE_CHAIN (i
); j
; j
= TREE_CHAIN (j
))
501 if (simple_cst_equal (i_name
, TREE_PURPOSE (TREE_PURPOSE (j
))))
503 for (j
= outputs
; j
; j
= TREE_CHAIN (j
))
504 if (simple_cst_equal (i_name
, TREE_PURPOSE (TREE_PURPOSE (j
))))
508 for (i
= labels
; i
; i
= TREE_CHAIN (i
))
510 i_name
= TREE_PURPOSE (i
);
514 for (j
= TREE_CHAIN (i
); j
; j
= TREE_CHAIN (j
))
515 if (simple_cst_equal (i_name
, TREE_PURPOSE (j
)))
517 for (j
= inputs
; j
; j
= TREE_CHAIN (j
))
518 if (simple_cst_equal (i_name
, TREE_PURPOSE (TREE_PURPOSE (j
))))
525 error ("duplicate %<asm%> operand name %qs", TREE_STRING_POINTER (i_name
));
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. */
535 resolve_asm_operand_names (tree string
, tree outputs
, tree inputs
, tree labels
)
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
);
560 /* Now check for any needed substitutions in the template. */
561 c
= TREE_STRING_POINTER (string
);
562 while ((c
= strchr (c
, '%')) != NULL
)
566 else if (ISALPHA (c
[1]) && c
[2] == '[')
570 c
+= 1 + (c
[1] == '%');
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
)
588 else if (ISALPHA (p
[1]) && p
[2] == '[')
592 p
+= 1 + (p
[1] == '%');
596 p
= resolve_operand_name_1 (p
, outputs
, inputs
, labels
);
599 string
= build_string (strlen (buffer
), buffer
);
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. */
612 resolve_operand_name_1 (char *p
, tree outputs
, tree inputs
, tree labels
)
618 /* Collect the operand name. */
619 q
= strchr (++p
, ']');
622 error ("missing close brace for named operand");
623 return strchr (p
, '\0');
627 /* Resolve the name to a number. */
628 for (op_inout
= 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)
633 tree constraint
= TREE_VALUE (TREE_PURPOSE (t
));
634 if (constraint
&& strchr (TREE_STRING_POINTER (constraint
), '+') != NULL
)
637 for (t
= inputs
; t
; t
= TREE_CHAIN (t
), op
++)
639 tree name
= TREE_PURPOSE (TREE_PURPOSE (t
));
640 if (name
&& strcmp (TREE_STRING_POINTER (name
), p
) == 0)
644 for (t
= labels
; t
; t
= TREE_CHAIN (t
), op
++)
646 tree name
= TREE_PURPOSE (t
);
647 if (name
&& strcmp (TREE_STRING_POINTER (name
), p
) == 0)
651 error ("undefined named operand %qs", identifier_to_locale (p
));
655 /* Replace the name with the number. Unfortunately, not all libraries
656 get the return value of sprintf correct, so search for the end of the
657 generated string by hand. */
658 sprintf (--p
, "%d", op
);
659 p
= strchr (p
, '\0');
661 /* Verify the no extra buffer space assumption. */
664 /* Shift the rest of the buffer down to fill the gap. */
665 memmove (p
, q
+ 1, strlen (q
+ 1) + 1);
671 /* Generate RTL to return directly from the current function.
672 (That is, we bypass any return value.) */
675 expand_naked_return (void)
677 rtx_code_label
*end_label
;
679 clear_pending_stack_adjust ();
680 do_pending_stack_adjust ();
682 end_label
= naked_return_label
;
684 end_label
= naked_return_label
= gen_label_rtx ();
686 emit_jump (end_label
);
689 /* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. PROB
690 is the probability of jumping to LABEL. */
692 do_jump_if_equal (machine_mode mode
, rtx op0
, rtx op1
, rtx_code_label
*label
,
693 int unsignedp
, profile_probability prob
)
695 do_compare_rtx_and_jump (op0
, op1
, EQ
, unsignedp
, mode
,
696 NULL_RTX
, NULL
, label
, prob
);
699 /* Return the sum of probabilities of outgoing edges of basic block BB. */
701 static profile_probability
702 get_outgoing_edge_probs (basic_block bb
)
706 profile_probability prob_sum
= profile_probability::never ();
708 return profile_probability::never ();
709 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
710 prob_sum
+= e
->probability
;
714 /* Computes the conditional probability of jumping to a target if the branch
715 instruction is executed.
716 TARGET_PROB is the estimated probability of jumping to a target relative
717 to some basic block BB.
718 BASE_PROB is the probability of reaching the branch instruction relative
719 to the same basic block BB. */
721 static inline profile_probability
722 conditional_probability (profile_probability target_prob
,
723 profile_probability base_prob
)
725 return target_prob
/ base_prob
;
728 /* Generate a dispatch tabler, switching on INDEX_EXPR and jumping to
729 one of the labels in CASE_LIST or to the DEFAULT_LABEL.
730 MINVAL, MAXVAL, and RANGE are the extrema and range of the case
731 labels in CASE_LIST. STMT_BB is the basic block containing the statement.
733 First, a jump insn is emitted. First we try "casesi". If that
734 fails, try "tablejump". A target *must* have one of them (or both).
736 Then, a table with the target labels is emitted.
738 The process is unaware of the CFG. The caller has to fix up
739 the CFG itself. This is done in cfgexpand.cc. */
742 emit_case_dispatch_table (tree index_expr
, tree index_type
,
743 auto_vec
<simple_case_node
> &case_list
,
745 edge default_edge
, tree minval
, tree maxval
,
746 tree range
, basic_block stmt_bb
)
750 rtx_insn
*fallback_label
= label_rtx (case_list
[0].m_code_label
);
751 rtx_code_label
*table_label
= gen_label_rtx ();
752 bool has_gaps
= false;
753 profile_probability default_prob
= default_edge
? default_edge
->probability
754 : profile_probability::never ();
755 profile_probability base
= get_outgoing_edge_probs (stmt_bb
);
756 bool try_with_tablejump
= false;
758 profile_probability new_default_prob
= conditional_probability (default_prob
,
761 if (! try_casesi (index_type
, index_expr
, minval
, range
,
762 table_label
, default_label
, fallback_label
,
765 /* Index jumptables from zero for suitable values of minval to avoid
766 a subtraction. For the rationale see:
767 "http://gcc.gnu.org/ml/gcc-patches/2001-10/msg01234.html". */
768 if (optimize_insn_for_speed_p ()
769 && compare_tree_int (minval
, 0) > 0
770 && compare_tree_int (minval
, 3) < 0)
772 minval
= build_int_cst (index_type
, 0);
776 try_with_tablejump
= true;
779 /* Get table of labels to jump to, in order of case index. */
781 ncases
= tree_to_shwi (range
) + 1;
782 labelvec
= XALLOCAVEC (rtx
, ncases
);
783 memset (labelvec
, 0, ncases
* sizeof (rtx
));
785 for (unsigned j
= 0; j
< case_list
.length (); j
++)
787 simple_case_node
*n
= &case_list
[j
];
788 /* Compute the low and high bounds relative to the minimum
789 value since that should fit in a HOST_WIDE_INT while the
790 actual values may not. */
792 = tree_to_uhwi (fold_build2 (MINUS_EXPR
, index_type
,
795 = tree_to_uhwi (fold_build2 (MINUS_EXPR
, index_type
,
799 for (i
= i_low
; i
<= i_high
; i
++)
801 = gen_rtx_LABEL_REF (Pmode
, label_rtx (n
->m_code_label
));
804 /* The dispatch table may contain gaps, including at the beginning of
805 the table if we tried to avoid the minval subtraction. We fill the
806 dispatch table slots associated with the gaps with the default case label.
807 However, in the event the default case is unreachable, we then use
808 any label from one of the case statements. */
809 rtx gap_label
= (default_label
) ? default_label
: fallback_label
;
811 for (i
= 0; i
< ncases
; i
++)
812 if (labelvec
[i
] == 0)
815 labelvec
[i
] = gen_rtx_LABEL_REF (Pmode
, gap_label
);
818 if (has_gaps
&& default_label
)
820 /* There is at least one entry in the jump table that jumps
821 to default label. The default label can either be reached
822 through the indirect jump or the direct conditional jump
823 before that. Split the probability of reaching the
824 default label among these two jumps. */
826 = conditional_probability (default_prob
.apply_scale (1, 2), base
);
827 default_prob
= default_prob
.apply_scale (1, 2);
828 base
-= default_prob
;
832 base
-= default_prob
;
833 default_prob
= profile_probability::never ();
837 default_edge
->probability
= default_prob
;
839 /* We have altered the probability of the default edge. So the probabilities
840 of all other edges need to be adjusted so that it sums up to
842 if (base
> profile_probability::never ())
846 FOR_EACH_EDGE (e
, ei
, stmt_bb
->succs
)
847 e
->probability
/= base
;
850 if (try_with_tablejump
)
852 bool ok
= try_tablejump (index_type
, index_expr
, minval
, range
,
853 table_label
, default_label
, new_default_prob
);
856 /* Output the table. */
857 emit_label (table_label
);
859 if (CASE_VECTOR_PC_RELATIVE
860 || (flag_pic
&& targetm
.asm_out
.generate_pic_addr_diff_vec ()))
861 emit_jump_table_data (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE
,
862 gen_rtx_LABEL_REF (Pmode
,
864 gen_rtvec_v (ncases
, labelvec
),
865 const0_rtx
, const0_rtx
));
867 emit_jump_table_data (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE
,
868 gen_rtvec_v (ncases
, labelvec
)));
870 /* Record no drop-through after the table. */
874 /* Terminate a case Ada or switch (C) statement
875 in which ORIG_INDEX is the expression to be tested.
876 If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
877 type as given in the source before any compiler conversions.
878 Generate the code to test it and jump to the right place. */
881 expand_case (gswitch
*stmt
)
883 tree minval
= NULL_TREE
, maxval
= NULL_TREE
, range
= NULL_TREE
;
884 rtx_code_label
*default_label
;
887 int ncases
= gimple_switch_num_labels (stmt
);
888 tree index_expr
= gimple_switch_index (stmt
);
889 tree index_type
= TREE_TYPE (index_expr
);
891 basic_block bb
= gimple_bb (stmt
);
894 auto_vec
<simple_case_node
> case_list
;
896 /* An ERROR_MARK occurs for various reasons including invalid data type.
897 ??? Can this still happen, with GIMPLE and all? */
898 if (index_type
== error_mark_node
)
901 /* cleanup_tree_cfg removes all SWITCH_EXPR with their index
902 expressions being INTEGER_CST. */
903 gcc_assert (TREE_CODE (index_expr
) != INTEGER_CST
);
905 /* Optimization of switch statements with only one label has already
906 occurred, so we should never see them at this point. */
907 gcc_assert (ncases
> 1);
909 do_pending_stack_adjust ();
911 /* Find the default case target label. */
912 tree default_lab
= CASE_LABEL (gimple_switch_default_label (stmt
));
913 default_label
= jump_target_rtx (default_lab
);
914 basic_block default_bb
= label_to_block (cfun
, default_lab
);
915 edge default_edge
= find_edge (bb
, default_bb
);
917 /* Get upper and lower bounds of case values. */
918 elt
= gimple_switch_label (stmt
, 1);
919 minval
= fold_convert (index_type
, CASE_LOW (elt
));
920 elt
= gimple_switch_label (stmt
, ncases
- 1);
922 maxval
= fold_convert (index_type
, CASE_HIGH (elt
));
924 maxval
= fold_convert (index_type
, CASE_LOW (elt
));
926 /* Try to narrow the index type if it's larger than a word.
927 That is mainly for -O0 where an equivalent optimization
928 done by forward propagation is not run and is aimed at
929 avoiding a call to a comparison routine of libgcc. */
930 if (TYPE_PRECISION (index_type
) > BITS_PER_WORD
931 && TREE_CODE (index_expr
) == SSA_NAME
932 && (def_stmt
= SSA_NAME_DEF_STMT (index_expr
))
933 && is_gimple_assign (def_stmt
)
934 && gimple_assign_rhs_code (def_stmt
) == NOP_EXPR
)
936 tree inner_index_expr
= gimple_assign_rhs1 (def_stmt
);
937 tree inner_index_type
= TREE_TYPE (inner_index_expr
);
939 if (INTEGRAL_TYPE_P (inner_index_type
)
940 && TYPE_PRECISION (inner_index_type
) <= BITS_PER_WORD
941 && int_fits_type_p (minval
, inner_index_type
)
942 && int_fits_type_p (maxval
, inner_index_type
))
944 index_expr
= inner_index_expr
;
945 index_type
= inner_index_type
;
946 minval
= fold_convert (index_type
, minval
);
947 maxval
= fold_convert (index_type
, maxval
);
951 /* Compute span of values. */
952 range
= fold_build2 (MINUS_EXPR
, index_type
, maxval
, minval
);
954 /* Listify the labels queue and gather some numbers to decide
955 how to expand this switch(). */
958 for (i
= ncases
- 1; i
>= 1; --i
)
960 elt
= gimple_switch_label (stmt
, i
);
961 tree low
= CASE_LOW (elt
);
963 tree high
= CASE_HIGH (elt
);
964 gcc_assert (! high
|| tree_int_cst_lt (low
, high
));
965 tree lab
= CASE_LABEL (elt
);
967 /* Count the elements.
968 A range counts double, since it requires two compares. */
973 /* The bounds on the case range, LOW and HIGH, have to be converted
974 to case's index type TYPE. Note that the original type of the
975 case index in the source code is usually "lost" during
976 gimplification due to type promotion, but the case labels retain the
977 original type. Make sure to drop overflow flags. */
978 low
= fold_convert (index_type
, low
);
979 if (TREE_OVERFLOW (low
))
980 low
= wide_int_to_tree (index_type
, wi::to_wide (low
));
982 /* The canonical from of a case label in GIMPLE is that a simple case
983 has an empty CASE_HIGH. For the casesi and tablejump expanders,
984 the back ends want simple cases to have high == low. */
987 high
= fold_convert (index_type
, high
);
988 if (TREE_OVERFLOW (high
))
989 high
= wide_int_to_tree (index_type
, wi::to_wide (high
));
991 case_list
.safe_push (simple_case_node (low
, high
, lab
));
994 /* cleanup_tree_cfg removes all SWITCH_EXPR with a single
995 destination, such as one with a default case only.
996 It also removes cases that are out of range for the switch
997 type, so we should never get a zero here. */
998 gcc_assert (count
> 0);
1000 rtx_insn
*before_case
= get_last_insn ();
1002 /* If the default case is unreachable, then set default_label to NULL
1003 so that we omit the range check when generating the dispatch table.
1004 We also remove the edge to the unreachable default case. The block
1005 itself will be automatically removed later. */
1006 if (EDGE_COUNT (default_edge
->dest
->succs
) == 0
1007 && gimple_seq_unreachable_p (bb_seq (default_edge
->dest
)))
1009 default_label
= NULL
;
1010 remove_edge (default_edge
);
1011 default_edge
= NULL
;
1014 emit_case_dispatch_table (index_expr
, index_type
,
1015 case_list
, default_label
, default_edge
,
1016 minval
, maxval
, range
, bb
);
1018 reorder_insns (NEXT_INSN (before_case
), get_last_insn (), before_case
);
1023 /* Expand the dispatch to a short decrement chain if there are few cases
1024 to dispatch to. Likewise if neither casesi nor tablejump is available,
1025 or if flag_jump_tables is set. Otherwise, expand as a casesi or a
1026 tablejump. The index mode is always the mode of integer_type_node.
1027 Trap if no case matches the index.
1029 DISPATCH_INDEX is the index expression to switch on. It should be a
1030 memory or register operand.
1032 DISPATCH_TABLE is a set of case labels. The set should be sorted in
1033 ascending order, be contiguous, starting with value 0, and contain only
1034 single-valued case labels. */
1037 expand_sjlj_dispatch_table (rtx dispatch_index
,
1038 vec
<tree
> dispatch_table
)
1040 tree index_type
= integer_type_node
;
1041 machine_mode index_mode
= TYPE_MODE (index_type
);
1043 int ncases
= dispatch_table
.length ();
1045 do_pending_stack_adjust ();
1046 rtx_insn
*before_case
= get_last_insn ();
1048 /* Expand as a decrement-chain if there are 5 or fewer dispatch
1049 labels. This covers more than 98% of the cases in libjava,
1050 and seems to be a reasonable compromise between the "old way"
1051 of expanding as a decision tree or dispatch table vs. the "new
1052 way" with decrement chain or dispatch table. */
1053 if (dispatch_table
.length () <= 5
1054 || (!targetm
.have_casesi () && !targetm
.have_tablejump ())
1055 || !flag_jump_tables
)
1057 /* Expand the dispatch as a decrement chain:
1059 "switch(index) {case 0: do_0; case 1: do_1; ...; case N: do_N;}"
1063 if (index == 0) do_0; else index--;
1064 if (index == 0) do_1; else index--;
1066 if (index == 0) do_N; else index--;
1068 This is more efficient than a dispatch table on most machines.
1069 The last "index--" is redundant but the code is trivially dead
1070 and will be cleaned up by later passes. */
1071 rtx index
= copy_to_mode_reg (index_mode
, dispatch_index
);
1072 rtx zero
= CONST0_RTX (index_mode
);
1073 for (int i
= 0; i
< ncases
; i
++)
1075 tree elt
= dispatch_table
[i
];
1076 rtx_code_label
*lab
= jump_target_rtx (CASE_LABEL (elt
));
1077 do_jump_if_equal (index_mode
, index
, zero
, lab
, 0,
1078 profile_probability::uninitialized ());
1079 force_expand_binop (index_mode
, sub_optab
,
1080 index
, CONST1_RTX (index_mode
),
1081 index
, 0, OPTAB_DIRECT
);
1086 /* Similar to expand_case, but much simpler. */
1087 auto_vec
<simple_case_node
> case_list
;
1088 tree index_expr
= make_tree (index_type
, dispatch_index
);
1089 tree minval
= build_int_cst (index_type
, 0);
1090 tree maxval
= CASE_LOW (dispatch_table
.last ());
1091 tree range
= maxval
;
1092 rtx_code_label
*default_label
= gen_label_rtx ();
1094 for (int i
= ncases
- 1; i
>= 0; --i
)
1096 tree elt
= dispatch_table
[i
];
1097 tree high
= CASE_HIGH (elt
);
1098 if (high
== NULL_TREE
)
1099 high
= CASE_LOW (elt
);
1100 case_list
.safe_push (simple_case_node (CASE_LOW (elt
), high
,
1104 emit_case_dispatch_table (index_expr
, index_type
,
1105 case_list
, default_label
, NULL
,
1106 minval
, maxval
, range
,
1107 BLOCK_FOR_INSN (before_case
));
1108 emit_label (default_label
);
1111 /* Dispatching something not handled? Trap! */
1112 expand_builtin_trap ();
1114 reorder_insns (NEXT_INSN (before_case
), get_last_insn (), before_case
);