2017-10-16 Tamar Christina <tamar.christina@arm.com>
[official-gcc.git] / gcc / tree-switch-conversion.c
blobdc9fc84c6a01bca5a379117aa2e0a4425faf7678
1 /* Lower GIMPLE_SWITCH expressions to something more efficient than
2 a jump table.
3 Copyright (C) 2006-2017 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3, or (at your option) any
10 later version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
22 /* This file handles the lowering of GIMPLE_SWITCH to an indexed
23 load, or a series of bit-test-and-branch expressions. */
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "backend.h"
29 #include "insn-codes.h"
30 #include "rtl.h"
31 #include "tree.h"
32 #include "gimple.h"
33 #include "cfghooks.h"
34 #include "tree-pass.h"
35 #include "ssa.h"
36 #include "optabs-tree.h"
37 #include "cgraph.h"
38 #include "gimple-pretty-print.h"
39 #include "params.h"
40 #include "fold-const.h"
41 #include "varasm.h"
42 #include "stor-layout.h"
43 #include "cfganal.h"
44 #include "gimplify.h"
45 #include "gimple-iterator.h"
46 #include "gimplify-me.h"
47 #include "tree-cfg.h"
48 #include "cfgloop.h"
49 #include "alloc-pool.h"
50 #include "target.h"
51 #include "tree-into-ssa.h"
53 /* ??? For lang_hooks.types.type_for_mode, but is there a word_mode
54 type in the GIMPLE type system that is language-independent? */
55 #include "langhooks.h"
58 /* Maximum number of case bit tests.
59 FIXME: This should be derived from PARAM_CASE_VALUES_THRESHOLD and
60 targetm.case_values_threshold(), or be its own param. */
61 #define MAX_CASE_BIT_TESTS 3
63 /* Split the basic block at the statement pointed to by GSIP, and insert
64 a branch to the target basic block of E_TRUE conditional on tree
65 expression COND.
67 It is assumed that there is already an edge from the to-be-split
68 basic block to E_TRUE->dest block. This edge is removed, and the
69 profile information on the edge is re-used for the new conditional
70 jump.
72 The CFG is updated. The dominator tree will not be valid after
73 this transformation, but the immediate dominators are updated if
74 UPDATE_DOMINATORS is true.
76 Returns the newly created basic block. */
78 static basic_block
79 hoist_edge_and_branch_if_true (gimple_stmt_iterator *gsip,
80 tree cond, edge e_true,
81 bool update_dominators)
83 tree tmp;
84 gcond *cond_stmt;
85 edge e_false;
86 basic_block new_bb, split_bb = gsi_bb (*gsip);
87 bool dominated_e_true = false;
89 gcc_assert (e_true->src == split_bb);
91 if (update_dominators
92 && get_immediate_dominator (CDI_DOMINATORS, e_true->dest) == split_bb)
93 dominated_e_true = true;
95 tmp = force_gimple_operand_gsi (gsip, cond, /*simple=*/true, NULL,
96 /*before=*/true, GSI_SAME_STMT);
97 cond_stmt = gimple_build_cond_from_tree (tmp, NULL_TREE, NULL_TREE);
98 gsi_insert_before (gsip, cond_stmt, GSI_SAME_STMT);
100 e_false = split_block (split_bb, cond_stmt);
101 new_bb = e_false->dest;
102 redirect_edge_pred (e_true, split_bb);
104 e_true->flags &= ~EDGE_FALLTHRU;
105 e_true->flags |= EDGE_TRUE_VALUE;
107 e_false->flags &= ~EDGE_FALLTHRU;
108 e_false->flags |= EDGE_FALSE_VALUE;
109 e_false->probability = e_true->probability.invert ();
110 e_false->count = split_bb->count - e_true->count;
111 new_bb->count = e_false->count;
113 if (update_dominators)
115 if (dominated_e_true)
116 set_immediate_dominator (CDI_DOMINATORS, e_true->dest, split_bb);
117 set_immediate_dominator (CDI_DOMINATORS, e_false->dest, split_bb);
120 return new_bb;
124 /* Return true if a switch should be expanded as a bit test.
125 RANGE is the difference between highest and lowest case.
126 UNIQ is number of unique case node targets, not counting the default case.
127 COUNT is the number of comparisons needed, not counting the default case. */
129 static bool
130 expand_switch_using_bit_tests_p (tree range,
131 unsigned int uniq,
132 unsigned int count, bool speed_p)
134 return (((uniq == 1 && count >= 3)
135 || (uniq == 2 && count >= 5)
136 || (uniq == 3 && count >= 6))
137 && lshift_cheap_p (speed_p)
138 && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0
139 && compare_tree_int (range, 0) > 0);
142 /* Implement switch statements with bit tests
144 A GIMPLE switch statement can be expanded to a short sequence of bit-wise
145 comparisons. "switch(x)" is converted into "if ((1 << (x-MINVAL)) & CST)"
146 where CST and MINVAL are integer constants. This is better than a series
147 of compare-and-banch insns in some cases, e.g. we can implement:
149 if ((x==4) || (x==6) || (x==9) || (x==11))
151 as a single bit test:
153 if ((1<<x) & ((1<<4)|(1<<6)|(1<<9)|(1<<11)))
155 This transformation is only applied if the number of case targets is small,
156 if CST constains at least 3 bits, and "1 << x" is cheap. The bit tests are
157 performed in "word_mode".
159 The following example shows the code the transformation generates:
161 int bar(int x)
163 switch (x)
165 case '0': case '1': case '2': case '3': case '4':
166 case '5': case '6': case '7': case '8': case '9':
167 case 'A': case 'B': case 'C': case 'D': case 'E':
168 case 'F':
169 return 1;
171 return 0;
176 bar (int x)
178 tmp1 = x - 48;
179 if (tmp1 > (70 - 48)) goto L2;
180 tmp2 = 1 << tmp1;
181 tmp3 = 0b11111100000001111111111;
182 if ((tmp2 & tmp3) != 0) goto L1 ; else goto L2;
184 return 1;
186 return 0;
189 TODO: There are still some improvements to this transformation that could
190 be implemented:
192 * A narrower mode than word_mode could be used if that is cheaper, e.g.
193 for x86_64 where a narrower-mode shift may result in smaller code.
195 * The compounded constant could be shifted rather than the one. The
196 test would be either on the sign bit or on the least significant bit,
197 depending on the direction of the shift. On some machines, the test
198 for the branch would be free if the bit to test is already set by the
199 shift operation.
201 This transformation was contributed by Roger Sayle, see this e-mail:
202 http://gcc.gnu.org/ml/gcc-patches/2003-01/msg01950.html
205 /* A case_bit_test represents a set of case nodes that may be
206 selected from using a bit-wise comparison. HI and LO hold
207 the integer to be tested against, TARGET_EDGE contains the
208 edge to the basic block to jump to upon success and BITS
209 counts the number of case nodes handled by this test,
210 typically the number of bits set in HI:LO. The LABEL field
211 is used to quickly identify all cases in this set without
212 looking at label_to_block for every case label. */
214 struct case_bit_test
216 wide_int mask;
217 edge target_edge;
218 tree label;
219 int bits;
222 /* Comparison function for qsort to order bit tests by decreasing
223 probability of execution. Our best guess comes from a measured
224 profile. If the profile counts are equal, break even on the
225 number of case nodes, i.e. the node with the most cases gets
226 tested first.
228 TODO: Actually this currently runs before a profile is available.
229 Therefore the case-as-bit-tests transformation should be done
230 later in the pass pipeline, or something along the lines of
231 "Efficient and effective branch reordering using profile data"
232 (Yang et. al., 2002) should be implemented (although, how good
233 is a paper is called "Efficient and effective ..." when the
234 latter is implied by the former, but oh well...). */
236 static int
237 case_bit_test_cmp (const void *p1, const void *p2)
239 const struct case_bit_test *const d1 = (const struct case_bit_test *) p1;
240 const struct case_bit_test *const d2 = (const struct case_bit_test *) p2;
242 if (d2->target_edge->count < d1->target_edge->count)
243 return -1;
244 if (d2->target_edge->count > d1->target_edge->count)
245 return 1;
246 if (d2->bits != d1->bits)
247 return d2->bits - d1->bits;
249 /* Stabilize the sort. */
250 return LABEL_DECL_UID (d2->label) - LABEL_DECL_UID (d1->label);
253 /* Expand a switch statement by a short sequence of bit-wise
254 comparisons. "switch(x)" is effectively converted into
255 "if ((1 << (x-MINVAL)) & CST)" where CST and MINVAL are
256 integer constants.
258 INDEX_EXPR is the value being switched on.
260 MINVAL is the lowest case value of in the case nodes,
261 and RANGE is highest value minus MINVAL. MINVAL and RANGE
262 are not guaranteed to be of the same type as INDEX_EXPR
263 (the gimplifier doesn't change the type of case label values,
264 and MINVAL and RANGE are derived from those values).
265 MAXVAL is MINVAL + RANGE.
267 There *MUST* be MAX_CASE_BIT_TESTS or less unique case
268 node targets. */
270 static void
271 emit_case_bit_tests (gswitch *swtch, tree index_expr,
272 tree minval, tree range, tree maxval)
274 struct case_bit_test test[MAX_CASE_BIT_TESTS] = { {} };
275 unsigned int i, j, k;
276 unsigned int count;
278 basic_block switch_bb = gimple_bb (swtch);
279 basic_block default_bb, new_default_bb, new_bb;
280 edge default_edge;
281 bool update_dom = dom_info_available_p (CDI_DOMINATORS);
283 vec<basic_block> bbs_to_fix_dom = vNULL;
285 tree index_type = TREE_TYPE (index_expr);
286 tree unsigned_index_type = unsigned_type_for (index_type);
287 unsigned int branch_num = gimple_switch_num_labels (swtch);
289 gimple_stmt_iterator gsi;
290 gassign *shift_stmt;
292 tree idx, tmp, csui;
293 tree word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
294 tree word_mode_zero = fold_convert (word_type_node, integer_zero_node);
295 tree word_mode_one = fold_convert (word_type_node, integer_one_node);
296 int prec = TYPE_PRECISION (word_type_node);
297 wide_int wone = wi::one (prec);
299 /* Get the edge for the default case. */
300 tmp = gimple_switch_default_label (swtch);
301 default_bb = label_to_block (CASE_LABEL (tmp));
302 default_edge = find_edge (switch_bb, default_bb);
304 /* Go through all case labels, and collect the case labels, profile
305 counts, and other information we need to build the branch tests. */
306 count = 0;
307 for (i = 1; i < branch_num; i++)
309 unsigned int lo, hi;
310 tree cs = gimple_switch_label (swtch, i);
311 tree label = CASE_LABEL (cs);
312 edge e = find_edge (switch_bb, label_to_block (label));
313 for (k = 0; k < count; k++)
314 if (e == test[k].target_edge)
315 break;
317 if (k == count)
319 gcc_checking_assert (count < MAX_CASE_BIT_TESTS);
320 test[k].mask = wi::zero (prec);
321 test[k].target_edge = e;
322 test[k].label = label;
323 test[k].bits = 1;
324 count++;
326 else
327 test[k].bits++;
329 lo = tree_to_uhwi (int_const_binop (MINUS_EXPR,
330 CASE_LOW (cs), minval));
331 if (CASE_HIGH (cs) == NULL_TREE)
332 hi = lo;
333 else
334 hi = tree_to_uhwi (int_const_binop (MINUS_EXPR,
335 CASE_HIGH (cs), minval));
337 for (j = lo; j <= hi; j++)
338 test[k].mask |= wi::lshift (wone, j);
341 qsort (test, count, sizeof (*test), case_bit_test_cmp);
343 /* If all values are in the 0 .. BITS_PER_WORD-1 range, we can get rid of
344 the minval subtractions, but it might make the mask constants more
345 expensive. So, compare the costs. */
346 if (compare_tree_int (minval, 0) > 0
347 && compare_tree_int (maxval, GET_MODE_BITSIZE (word_mode)) < 0)
349 int cost_diff;
350 HOST_WIDE_INT m = tree_to_uhwi (minval);
351 rtx reg = gen_raw_REG (word_mode, 10000);
352 bool speed_p = optimize_bb_for_speed_p (gimple_bb (swtch));
353 cost_diff = set_rtx_cost (gen_rtx_PLUS (word_mode, reg,
354 GEN_INT (-m)), speed_p);
355 for (i = 0; i < count; i++)
357 rtx r = immed_wide_int_const (test[i].mask, word_mode);
358 cost_diff += set_src_cost (gen_rtx_AND (word_mode, reg, r),
359 word_mode, speed_p);
360 r = immed_wide_int_const (wi::lshift (test[i].mask, m), word_mode);
361 cost_diff -= set_src_cost (gen_rtx_AND (word_mode, reg, r),
362 word_mode, speed_p);
364 if (cost_diff > 0)
366 for (i = 0; i < count; i++)
367 test[i].mask = wi::lshift (test[i].mask, m);
368 minval = build_zero_cst (TREE_TYPE (minval));
369 range = maxval;
373 /* We generate two jumps to the default case label.
374 Split the default edge, so that we don't have to do any PHI node
375 updating. */
376 new_default_bb = split_edge (default_edge);
378 if (update_dom)
380 bbs_to_fix_dom.create (10);
381 bbs_to_fix_dom.quick_push (switch_bb);
382 bbs_to_fix_dom.quick_push (default_bb);
383 bbs_to_fix_dom.quick_push (new_default_bb);
386 /* Now build the test-and-branch code. */
388 gsi = gsi_last_bb (switch_bb);
390 /* idx = (unsigned)x - minval. */
391 idx = fold_convert (unsigned_index_type, index_expr);
392 idx = fold_build2 (MINUS_EXPR, unsigned_index_type, idx,
393 fold_convert (unsigned_index_type, minval));
394 idx = force_gimple_operand_gsi (&gsi, idx,
395 /*simple=*/true, NULL_TREE,
396 /*before=*/true, GSI_SAME_STMT);
398 /* if (idx > range) goto default */
399 range = force_gimple_operand_gsi (&gsi,
400 fold_convert (unsigned_index_type, range),
401 /*simple=*/true, NULL_TREE,
402 /*before=*/true, GSI_SAME_STMT);
403 tmp = fold_build2 (GT_EXPR, boolean_type_node, idx, range);
404 new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, default_edge, update_dom);
405 if (update_dom)
406 bbs_to_fix_dom.quick_push (new_bb);
407 gcc_assert (gimple_bb (swtch) == new_bb);
408 gsi = gsi_last_bb (new_bb);
410 /* Any blocks dominated by the GIMPLE_SWITCH, but that are not successors
411 of NEW_BB, are still immediately dominated by SWITCH_BB. Make it so. */
412 if (update_dom)
414 vec<basic_block> dom_bbs;
415 basic_block dom_son;
417 dom_bbs = get_dominated_by (CDI_DOMINATORS, new_bb);
418 FOR_EACH_VEC_ELT (dom_bbs, i, dom_son)
420 edge e = find_edge (new_bb, dom_son);
421 if (e && single_pred_p (e->dest))
422 continue;
423 set_immediate_dominator (CDI_DOMINATORS, dom_son, switch_bb);
424 bbs_to_fix_dom.safe_push (dom_son);
426 dom_bbs.release ();
429 /* csui = (1 << (word_mode) idx) */
430 csui = make_ssa_name (word_type_node);
431 tmp = fold_build2 (LSHIFT_EXPR, word_type_node, word_mode_one,
432 fold_convert (word_type_node, idx));
433 tmp = force_gimple_operand_gsi (&gsi, tmp,
434 /*simple=*/false, NULL_TREE,
435 /*before=*/true, GSI_SAME_STMT);
436 shift_stmt = gimple_build_assign (csui, tmp);
437 gsi_insert_before (&gsi, shift_stmt, GSI_SAME_STMT);
438 update_stmt (shift_stmt);
440 /* for each unique set of cases:
441 if (const & csui) goto target */
442 for (k = 0; k < count; k++)
444 tmp = wide_int_to_tree (word_type_node, test[k].mask);
445 tmp = fold_build2 (BIT_AND_EXPR, word_type_node, csui, tmp);
446 tmp = force_gimple_operand_gsi (&gsi, tmp,
447 /*simple=*/true, NULL_TREE,
448 /*before=*/true, GSI_SAME_STMT);
449 tmp = fold_build2 (NE_EXPR, boolean_type_node, tmp, word_mode_zero);
450 new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, test[k].target_edge,
451 update_dom);
452 if (update_dom)
453 bbs_to_fix_dom.safe_push (new_bb);
454 gcc_assert (gimple_bb (swtch) == new_bb);
455 gsi = gsi_last_bb (new_bb);
458 /* We should have removed all edges now. */
459 gcc_assert (EDGE_COUNT (gsi_bb (gsi)->succs) == 0);
461 /* If nothing matched, go to the default label. */
462 make_edge (gsi_bb (gsi), new_default_bb, EDGE_FALLTHRU);
464 /* The GIMPLE_SWITCH is now redundant. */
465 gsi_remove (&gsi, true);
467 if (update_dom)
469 /* Fix up the dominator tree. */
470 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
471 bbs_to_fix_dom.release ();
476 Switch initialization conversion
478 The following pass changes simple initializations of scalars in a switch
479 statement into initializations from a static array. Obviously, the values
480 must be constant and known at compile time and a default branch must be
481 provided. For example, the following code:
483 int a,b;
485 switch (argc)
487 case 1:
488 case 2:
489 a_1 = 8;
490 b_1 = 6;
491 break;
492 case 3:
493 a_2 = 9;
494 b_2 = 5;
495 break;
496 case 12:
497 a_3 = 10;
498 b_3 = 4;
499 break;
500 default:
501 a_4 = 16;
502 b_4 = 1;
503 break;
505 a_5 = PHI <a_1, a_2, a_3, a_4>
506 b_5 = PHI <b_1, b_2, b_3, b_4>
509 is changed into:
511 static const int = CSWTCH01[] = {6, 6, 5, 1, 1, 1, 1, 1, 1, 1, 1, 4};
512 static const int = CSWTCH02[] = {8, 8, 9, 16, 16, 16, 16, 16, 16, 16,
513 16, 16, 10};
515 if (((unsigned) argc) - 1 < 11)
517 a_6 = CSWTCH02[argc - 1];
518 b_6 = CSWTCH01[argc - 1];
520 else
522 a_7 = 16;
523 b_7 = 1;
525 a_5 = PHI <a_6, a_7>
526 b_b = PHI <b_6, b_7>
528 There are further constraints. Specifically, the range of values across all
529 case labels must not be bigger than SWITCH_CONVERSION_BRANCH_RATIO (default
530 eight) times the number of the actual switch branches.
532 This transformation was contributed by Martin Jambor, see this e-mail:
533 http://gcc.gnu.org/ml/gcc-patches/2008-07/msg00011.html */
535 /* The main structure of the pass. */
536 struct switch_conv_info
538 /* The expression used to decide the switch branch. */
539 tree index_expr;
541 /* The following integer constants store the minimum and maximum value
542 covered by the case labels. */
543 tree range_min;
544 tree range_max;
546 /* The difference between the above two numbers. Stored here because it
547 is used in all the conversion heuristics, as well as for some of the
548 transformation, and it is expensive to re-compute it all the time. */
549 tree range_size;
551 /* Basic block that contains the actual GIMPLE_SWITCH. */
552 basic_block switch_bb;
554 /* Basic block that is the target of the default case. */
555 basic_block default_bb;
557 /* The single successor block of all branches out of the GIMPLE_SWITCH,
558 if such a block exists. Otherwise NULL. */
559 basic_block final_bb;
561 /* The probability of the default edge in the replaced switch. */
562 profile_probability default_prob;
564 /* The count of the default edge in the replaced switch. */
565 profile_count default_count;
567 /* Combined count of all other (non-default) edges in the replaced switch. */
568 profile_count other_count;
570 /* Number of phi nodes in the final bb (that we'll be replacing). */
571 int phi_count;
573 /* Array of default values, in the same order as phi nodes. */
574 tree *default_values;
576 /* Constructors of new static arrays. */
577 vec<constructor_elt, va_gc> **constructors;
579 /* Array of ssa names that are initialized with a value from a new static
580 array. */
581 tree *target_inbound_names;
583 /* Array of ssa names that are initialized with the default value if the
584 switch expression is out of range. */
585 tree *target_outbound_names;
587 /* VOP SSA_NAME. */
588 tree target_vop;
590 /* The first load statement that loads a temporary from a new static array.
592 gimple *arr_ref_first;
594 /* The last load statement that loads a temporary from a new static array. */
595 gimple *arr_ref_last;
597 /* String reason why the case wasn't a good candidate that is written to the
598 dump file, if there is one. */
599 const char *reason;
601 /* True if default case is not used for any value between range_min and
602 range_max inclusive. */
603 bool contiguous_range;
605 /* True if default case does not have the required shape for other case
606 labels. */
607 bool default_case_nonstandard;
609 /* Parameters for expand_switch_using_bit_tests. Should be computed
610 the same way as in expand_case. */
611 unsigned int uniq;
612 unsigned int count;
615 /* Collect information about GIMPLE_SWITCH statement SWTCH into INFO. */
617 static void
618 collect_switch_conv_info (gswitch *swtch, struct switch_conv_info *info)
620 unsigned int branch_num = gimple_switch_num_labels (swtch);
621 tree min_case, max_case;
622 unsigned int count, i;
623 edge e, e_default, e_first;
624 edge_iterator ei;
625 basic_block first;
627 memset (info, 0, sizeof (*info));
629 /* The gimplifier has already sorted the cases by CASE_LOW and ensured there
630 is a default label which is the first in the vector.
631 Collect the bits we can deduce from the CFG. */
632 info->index_expr = gimple_switch_index (swtch);
633 info->switch_bb = gimple_bb (swtch);
634 info->default_bb
635 = label_to_block (CASE_LABEL (gimple_switch_default_label (swtch)));
636 e_default = find_edge (info->switch_bb, info->default_bb);
637 info->default_prob = e_default->probability;
638 info->default_count = e_default->count;
639 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
640 if (e != e_default)
641 info->other_count += e->count;
643 /* Get upper and lower bounds of case values, and the covered range. */
644 min_case = gimple_switch_label (swtch, 1);
645 max_case = gimple_switch_label (swtch, branch_num - 1);
647 info->range_min = CASE_LOW (min_case);
648 if (CASE_HIGH (max_case) != NULL_TREE)
649 info->range_max = CASE_HIGH (max_case);
650 else
651 info->range_max = CASE_LOW (max_case);
653 info->contiguous_range = true;
654 tree last = CASE_HIGH (min_case) ? CASE_HIGH (min_case) : info->range_min;
655 for (i = 2; i < branch_num; i++)
657 tree elt = gimple_switch_label (swtch, i);
658 if (wi::to_wide (last) + 1 != wi::to_wide (CASE_LOW (elt)))
660 info->contiguous_range = false;
661 break;
663 last = CASE_HIGH (elt) ? CASE_HIGH (elt) : CASE_LOW (elt);
666 if (info->contiguous_range)
668 first = label_to_block (CASE_LABEL (gimple_switch_label (swtch, 1)));
669 e_first = find_edge (info->switch_bb, first);
671 else
673 first = info->default_bb;
674 e_first = e_default;
677 /* See if there is one common successor block for all branch
678 targets. If it exists, record it in FINAL_BB.
679 Start with the destination of the first non-default case
680 if the range is contiguous and default case otherwise as
681 guess or its destination in case it is a forwarder block. */
682 if (! single_pred_p (e_first->dest))
683 info->final_bb = e_first->dest;
684 else if (single_succ_p (e_first->dest)
685 && ! single_pred_p (single_succ (e_first->dest)))
686 info->final_bb = single_succ (e_first->dest);
687 /* Require that all switch destinations are either that common
688 FINAL_BB or a forwarder to it, except for the default
689 case if contiguous range. */
690 if (info->final_bb)
691 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
693 if (e->dest == info->final_bb)
694 continue;
696 if (single_pred_p (e->dest)
697 && single_succ_p (e->dest)
698 && single_succ (e->dest) == info->final_bb)
699 continue;
701 if (e == e_default && info->contiguous_range)
703 info->default_case_nonstandard = true;
704 continue;
707 info->final_bb = NULL;
708 break;
711 info->range_size
712 = int_const_binop (MINUS_EXPR, info->range_max, info->range_min);
714 /* Get a count of the number of case labels. Single-valued case labels
715 simply count as one, but a case range counts double, since it may
716 require two compares if it gets lowered as a branching tree. */
717 count = 0;
718 for (i = 1; i < branch_num; i++)
720 tree elt = gimple_switch_label (swtch, i);
721 count++;
722 if (CASE_HIGH (elt)
723 && ! tree_int_cst_equal (CASE_LOW (elt), CASE_HIGH (elt)))
724 count++;
726 info->count = count;
728 /* Get the number of unique non-default targets out of the GIMPLE_SWITCH
729 block. Assume a CFG cleanup would have already removed degenerate
730 switch statements, this allows us to just use EDGE_COUNT. */
731 info->uniq = EDGE_COUNT (gimple_bb (swtch)->succs) - 1;
734 /* Checks whether the range given by individual case statements of the SWTCH
735 switch statement isn't too big and whether the number of branches actually
736 satisfies the size of the new array. */
738 static bool
739 check_range (struct switch_conv_info *info)
741 gcc_assert (info->range_size);
742 if (!tree_fits_uhwi_p (info->range_size))
744 info->reason = "index range way too large or otherwise unusable";
745 return false;
748 if (tree_to_uhwi (info->range_size)
749 > ((unsigned) info->count * SWITCH_CONVERSION_BRANCH_RATIO))
751 info->reason = "the maximum range-branch ratio exceeded";
752 return false;
755 return true;
758 /* Checks whether all but the FINAL_BB basic blocks are empty. */
760 static bool
761 check_all_empty_except_final (struct switch_conv_info *info)
763 edge e, e_default = find_edge (info->switch_bb, info->default_bb);
764 edge_iterator ei;
766 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
768 if (e->dest == info->final_bb)
769 continue;
771 if (!empty_block_p (e->dest))
773 if (info->contiguous_range && e == e_default)
775 info->default_case_nonstandard = true;
776 continue;
779 info->reason = "bad case - a non-final BB not empty";
780 return false;
784 return true;
787 /* This function checks whether all required values in phi nodes in final_bb
788 are constants. Required values are those that correspond to a basic block
789 which is a part of the examined switch statement. It returns true if the
790 phi nodes are OK, otherwise false. */
792 static bool
793 check_final_bb (gswitch *swtch, struct switch_conv_info *info)
795 gphi_iterator gsi;
797 info->phi_count = 0;
798 for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
800 gphi *phi = gsi.phi ();
801 unsigned int i;
803 if (virtual_operand_p (gimple_phi_result (phi)))
804 continue;
806 info->phi_count++;
808 for (i = 0; i < gimple_phi_num_args (phi); i++)
810 basic_block bb = gimple_phi_arg_edge (phi, i)->src;
812 if (bb == info->switch_bb
813 || (single_pred_p (bb)
814 && single_pred (bb) == info->switch_bb
815 && (!info->default_case_nonstandard
816 || empty_block_p (bb))))
818 tree reloc, val;
819 const char *reason = NULL;
821 val = gimple_phi_arg_def (phi, i);
822 if (!is_gimple_ip_invariant (val))
823 reason = "non-invariant value from a case";
824 else
826 reloc = initializer_constant_valid_p (val, TREE_TYPE (val));
827 if ((flag_pic && reloc != null_pointer_node)
828 || (!flag_pic && reloc == NULL_TREE))
830 if (reloc)
831 reason
832 = "value from a case would need runtime relocations";
833 else
834 reason
835 = "value from a case is not a valid initializer";
838 if (reason)
840 /* For contiguous range, we can allow non-constant
841 or one that needs relocation, as long as it is
842 only reachable from the default case. */
843 if (bb == info->switch_bb)
844 bb = info->final_bb;
845 if (!info->contiguous_range || bb != info->default_bb)
847 info->reason = reason;
848 return false;
851 unsigned int branch_num = gimple_switch_num_labels (swtch);
852 for (unsigned int i = 1; i < branch_num; i++)
854 tree lab = CASE_LABEL (gimple_switch_label (swtch, i));
855 if (label_to_block (lab) == bb)
857 info->reason = reason;
858 return false;
861 info->default_case_nonstandard = true;
867 return true;
870 /* The following function allocates default_values, target_{in,out}_names and
871 constructors arrays. The last one is also populated with pointers to
872 vectors that will become constructors of new arrays. */
874 static void
875 create_temp_arrays (struct switch_conv_info *info)
877 int i;
879 info->default_values = XCNEWVEC (tree, info->phi_count * 3);
880 /* ??? Macros do not support multi argument templates in their
881 argument list. We create a typedef to work around that problem. */
882 typedef vec<constructor_elt, va_gc> *vec_constructor_elt_gc;
883 info->constructors = XCNEWVEC (vec_constructor_elt_gc, info->phi_count);
884 info->target_inbound_names = info->default_values + info->phi_count;
885 info->target_outbound_names = info->target_inbound_names + info->phi_count;
886 for (i = 0; i < info->phi_count; i++)
887 vec_alloc (info->constructors[i], tree_to_uhwi (info->range_size) + 1);
890 /* Free the arrays created by create_temp_arrays(). The vectors that are
891 created by that function are not freed here, however, because they have
892 already become constructors and must be preserved. */
894 static void
895 free_temp_arrays (struct switch_conv_info *info)
897 XDELETEVEC (info->constructors);
898 XDELETEVEC (info->default_values);
901 /* Populate the array of default values in the order of phi nodes.
902 DEFAULT_CASE is the CASE_LABEL_EXPR for the default switch branch
903 if the range is non-contiguous or the default case has standard
904 structure, otherwise it is the first non-default case instead. */
906 static void
907 gather_default_values (tree default_case, struct switch_conv_info *info)
909 gphi_iterator gsi;
910 basic_block bb = label_to_block (CASE_LABEL (default_case));
911 edge e;
912 int i = 0;
914 gcc_assert (CASE_LOW (default_case) == NULL_TREE
915 || info->default_case_nonstandard);
917 if (bb == info->final_bb)
918 e = find_edge (info->switch_bb, bb);
919 else
920 e = single_succ_edge (bb);
922 for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
924 gphi *phi = gsi.phi ();
925 if (virtual_operand_p (gimple_phi_result (phi)))
926 continue;
927 tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
928 gcc_assert (val);
929 info->default_values[i++] = val;
933 /* The following function populates the vectors in the constructors array with
934 future contents of the static arrays. The vectors are populated in the
935 order of phi nodes. SWTCH is the switch statement being converted. */
937 static void
938 build_constructors (gswitch *swtch, struct switch_conv_info *info)
940 unsigned i, branch_num = gimple_switch_num_labels (swtch);
941 tree pos = info->range_min;
942 tree pos_one = build_int_cst (TREE_TYPE (pos), 1);
944 for (i = 1; i < branch_num; i++)
946 tree cs = gimple_switch_label (swtch, i);
947 basic_block bb = label_to_block (CASE_LABEL (cs));
948 edge e;
949 tree high;
950 gphi_iterator gsi;
951 int j;
953 if (bb == info->final_bb)
954 e = find_edge (info->switch_bb, bb);
955 else
956 e = single_succ_edge (bb);
957 gcc_assert (e);
959 while (tree_int_cst_lt (pos, CASE_LOW (cs)))
961 int k;
962 gcc_assert (!info->contiguous_range);
963 for (k = 0; k < info->phi_count; k++)
965 constructor_elt elt;
967 elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
968 elt.value
969 = unshare_expr_without_location (info->default_values[k]);
970 info->constructors[k]->quick_push (elt);
973 pos = int_const_binop (PLUS_EXPR, pos, pos_one);
975 gcc_assert (tree_int_cst_equal (pos, CASE_LOW (cs)));
977 j = 0;
978 if (CASE_HIGH (cs))
979 high = CASE_HIGH (cs);
980 else
981 high = CASE_LOW (cs);
982 for (gsi = gsi_start_phis (info->final_bb);
983 !gsi_end_p (gsi); gsi_next (&gsi))
985 gphi *phi = gsi.phi ();
986 if (virtual_operand_p (gimple_phi_result (phi)))
987 continue;
988 tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
989 tree low = CASE_LOW (cs);
990 pos = CASE_LOW (cs);
994 constructor_elt elt;
996 elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
997 elt.value = unshare_expr_without_location (val);
998 info->constructors[j]->quick_push (elt);
1000 pos = int_const_binop (PLUS_EXPR, pos, pos_one);
1001 } while (!tree_int_cst_lt (high, pos)
1002 && tree_int_cst_lt (low, pos));
1003 j++;
1008 /* If all values in the constructor vector are the same, return the value.
1009 Otherwise return NULL_TREE. Not supposed to be called for empty
1010 vectors. */
1012 static tree
1013 constructor_contains_same_values_p (vec<constructor_elt, va_gc> *vec)
1015 unsigned int i;
1016 tree prev = NULL_TREE;
1017 constructor_elt *elt;
1019 FOR_EACH_VEC_SAFE_ELT (vec, i, elt)
1021 if (!prev)
1022 prev = elt->value;
1023 else if (!operand_equal_p (elt->value, prev, OEP_ONLY_CONST))
1024 return NULL_TREE;
1026 return prev;
1029 /* Return type which should be used for array elements, either TYPE's
1030 main variant or, for integral types, some smaller integral type
1031 that can still hold all the constants. */
1033 static tree
1034 array_value_type (gswitch *swtch, tree type, int num,
1035 struct switch_conv_info *info)
1037 unsigned int i, len = vec_safe_length (info->constructors[num]);
1038 constructor_elt *elt;
1039 int sign = 0;
1040 tree smaller_type;
1042 /* Types with alignments greater than their size can reach here, e.g. out of
1043 SRA. We couldn't use these as an array component type so get back to the
1044 main variant first, which, for our purposes, is fine for other types as
1045 well. */
1047 type = TYPE_MAIN_VARIANT (type);
1049 if (!INTEGRAL_TYPE_P (type))
1050 return type;
1052 scalar_int_mode type_mode = SCALAR_INT_TYPE_MODE (type);
1053 scalar_int_mode mode = get_narrowest_mode (type_mode);
1054 if (GET_MODE_SIZE (type_mode) <= GET_MODE_SIZE (mode))
1055 return type;
1057 if (len < (optimize_bb_for_size_p (gimple_bb (swtch)) ? 2 : 32))
1058 return type;
1060 FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
1062 wide_int cst;
1064 if (TREE_CODE (elt->value) != INTEGER_CST)
1065 return type;
1067 cst = wi::to_wide (elt->value);
1068 while (1)
1070 unsigned int prec = GET_MODE_BITSIZE (mode);
1071 if (prec > HOST_BITS_PER_WIDE_INT)
1072 return type;
1074 if (sign >= 0 && cst == wi::zext (cst, prec))
1076 if (sign == 0 && cst == wi::sext (cst, prec))
1077 break;
1078 sign = 1;
1079 break;
1081 if (sign <= 0 && cst == wi::sext (cst, prec))
1083 sign = -1;
1084 break;
1087 if (sign == 1)
1088 sign = 0;
1090 if (!GET_MODE_WIDER_MODE (mode).exists (&mode)
1091 || GET_MODE_SIZE (mode) >= GET_MODE_SIZE (type_mode))
1092 return type;
1096 if (sign == 0)
1097 sign = TYPE_UNSIGNED (type) ? 1 : -1;
1098 smaller_type = lang_hooks.types.type_for_mode (mode, sign >= 0);
1099 if (GET_MODE_SIZE (type_mode)
1100 <= GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (smaller_type)))
1101 return type;
1103 return smaller_type;
1106 /* Create an appropriate array type and declaration and assemble a static array
1107 variable. Also create a load statement that initializes the variable in
1108 question with a value from the static array. SWTCH is the switch statement
1109 being converted, NUM is the index to arrays of constructors, default values
1110 and target SSA names for this particular array. ARR_INDEX_TYPE is the type
1111 of the index of the new array, PHI is the phi node of the final BB that
1112 corresponds to the value that will be loaded from the created array. TIDX
1113 is an ssa name of a temporary variable holding the index for loads from the
1114 new array. */
1116 static void
1117 build_one_array (gswitch *swtch, int num, tree arr_index_type,
1118 gphi *phi, tree tidx, struct switch_conv_info *info)
1120 tree name, cst;
1121 gimple *load;
1122 gimple_stmt_iterator gsi = gsi_for_stmt (swtch);
1123 location_t loc = gimple_location (swtch);
1125 gcc_assert (info->default_values[num]);
1127 name = copy_ssa_name (PHI_RESULT (phi));
1128 info->target_inbound_names[num] = name;
1130 cst = constructor_contains_same_values_p (info->constructors[num]);
1131 if (cst)
1132 load = gimple_build_assign (name, cst);
1133 else
1135 tree array_type, ctor, decl, value_type, fetch, default_type;
1137 default_type = TREE_TYPE (info->default_values[num]);
1138 value_type = array_value_type (swtch, default_type, num, info);
1139 array_type = build_array_type (value_type, arr_index_type);
1140 if (default_type != value_type)
1142 unsigned int i;
1143 constructor_elt *elt;
1145 FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
1146 elt->value = fold_convert (value_type, elt->value);
1148 ctor = build_constructor (array_type, info->constructors[num]);
1149 TREE_CONSTANT (ctor) = true;
1150 TREE_STATIC (ctor) = true;
1152 decl = build_decl (loc, VAR_DECL, NULL_TREE, array_type);
1153 TREE_STATIC (decl) = 1;
1154 DECL_INITIAL (decl) = ctor;
1156 DECL_NAME (decl) = create_tmp_var_name ("CSWTCH");
1157 DECL_ARTIFICIAL (decl) = 1;
1158 DECL_IGNORED_P (decl) = 1;
1159 TREE_CONSTANT (decl) = 1;
1160 TREE_READONLY (decl) = 1;
1161 DECL_IGNORED_P (decl) = 1;
1162 varpool_node::finalize_decl (decl);
1164 fetch = build4 (ARRAY_REF, value_type, decl, tidx, NULL_TREE,
1165 NULL_TREE);
1166 if (default_type != value_type)
1168 fetch = fold_convert (default_type, fetch);
1169 fetch = force_gimple_operand_gsi (&gsi, fetch, true, NULL_TREE,
1170 true, GSI_SAME_STMT);
1172 load = gimple_build_assign (name, fetch);
1175 gsi_insert_before (&gsi, load, GSI_SAME_STMT);
1176 update_stmt (load);
1177 info->arr_ref_last = load;
1180 /* Builds and initializes static arrays initialized with values gathered from
1181 the SWTCH switch statement. Also creates statements that load values from
1182 them. */
1184 static void
1185 build_arrays (gswitch *swtch, struct switch_conv_info *info)
1187 tree arr_index_type;
1188 tree tidx, sub, utype;
1189 gimple *stmt;
1190 gimple_stmt_iterator gsi;
1191 gphi_iterator gpi;
1192 int i;
1193 location_t loc = gimple_location (swtch);
1195 gsi = gsi_for_stmt (swtch);
1197 /* Make sure we do not generate arithmetics in a subrange. */
1198 utype = TREE_TYPE (info->index_expr);
1199 if (TREE_TYPE (utype))
1200 utype = lang_hooks.types.type_for_mode (TYPE_MODE (TREE_TYPE (utype)), 1);
1201 else
1202 utype = lang_hooks.types.type_for_mode (TYPE_MODE (utype), 1);
1204 arr_index_type = build_index_type (info->range_size);
1205 tidx = make_ssa_name (utype);
1206 sub = fold_build2_loc (loc, MINUS_EXPR, utype,
1207 fold_convert_loc (loc, utype, info->index_expr),
1208 fold_convert_loc (loc, utype, info->range_min));
1209 sub = force_gimple_operand_gsi (&gsi, sub,
1210 false, NULL, true, GSI_SAME_STMT);
1211 stmt = gimple_build_assign (tidx, sub);
1213 gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
1214 update_stmt (stmt);
1215 info->arr_ref_first = stmt;
1217 for (gpi = gsi_start_phis (info->final_bb), i = 0;
1218 !gsi_end_p (gpi); gsi_next (&gpi))
1220 gphi *phi = gpi.phi ();
1221 if (!virtual_operand_p (gimple_phi_result (phi)))
1222 build_one_array (swtch, i++, arr_index_type, phi, tidx, info);
1223 else
1225 edge e;
1226 edge_iterator ei;
1227 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
1229 if (e->dest == info->final_bb)
1230 break;
1231 if (!info->default_case_nonstandard
1232 || e->dest != info->default_bb)
1234 e = single_succ_edge (e->dest);
1235 break;
1238 gcc_assert (e && e->dest == info->final_bb);
1239 info->target_vop = PHI_ARG_DEF_FROM_EDGE (phi, e);
1244 /* Generates and appropriately inserts loads of default values at the position
1245 given by BSI. Returns the last inserted statement. */
1247 static gassign *
1248 gen_def_assigns (gimple_stmt_iterator *gsi, struct switch_conv_info *info)
1250 int i;
1251 gassign *assign = NULL;
1253 for (i = 0; i < info->phi_count; i++)
1255 tree name = copy_ssa_name (info->target_inbound_names[i]);
1256 info->target_outbound_names[i] = name;
1257 assign = gimple_build_assign (name, info->default_values[i]);
1258 gsi_insert_before (gsi, assign, GSI_SAME_STMT);
1259 update_stmt (assign);
1261 return assign;
1264 /* Deletes the unused bbs and edges that now contain the switch statement and
1265 its empty branch bbs. BBD is the now dead BB containing the original switch
1266 statement, FINAL is the last BB of the converted switch statement (in terms
1267 of succession). */
1269 static void
1270 prune_bbs (basic_block bbd, basic_block final, basic_block default_bb)
1272 edge_iterator ei;
1273 edge e;
1275 for (ei = ei_start (bbd->succs); (e = ei_safe_edge (ei)); )
1277 basic_block bb;
1278 bb = e->dest;
1279 remove_edge (e);
1280 if (bb != final && bb != default_bb)
1281 delete_basic_block (bb);
1283 delete_basic_block (bbd);
1286 /* Add values to phi nodes in final_bb for the two new edges. E1F is the edge
1287 from the basic block loading values from an array and E2F from the basic
1288 block loading default values. BBF is the last switch basic block (see the
1289 bbf description in the comment below). */
1291 static void
1292 fix_phi_nodes (edge e1f, edge e2f, basic_block bbf,
1293 struct switch_conv_info *info)
1295 gphi_iterator gsi;
1296 int i;
1298 for (gsi = gsi_start_phis (bbf), i = 0;
1299 !gsi_end_p (gsi); gsi_next (&gsi))
1301 gphi *phi = gsi.phi ();
1302 tree inbound, outbound;
1303 if (virtual_operand_p (gimple_phi_result (phi)))
1304 inbound = outbound = info->target_vop;
1305 else
1307 inbound = info->target_inbound_names[i];
1308 outbound = info->target_outbound_names[i++];
1310 add_phi_arg (phi, inbound, e1f, UNKNOWN_LOCATION);
1311 if (!info->default_case_nonstandard)
1312 add_phi_arg (phi, outbound, e2f, UNKNOWN_LOCATION);
1316 /* Creates a check whether the switch expression value actually falls into the
1317 range given by all the cases. If it does not, the temporaries are loaded
1318 with default values instead. SWTCH is the switch statement being converted.
1320 bb0 is the bb with the switch statement, however, we'll end it with a
1321 condition instead.
1323 bb1 is the bb to be used when the range check went ok. It is derived from
1324 the switch BB
1326 bb2 is the bb taken when the expression evaluated outside of the range
1327 covered by the created arrays. It is populated by loads of default
1328 values.
1330 bbF is a fall through for both bb1 and bb2 and contains exactly what
1331 originally followed the switch statement.
1333 bbD contains the switch statement (in the end). It is unreachable but we
1334 still need to strip off its edges.
1337 static void
1338 gen_inbound_check (gswitch *swtch, struct switch_conv_info *info)
1340 tree label_decl1 = create_artificial_label (UNKNOWN_LOCATION);
1341 tree label_decl2 = create_artificial_label (UNKNOWN_LOCATION);
1342 tree label_decl3 = create_artificial_label (UNKNOWN_LOCATION);
1343 glabel *label1, *label2, *label3;
1344 tree utype, tidx;
1345 tree bound;
1347 gcond *cond_stmt;
1349 gassign *last_assign = NULL;
1350 gimple_stmt_iterator gsi;
1351 basic_block bb0, bb1, bb2, bbf, bbd;
1352 edge e01 = NULL, e02, e21, e1d, e1f, e2f;
1353 location_t loc = gimple_location (swtch);
1355 gcc_assert (info->default_values);
1357 bb0 = gimple_bb (swtch);
1359 tidx = gimple_assign_lhs (info->arr_ref_first);
1360 utype = TREE_TYPE (tidx);
1362 /* (end of) block 0 */
1363 gsi = gsi_for_stmt (info->arr_ref_first);
1364 gsi_next (&gsi);
1366 bound = fold_convert_loc (loc, utype, info->range_size);
1367 cond_stmt = gimple_build_cond (LE_EXPR, tidx, bound, NULL_TREE, NULL_TREE);
1368 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1369 update_stmt (cond_stmt);
1371 /* block 2 */
1372 if (!info->default_case_nonstandard)
1374 label2 = gimple_build_label (label_decl2);
1375 gsi_insert_before (&gsi, label2, GSI_SAME_STMT);
1376 last_assign = gen_def_assigns (&gsi, info);
1379 /* block 1 */
1380 label1 = gimple_build_label (label_decl1);
1381 gsi_insert_before (&gsi, label1, GSI_SAME_STMT);
1383 /* block F */
1384 gsi = gsi_start_bb (info->final_bb);
1385 label3 = gimple_build_label (label_decl3);
1386 gsi_insert_before (&gsi, label3, GSI_SAME_STMT);
1388 /* cfg fix */
1389 e02 = split_block (bb0, cond_stmt);
1390 bb2 = e02->dest;
1392 if (info->default_case_nonstandard)
1394 bb1 = bb2;
1395 bb2 = info->default_bb;
1396 e01 = e02;
1397 e01->flags = EDGE_TRUE_VALUE;
1398 e02 = make_edge (bb0, bb2, EDGE_FALSE_VALUE);
1399 edge e_default = find_edge (bb1, bb2);
1400 for (gphi_iterator gsi = gsi_start_phis (bb2);
1401 !gsi_end_p (gsi); gsi_next (&gsi))
1403 gphi *phi = gsi.phi ();
1404 tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e_default);
1405 add_phi_arg (phi, arg, e02,
1406 gimple_phi_arg_location_from_edge (phi, e_default));
1408 /* Partially fix the dominator tree, if it is available. */
1409 if (dom_info_available_p (CDI_DOMINATORS))
1410 redirect_immediate_dominators (CDI_DOMINATORS, bb1, bb0);
1412 else
1414 e21 = split_block (bb2, last_assign);
1415 bb1 = e21->dest;
1416 remove_edge (e21);
1419 e1d = split_block (bb1, info->arr_ref_last);
1420 bbd = e1d->dest;
1421 remove_edge (e1d);
1423 /* flags and profiles of the edge for in-range values */
1424 if (!info->default_case_nonstandard)
1425 e01 = make_edge (bb0, bb1, EDGE_TRUE_VALUE);
1426 e01->probability = info->default_prob.invert ();
1427 e01->count = info->other_count;
1429 /* flags and profiles of the edge taking care of out-of-range values */
1430 e02->flags &= ~EDGE_FALLTHRU;
1431 e02->flags |= EDGE_FALSE_VALUE;
1432 e02->probability = info->default_prob;
1433 e02->count = info->default_count;
1435 bbf = info->final_bb;
1437 e1f = make_edge (bb1, bbf, EDGE_FALLTHRU);
1438 e1f->probability = profile_probability::always ();
1439 e1f->count = info->other_count;
1441 if (info->default_case_nonstandard)
1442 e2f = NULL;
1443 else
1445 e2f = make_edge (bb2, bbf, EDGE_FALLTHRU);
1446 e2f->probability = profile_probability::always ();
1447 e2f->count = info->default_count;
1450 /* frequencies of the new BBs */
1451 bb1->frequency = EDGE_FREQUENCY (e01);
1452 bb2->frequency = EDGE_FREQUENCY (e02);
1453 if (!info->default_case_nonstandard)
1454 bbf->frequency = EDGE_FREQUENCY (e1f) + EDGE_FREQUENCY (e2f);
1456 /* Tidy blocks that have become unreachable. */
1457 prune_bbs (bbd, info->final_bb,
1458 info->default_case_nonstandard ? info->default_bb : NULL);
1460 /* Fixup the PHI nodes in bbF. */
1461 fix_phi_nodes (e1f, e2f, bbf, info);
1463 /* Fix the dominator tree, if it is available. */
1464 if (dom_info_available_p (CDI_DOMINATORS))
1466 vec<basic_block> bbs_to_fix_dom;
1468 set_immediate_dominator (CDI_DOMINATORS, bb1, bb0);
1469 if (!info->default_case_nonstandard)
1470 set_immediate_dominator (CDI_DOMINATORS, bb2, bb0);
1471 if (! get_immediate_dominator (CDI_DOMINATORS, bbf))
1472 /* If bbD was the immediate dominator ... */
1473 set_immediate_dominator (CDI_DOMINATORS, bbf, bb0);
1475 bbs_to_fix_dom.create (3 + (bb2 != bbf));
1476 bbs_to_fix_dom.quick_push (bb0);
1477 bbs_to_fix_dom.quick_push (bb1);
1478 if (bb2 != bbf)
1479 bbs_to_fix_dom.quick_push (bb2);
1480 bbs_to_fix_dom.quick_push (bbf);
1482 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
1483 bbs_to_fix_dom.release ();
1487 /* The following function is invoked on every switch statement (the current one
1488 is given in SWTCH) and runs the individual phases of switch conversion on it
1489 one after another until one fails or the conversion is completed.
1490 Returns NULL on success, or a pointer to a string with the reason why the
1491 conversion failed. */
1493 static const char *
1494 process_switch (gswitch *swtch)
1496 struct switch_conv_info info;
1498 /* Group case labels so that we get the right results from the heuristics
1499 that decide on the code generation approach for this switch. */
1500 group_case_labels_stmt (swtch);
1502 /* If this switch is now a degenerate case with only a default label,
1503 there is nothing left for us to do. */
1504 if (gimple_switch_num_labels (swtch) < 2)
1505 return "switch is a degenerate case";
1507 collect_switch_conv_info (swtch, &info);
1509 /* No error markers should reach here (they should be filtered out
1510 during gimplification). */
1511 gcc_checking_assert (TREE_TYPE (info.index_expr) != error_mark_node);
1513 /* A switch on a constant should have been optimized in tree-cfg-cleanup. */
1514 gcc_checking_assert (! TREE_CONSTANT (info.index_expr));
1516 if (info.uniq <= MAX_CASE_BIT_TESTS)
1518 if (expand_switch_using_bit_tests_p (info.range_size,
1519 info.uniq, info.count,
1520 optimize_bb_for_speed_p
1521 (gimple_bb (swtch))))
1523 if (dump_file)
1524 fputs (" expanding as bit test is preferable\n", dump_file);
1525 emit_case_bit_tests (swtch, info.index_expr, info.range_min,
1526 info.range_size, info.range_max);
1527 loops_state_set (LOOPS_NEED_FIXUP);
1528 return NULL;
1531 if (info.uniq <= 2)
1532 /* This will be expanded as a decision tree in stmt.c:expand_case. */
1533 return " expanding as jumps is preferable";
1536 /* If there is no common successor, we cannot do the transformation. */
1537 if (! info.final_bb)
1538 return "no common successor to all case label target blocks found";
1540 /* Check the case label values are within reasonable range: */
1541 if (!check_range (&info))
1543 gcc_assert (info.reason);
1544 return info.reason;
1547 /* For all the cases, see whether they are empty, the assignments they
1548 represent constant and so on... */
1549 if (! check_all_empty_except_final (&info))
1551 gcc_assert (info.reason);
1552 return info.reason;
1554 if (!check_final_bb (swtch, &info))
1556 gcc_assert (info.reason);
1557 return info.reason;
1560 /* At this point all checks have passed and we can proceed with the
1561 transformation. */
1563 create_temp_arrays (&info);
1564 gather_default_values (info.default_case_nonstandard
1565 ? gimple_switch_label (swtch, 1)
1566 : gimple_switch_default_label (swtch), &info);
1567 build_constructors (swtch, &info);
1569 build_arrays (swtch, &info); /* Build the static arrays and assignments. */
1570 gen_inbound_check (swtch, &info); /* Build the bounds check. */
1572 /* Cleanup: */
1573 free_temp_arrays (&info);
1574 return NULL;
1577 /* The main function of the pass scans statements for switches and invokes
1578 process_switch on them. */
1580 namespace {
1582 const pass_data pass_data_convert_switch =
1584 GIMPLE_PASS, /* type */
1585 "switchconv", /* name */
1586 OPTGROUP_NONE, /* optinfo_flags */
1587 TV_TREE_SWITCH_CONVERSION, /* tv_id */
1588 ( PROP_cfg | PROP_ssa ), /* properties_required */
1589 0, /* properties_provided */
1590 0, /* properties_destroyed */
1591 0, /* todo_flags_start */
1592 TODO_update_ssa, /* todo_flags_finish */
1595 class pass_convert_switch : public gimple_opt_pass
1597 public:
1598 pass_convert_switch (gcc::context *ctxt)
1599 : gimple_opt_pass (pass_data_convert_switch, ctxt)
1602 /* opt_pass methods: */
1603 virtual bool gate (function *) { return flag_tree_switch_conversion != 0; }
1604 virtual unsigned int execute (function *);
1606 }; // class pass_convert_switch
1608 unsigned int
1609 pass_convert_switch::execute (function *fun)
1611 basic_block bb;
1613 FOR_EACH_BB_FN (bb, fun)
1615 const char *failure_reason;
1616 gimple *stmt = last_stmt (bb);
1617 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
1619 if (dump_file)
1621 expanded_location loc = expand_location (gimple_location (stmt));
1623 fprintf (dump_file, "beginning to process the following "
1624 "SWITCH statement (%s:%d) : ------- \n",
1625 loc.file, loc.line);
1626 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1627 putc ('\n', dump_file);
1630 failure_reason = process_switch (as_a <gswitch *> (stmt));
1631 if (! failure_reason)
1633 if (dump_file)
1635 fputs ("Switch converted\n", dump_file);
1636 fputs ("--------------------------------\n", dump_file);
1639 /* Make no effort to update the post-dominator tree. It is actually not
1640 that hard for the transformations we have performed, but it is not
1641 supported by iterate_fix_dominators. */
1642 free_dominance_info (CDI_POST_DOMINATORS);
1644 else
1646 if (dump_file)
1648 fputs ("Bailing out - ", dump_file);
1649 fputs (failure_reason, dump_file);
1650 fputs ("\n--------------------------------\n", dump_file);
1656 return 0;
1659 } // anon namespace
1661 gimple_opt_pass *
1662 make_pass_convert_switch (gcc::context *ctxt)
1664 return new pass_convert_switch (ctxt);
1667 struct case_node
1669 case_node *left; /* Left son in binary tree. */
1670 case_node *right; /* Right son in binary tree;
1671 also node chain. */
1672 case_node *parent; /* Parent of node in binary tree. */
1673 tree low; /* Lowest index value for this label. */
1674 tree high; /* Highest index value for this label. */
1675 basic_block case_bb; /* Label to jump to when node matches. */
1676 tree case_label; /* Label to jump to when node matches. */
1677 profile_probability prob; /* Probability of taking this case. */
1678 profile_probability subtree_prob; /* Probability of reaching subtree
1679 rooted at this node. */
1682 typedef case_node *case_node_ptr;
1684 static basic_block emit_case_nodes (basic_block, tree, case_node_ptr,
1685 basic_block, tree, profile_probability,
1686 tree, hash_map<tree, tree> *);
1687 static bool node_has_low_bound (case_node_ptr, tree);
1688 static bool node_has_high_bound (case_node_ptr, tree);
1689 static bool node_is_bounded (case_node_ptr, tree);
1691 /* Return the smallest number of different values for which it is best to use a
1692 jump-table instead of a tree of conditional branches. */
1694 static unsigned int
1695 case_values_threshold (void)
1697 unsigned int threshold = PARAM_VALUE (PARAM_CASE_VALUES_THRESHOLD);
1699 if (threshold == 0)
1700 threshold = targetm.case_values_threshold ();
1702 return threshold;
1705 /* Reset the aux field of all outgoing edges of basic block BB. */
1707 static inline void
1708 reset_out_edges_aux (basic_block bb)
1710 edge e;
1711 edge_iterator ei;
1712 FOR_EACH_EDGE (e, ei, bb->succs)
1713 e->aux = (void *) 0;
1716 /* Compute the number of case labels that correspond to each outgoing edge of
1717 STMT. Record this information in the aux field of the edge. */
1719 static inline void
1720 compute_cases_per_edge (gswitch *stmt)
1722 basic_block bb = gimple_bb (stmt);
1723 reset_out_edges_aux (bb);
1724 int ncases = gimple_switch_num_labels (stmt);
1725 for (int i = ncases - 1; i >= 1; --i)
1727 tree elt = gimple_switch_label (stmt, i);
1728 tree lab = CASE_LABEL (elt);
1729 basic_block case_bb = label_to_block_fn (cfun, lab);
1730 edge case_edge = find_edge (bb, case_bb);
1731 case_edge->aux = (void *) ((intptr_t) (case_edge->aux) + 1);
1735 /* Do the insertion of a case label into case_list. The labels are
1736 fed to us in descending order from the sorted vector of case labels used
1737 in the tree part of the middle end. So the list we construct is
1738 sorted in ascending order.
1740 LABEL is the case label to be inserted. LOW and HIGH are the bounds
1741 against which the index is compared to jump to LABEL and PROB is the
1742 estimated probability LABEL is reached from the switch statement. */
1744 static case_node *
1745 add_case_node (case_node *head, tree low, tree high, basic_block case_bb,
1746 tree case_label, profile_probability prob,
1747 object_allocator<case_node> &case_node_pool)
1749 case_node *r;
1751 gcc_checking_assert (low);
1752 gcc_checking_assert (high && (TREE_TYPE (low) == TREE_TYPE (high)));
1754 /* Add this label to the chain. */
1755 r = case_node_pool.allocate ();
1756 r->low = low;
1757 r->high = high;
1758 r->case_bb = case_bb;
1759 r->case_label = case_label;
1760 r->parent = r->left = NULL;
1761 r->prob = prob;
1762 r->subtree_prob = prob;
1763 r->right = head;
1764 return r;
1767 /* Dump ROOT, a list or tree of case nodes, to file. */
1769 static void
1770 dump_case_nodes (FILE *f, case_node *root, int indent_step, int indent_level)
1772 if (root == 0)
1773 return;
1774 indent_level++;
1776 dump_case_nodes (f, root->left, indent_step, indent_level);
1778 fputs (";; ", f);
1779 fprintf (f, "%*s", indent_step * indent_level, "");
1780 print_dec (wi::to_wide (root->low), f, TYPE_SIGN (TREE_TYPE (root->low)));
1781 if (!tree_int_cst_equal (root->low, root->high))
1783 fprintf (f, " ... ");
1784 print_dec (wi::to_wide (root->high), f,
1785 TYPE_SIGN (TREE_TYPE (root->high)));
1787 fputs ("\n", f);
1789 dump_case_nodes (f, root->right, indent_step, indent_level);
1792 /* Take an ordered list of case nodes
1793 and transform them into a near optimal binary tree,
1794 on the assumption that any target code selection value is as
1795 likely as any other.
1797 The transformation is performed by splitting the ordered
1798 list into two equal sections plus a pivot. The parts are
1799 then attached to the pivot as left and right branches. Each
1800 branch is then transformed recursively. */
1802 static void
1803 balance_case_nodes (case_node_ptr *head, case_node_ptr parent)
1805 case_node_ptr np;
1807 np = *head;
1808 if (np)
1810 int i = 0;
1811 int ranges = 0;
1812 case_node_ptr *npp;
1813 case_node_ptr left;
1815 /* Count the number of entries on branch. Also count the ranges. */
1817 while (np)
1819 if (!tree_int_cst_equal (np->low, np->high))
1820 ranges++;
1822 i++;
1823 np = np->right;
1826 if (i > 2)
1828 /* Split this list if it is long enough for that to help. */
1829 npp = head;
1830 left = *npp;
1832 /* If there are just three nodes, split at the middle one. */
1833 if (i == 3)
1834 npp = &(*npp)->right;
1835 else
1837 /* Find the place in the list that bisects the list's total cost,
1838 where ranges count as 2.
1839 Here I gets half the total cost. */
1840 i = (i + ranges + 1) / 2;
1841 while (1)
1843 /* Skip nodes while their cost does not reach that amount. */
1844 if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
1845 i--;
1846 i--;
1847 if (i <= 0)
1848 break;
1849 npp = &(*npp)->right;
1852 *head = np = *npp;
1853 *npp = 0;
1854 np->parent = parent;
1855 np->left = left;
1857 /* Optimize each of the two split parts. */
1858 balance_case_nodes (&np->left, np);
1859 balance_case_nodes (&np->right, np);
1860 np->subtree_prob = np->prob;
1861 np->subtree_prob += np->left->subtree_prob;
1862 np->subtree_prob += np->right->subtree_prob;
1864 else
1866 /* Else leave this branch as one level,
1867 but fill in `parent' fields. */
1868 np = *head;
1869 np->parent = parent;
1870 np->subtree_prob = np->prob;
1871 for (; np->right; np = np->right)
1873 np->right->parent = np;
1874 (*head)->subtree_prob += np->right->subtree_prob;
1880 /* Return true if a switch should be expanded as a decision tree.
1881 RANGE is the difference between highest and lowest case.
1882 UNIQ is number of unique case node targets, not counting the default case.
1883 COUNT is the number of comparisons needed, not counting the default case. */
1885 static bool
1886 expand_switch_as_decision_tree_p (tree range,
1887 unsigned int uniq ATTRIBUTE_UNUSED,
1888 unsigned int count)
1890 int max_ratio;
1892 /* If neither casesi or tablejump is available, or flag_jump_tables
1893 over-ruled us, we really have no choice. */
1894 if (!targetm.have_casesi () && !targetm.have_tablejump ())
1895 return true;
1896 if (!flag_jump_tables)
1897 return true;
1898 #ifndef ASM_OUTPUT_ADDR_DIFF_ELT
1899 if (flag_pic)
1900 return true;
1901 #endif
1903 /* If the switch is relatively small such that the cost of one
1904 indirect jump on the target are higher than the cost of a
1905 decision tree, go with the decision tree.
1907 If range of values is much bigger than number of values,
1908 or if it is too large to represent in a HOST_WIDE_INT,
1909 make a sequence of conditional branches instead of a dispatch.
1911 The definition of "much bigger" depends on whether we are
1912 optimizing for size or for speed. If the former, the maximum
1913 ratio range/count = 3, because this was found to be the optimal
1914 ratio for size on i686-pc-linux-gnu, see PR11823. The ratio
1915 10 is much older, and was probably selected after an extensive
1916 benchmarking investigation on numerous platforms. Or maybe it
1917 just made sense to someone at some point in the history of GCC,
1918 who knows... */
1919 max_ratio = optimize_insn_for_size_p () ? 3 : 10;
1920 if (count < case_values_threshold () || !tree_fits_uhwi_p (range)
1921 || compare_tree_int (range, max_ratio * count) > 0)
1922 return true;
1924 return false;
1927 static void
1928 fix_phi_operands_for_edge (edge e, hash_map<tree, tree> *phi_mapping)
1930 basic_block bb = e->dest;
1931 gphi_iterator gsi;
1932 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1934 gphi *phi = gsi.phi ();
1936 tree *definition = phi_mapping->get (gimple_phi_result (phi));
1937 if (definition)
1938 add_phi_arg (phi, *definition, e, UNKNOWN_LOCATION);
1943 /* Add an unconditional jump to CASE_BB that happens in basic block BB. */
1945 static void
1946 emit_jump (basic_block bb, basic_block case_bb,
1947 hash_map<tree, tree> *phi_mapping)
1949 edge e = single_succ_edge (bb);
1950 redirect_edge_succ (e, case_bb);
1951 fix_phi_operands_for_edge (e, phi_mapping);
1954 /* Generate a decision tree, switching on INDEX_EXPR and jumping to
1955 one of the labels in CASE_LIST or to the DEFAULT_LABEL.
1956 DEFAULT_PROB is the estimated probability that it jumps to
1957 DEFAULT_LABEL.
1959 We generate a binary decision tree to select the appropriate target
1960 code. */
1962 static void
1963 emit_case_decision_tree (gswitch *s, tree index_expr, tree index_type,
1964 case_node_ptr case_list, basic_block default_bb,
1965 tree default_label, profile_probability default_prob,
1966 hash_map<tree, tree> *phi_mapping)
1968 balance_case_nodes (&case_list, NULL);
1970 if (dump_file)
1971 dump_function_to_file (current_function_decl, dump_file, dump_flags);
1972 if (dump_file && (dump_flags & TDF_DETAILS))
1974 int indent_step = ceil_log2 (TYPE_PRECISION (index_type)) + 2;
1975 fprintf (dump_file, ";; Expanding GIMPLE switch as decision tree:\n");
1976 dump_case_nodes (dump_file, case_list, indent_step, 0);
1979 basic_block bb = gimple_bb (s);
1980 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1981 edge e;
1982 if (gsi_end_p (gsi))
1983 e = split_block_after_labels (bb);
1984 else
1986 gsi_prev (&gsi);
1987 e = split_block (bb, gsi_stmt (gsi));
1989 bb = split_edge (e);
1991 bb = emit_case_nodes (bb, index_expr, case_list, default_bb, default_label,
1992 default_prob, index_type, phi_mapping);
1994 if (bb)
1995 emit_jump (bb, default_bb, phi_mapping);
1997 /* Remove all edges and do just an edge that will reach default_bb. */
1998 gsi = gsi_last_bb (gimple_bb (s));
1999 gsi_remove (&gsi, true);
2002 static void
2003 record_phi_operand_mapping (const vec<basic_block> bbs, basic_block switch_bb,
2004 hash_map <tree, tree> *map)
2006 /* Record all PHI nodes that have to be fixed after conversion. */
2007 for (unsigned i = 0; i < bbs.length (); i++)
2009 basic_block bb = bbs[i];
2011 gphi_iterator gsi;
2012 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2014 gphi *phi = gsi.phi ();
2016 for (unsigned i = 0; i < gimple_phi_num_args (phi); i++)
2018 basic_block phi_src_bb = gimple_phi_arg_edge (phi, i)->src;
2019 if (phi_src_bb == switch_bb)
2021 tree def = gimple_phi_arg_def (phi, i);
2022 tree result = gimple_phi_result (phi);
2023 map->put (result, def);
2024 break;
2031 /* Attempt to expand gimple switch STMT to a decision tree. */
2033 static bool
2034 try_switch_expansion (gswitch *stmt)
2036 tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE;
2037 basic_block default_bb;
2038 unsigned int count, uniq;
2039 int i;
2040 int ncases = gimple_switch_num_labels (stmt);
2041 tree index_expr = gimple_switch_index (stmt);
2042 tree index_type = TREE_TYPE (index_expr);
2043 tree elt;
2044 basic_block bb = gimple_bb (stmt);
2046 hash_map<tree, tree> phi_mapping;
2047 auto_vec<basic_block> case_bbs;
2049 /* A list of case labels; it is first built as a list and it may then
2050 be rearranged into a nearly balanced binary tree. */
2051 case_node *case_list = 0;
2053 /* A pool for case nodes. */
2054 object_allocator<case_node> case_node_pool ("struct case_node pool");
2056 /* cleanup_tree_cfg removes all SWITCH_EXPR with their index
2057 expressions being INTEGER_CST. */
2058 gcc_assert (TREE_CODE (index_expr) != INTEGER_CST);
2060 if (ncases == 1)
2061 return false;
2063 /* Find the default case target label. */
2064 tree default_label = CASE_LABEL (gimple_switch_default_label (stmt));
2065 default_bb = label_to_block_fn (cfun, default_label);
2066 edge default_edge = find_edge (bb, default_bb);
2067 profile_probability default_prob = default_edge->probability;
2068 case_bbs.safe_push (default_bb);
2070 /* Get upper and lower bounds of case values. */
2071 elt = gimple_switch_label (stmt, 1);
2072 minval = fold_convert (index_type, CASE_LOW (elt));
2073 elt = gimple_switch_label (stmt, ncases - 1);
2074 if (CASE_HIGH (elt))
2075 maxval = fold_convert (index_type, CASE_HIGH (elt));
2076 else
2077 maxval = fold_convert (index_type, CASE_LOW (elt));
2079 /* Compute span of values. */
2080 range = fold_build2 (MINUS_EXPR, index_type, maxval, minval);
2082 /* Listify the labels queue and gather some numbers to decide
2083 how to expand this switch. */
2084 uniq = 0;
2085 count = 0;
2086 hash_set<tree> seen_labels;
2087 compute_cases_per_edge (stmt);
2089 for (i = ncases - 1; i >= 1; --i)
2091 elt = gimple_switch_label (stmt, i);
2092 tree low = CASE_LOW (elt);
2093 gcc_assert (low);
2094 tree high = CASE_HIGH (elt);
2095 gcc_assert (!high || tree_int_cst_lt (low, high));
2096 tree lab = CASE_LABEL (elt);
2098 /* Count the elements.
2099 A range counts double, since it requires two compares. */
2100 count++;
2101 if (high)
2102 count++;
2104 /* If we have not seen this label yet, then increase the
2105 number of unique case node targets seen. */
2106 if (!seen_labels.add (lab))
2107 uniq++;
2109 /* The bounds on the case range, LOW and HIGH, have to be converted
2110 to case's index type TYPE. Note that the original type of the
2111 case index in the source code is usually "lost" during
2112 gimplification due to type promotion, but the case labels retain the
2113 original type. Make sure to drop overflow flags. */
2114 low = fold_convert (index_type, low);
2115 if (TREE_OVERFLOW (low))
2116 low = wide_int_to_tree (index_type, wi::to_wide (low));
2118 /* The canonical from of a case label in GIMPLE is that a simple case
2119 has an empty CASE_HIGH. For the casesi and tablejump expanders,
2120 the back ends want simple cases to have high == low. */
2121 if (!high)
2122 high = low;
2123 high = fold_convert (index_type, high);
2124 if (TREE_OVERFLOW (high))
2125 high = wide_int_to_tree (index_type, wi::to_wide (high));
2127 basic_block case_bb = label_to_block_fn (cfun, lab);
2128 edge case_edge = find_edge (bb, case_bb);
2129 case_list = add_case_node (
2130 case_list, low, high, case_bb, lab,
2131 case_edge->probability.apply_scale (1, (intptr_t) (case_edge->aux)),
2132 case_node_pool);
2134 case_bbs.safe_push (case_bb);
2136 reset_out_edges_aux (bb);
2137 record_phi_operand_mapping (case_bbs, bb, &phi_mapping);
2139 /* cleanup_tree_cfg removes all SWITCH_EXPR with a single
2140 destination, such as one with a default case only.
2141 It also removes cases that are out of range for the switch
2142 type, so we should never get a zero here. */
2143 gcc_assert (count > 0);
2145 /* Decide how to expand this switch.
2146 The two options at this point are a dispatch table (casesi or
2147 tablejump) or a decision tree. */
2149 if (expand_switch_as_decision_tree_p (range, uniq, count))
2151 emit_case_decision_tree (stmt, index_expr, index_type, case_list,
2152 default_bb, default_label, default_prob,
2153 &phi_mapping);
2154 return true;
2157 return false;
2160 /* The main function of the pass scans statements for switches and invokes
2161 process_switch on them. */
2163 namespace {
2165 const pass_data pass_data_lower_switch =
2167 GIMPLE_PASS, /* type */
2168 "switchlower", /* name */
2169 OPTGROUP_NONE, /* optinfo_flags */
2170 TV_TREE_SWITCH_LOWERING, /* tv_id */
2171 ( PROP_cfg | PROP_ssa ), /* properties_required */
2172 0, /* properties_provided */
2173 0, /* properties_destroyed */
2174 0, /* todo_flags_start */
2175 TODO_update_ssa | TODO_cleanup_cfg, /* todo_flags_finish */
2178 class pass_lower_switch : public gimple_opt_pass
2180 public:
2181 pass_lower_switch (gcc::context *ctxt)
2182 : gimple_opt_pass (pass_data_lower_switch, ctxt)
2185 /* opt_pass methods: */
2186 virtual bool gate (function *) { return true; }
2187 virtual unsigned int execute (function *);
2189 }; // class pass_lower_switch
2191 unsigned int
2192 pass_lower_switch::execute (function *fun)
2194 basic_block bb;
2195 bool expanded = false;
2197 FOR_EACH_BB_FN (bb, fun)
2199 gimple *stmt = last_stmt (bb);
2200 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
2202 if (dump_file)
2204 expanded_location loc = expand_location (gimple_location (stmt));
2206 fprintf (dump_file, "beginning to process the following "
2207 "SWITCH statement (%s:%d) : ------- \n",
2208 loc.file, loc.line);
2209 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
2210 putc ('\n', dump_file);
2213 expanded |= try_switch_expansion (as_a<gswitch *> (stmt));
2217 if (expanded)
2219 free_dominance_info (CDI_DOMINATORS);
2220 free_dominance_info (CDI_POST_DOMINATORS);
2221 mark_virtual_operands_for_renaming (cfun);
2224 return 0;
2227 } // anon namespace
2229 gimple_opt_pass *
2230 make_pass_lower_switch (gcc::context *ctxt)
2232 return new pass_lower_switch (ctxt);
2235 /* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE.
2236 PROB is the probability of jumping to LABEL. */
2237 static basic_block
2238 do_jump_if_equal (basic_block bb, tree op0, tree op1, basic_block label_bb,
2239 profile_probability prob, hash_map<tree, tree> *phi_mapping)
2241 gcond *cond = gimple_build_cond (EQ_EXPR, op0, op1, NULL_TREE, NULL_TREE);
2242 gimple_stmt_iterator gsi = gsi_last_bb (bb);
2243 gsi_insert_before (&gsi, cond, GSI_SAME_STMT);
2245 gcc_assert (single_succ_p (bb));
2247 /* Make a new basic block where false branch will take place. */
2248 edge false_edge = split_block (bb, cond);
2249 false_edge->flags = EDGE_FALSE_VALUE;
2250 false_edge->probability = prob.invert ();
2251 false_edge->count = bb->count.apply_probability (false_edge->probability);
2253 edge true_edge = make_edge (bb, label_bb, EDGE_TRUE_VALUE);
2254 fix_phi_operands_for_edge (true_edge, phi_mapping);
2255 true_edge->probability = prob;
2256 true_edge->count = bb->count.apply_probability (true_edge->probability);
2258 return false_edge->dest;
2261 /* Generate code to compare X with Y so that the condition codes are
2262 set and to jump to LABEL if the condition is true. If X is a
2263 constant and Y is not a constant, then the comparison is swapped to
2264 ensure that the comparison RTL has the canonical form.
2266 UNSIGNEDP nonzero says that X and Y are unsigned; this matters if they
2267 need to be widened. UNSIGNEDP is also used to select the proper
2268 branch condition code.
2270 If X and Y have mode BLKmode, then SIZE specifies the size of both X and Y.
2272 MODE is the mode of the inputs (in case they are const_int).
2274 COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
2275 It will be potentially converted into an unsigned variant based on
2276 UNSIGNEDP to select a proper jump instruction.
2278 PROB is the probability of jumping to LABEL. */
2280 static basic_block
2281 emit_cmp_and_jump_insns (basic_block bb, tree op0, tree op1,
2282 tree_code comparison, basic_block label_bb,
2283 profile_probability prob,
2284 hash_map<tree, tree> *phi_mapping)
2286 gcond *cond = gimple_build_cond (comparison, op0, op1, NULL_TREE, NULL_TREE);
2287 gimple_stmt_iterator gsi = gsi_last_bb (bb);
2288 gsi_insert_after (&gsi, cond, GSI_NEW_STMT);
2290 gcc_assert (single_succ_p (bb));
2292 /* Make a new basic block where false branch will take place. */
2293 edge false_edge = split_block (bb, cond);
2294 false_edge->flags = EDGE_FALSE_VALUE;
2295 false_edge->probability = prob.invert ();
2296 false_edge->count = bb->count.apply_probability (false_edge->probability);
2298 edge true_edge = make_edge (bb, label_bb, EDGE_TRUE_VALUE);
2299 fix_phi_operands_for_edge (true_edge, phi_mapping);
2300 true_edge->probability = prob;
2301 true_edge->count = bb->count.apply_probability (true_edge->probability);
2303 return false_edge->dest;
2306 /* Computes the conditional probability of jumping to a target if the branch
2307 instruction is executed.
2308 TARGET_PROB is the estimated probability of jumping to a target relative
2309 to some basic block BB.
2310 BASE_PROB is the probability of reaching the branch instruction relative
2311 to the same basic block BB. */
2313 static inline profile_probability
2314 conditional_probability (profile_probability target_prob,
2315 profile_probability base_prob)
2317 return target_prob / base_prob;
2320 /* Emit step-by-step code to select a case for the value of INDEX.
2321 The thus generated decision tree follows the form of the
2322 case-node binary tree NODE, whose nodes represent test conditions.
2323 INDEX_TYPE is the type of the index of the switch.
2325 Care is taken to prune redundant tests from the decision tree
2326 by detecting any boundary conditions already checked by
2327 emitted rtx. (See node_has_high_bound, node_has_low_bound
2328 and node_is_bounded, above.)
2330 Where the test conditions can be shown to be redundant we emit
2331 an unconditional jump to the target code. As a further
2332 optimization, the subordinates of a tree node are examined to
2333 check for bounded nodes. In this case conditional and/or
2334 unconditional jumps as a result of the boundary check for the
2335 current node are arranged to target the subordinates associated
2336 code for out of bound conditions on the current node.
2338 We can assume that when control reaches the code generated here,
2339 the index value has already been compared with the parents
2340 of this node, and determined to be on the same side of each parent
2341 as this node is. Thus, if this node tests for the value 51,
2342 and a parent tested for 52, we don't need to consider
2343 the possibility of a value greater than 51. If another parent
2344 tests for the value 50, then this node need not test anything. */
2346 static basic_block
2347 emit_case_nodes (basic_block bb, tree index, case_node_ptr node,
2348 basic_block default_bb, tree default_label,
2349 profile_probability default_prob, tree index_type,
2350 hash_map<tree, tree> *phi_mapping)
2352 /* If INDEX has an unsigned type, we must make unsigned branches. */
2353 profile_probability probability;
2354 profile_probability prob = node->prob, subtree_prob = node->subtree_prob;
2356 /* See if our parents have already tested everything for us.
2357 If they have, emit an unconditional jump for this node. */
2358 if (node_is_bounded (node, index_type))
2360 emit_jump (bb, node->case_bb, phi_mapping);
2361 return NULL;
2364 else if (tree_int_cst_equal (node->low, node->high))
2366 probability = conditional_probability (prob, subtree_prob + default_prob);
2367 /* Node is single valued. First see if the index expression matches
2368 this node and then check our children, if any. */
2369 bb = do_jump_if_equal (bb, index, node->low, node->case_bb, probability,
2370 phi_mapping);
2371 /* Since this case is taken at this point, reduce its weight from
2372 subtree_weight. */
2373 subtree_prob -= prob;
2374 if (node->right != 0 && node->left != 0)
2376 /* This node has children on both sides.
2377 Dispatch to one side or the other
2378 by comparing the index value with this node's value.
2379 If one subtree is bounded, check that one first,
2380 so we can avoid real branches in the tree. */
2382 if (node_is_bounded (node->right, index_type))
2384 probability
2385 = conditional_probability (node->right->prob,
2386 subtree_prob + default_prob);
2387 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2388 node->right->case_bb, probability,
2389 phi_mapping);
2390 bb = emit_case_nodes (bb, index, node->left, default_bb,
2391 default_label, default_prob, index_type,
2392 phi_mapping);
2395 else if (node_is_bounded (node->left, index_type))
2397 probability
2398 = conditional_probability (node->left->prob,
2399 subtree_prob + default_prob);
2400 bb = emit_cmp_and_jump_insns (bb, index, node->high, LT_EXPR,
2401 node->left->case_bb, probability,
2402 phi_mapping);
2403 bb = emit_case_nodes (bb, index, node->right, default_bb,
2404 default_label, default_prob, index_type,
2405 phi_mapping);
2408 /* If both children are single-valued cases with no
2409 children, finish up all the work. This way, we can save
2410 one ordered comparison. */
2411 else if (tree_int_cst_equal (node->right->low, node->right->high)
2412 && node->right->left == 0 && node->right->right == 0
2413 && tree_int_cst_equal (node->left->low, node->left->high)
2414 && node->left->left == 0 && node->left->right == 0)
2416 /* Neither node is bounded. First distinguish the two sides;
2417 then emit the code for one side at a time. */
2419 /* See if the value matches what the right hand side
2420 wants. */
2421 probability
2422 = conditional_probability (node->right->prob,
2423 subtree_prob + default_prob);
2424 bb = do_jump_if_equal (bb, index, node->right->low,
2425 node->right->case_bb, probability,
2426 phi_mapping);
2428 /* See if the value matches what the left hand side
2429 wants. */
2430 probability
2431 = conditional_probability (node->left->prob,
2432 subtree_prob + default_prob);
2433 bb = do_jump_if_equal (bb, index, node->left->low,
2434 node->left->case_bb, probability,
2435 phi_mapping);
2438 else
2440 /* Neither node is bounded. First distinguish the two sides;
2441 then emit the code for one side at a time. */
2443 basic_block test_bb = split_edge (single_succ_edge (bb));
2444 redirect_edge_succ (single_pred_edge (test_bb),
2445 single_succ_edge (bb)->dest);
2447 /* The default label could be reached either through the right
2448 subtree or the left subtree. Divide the probability
2449 equally. */
2450 probability
2451 = conditional_probability (node->right->subtree_prob
2452 + default_prob.apply_scale (1, 2),
2453 subtree_prob + default_prob);
2454 /* See if the value is on the right. */
2455 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2456 test_bb, probability, phi_mapping);
2457 default_prob = default_prob.apply_scale (1, 2);
2459 /* Value must be on the left.
2460 Handle the left-hand subtree. */
2461 bb = emit_case_nodes (bb, index, node->left, default_bb,
2462 default_label, default_prob, index_type,
2463 phi_mapping);
2464 /* If left-hand subtree does nothing,
2465 go to default. */
2467 if (bb && default_bb)
2468 emit_jump (bb, default_bb, phi_mapping);
2470 /* Code branches here for the right-hand subtree. */
2471 bb = emit_case_nodes (test_bb, index, node->right, default_bb,
2472 default_label, default_prob, index_type,
2473 phi_mapping);
2476 else if (node->right != 0 && node->left == 0)
2478 /* Here we have a right child but no left so we issue a conditional
2479 branch to default and process the right child.
2481 Omit the conditional branch to default if the right child
2482 does not have any children and is single valued; it would
2483 cost too much space to save so little time. */
2485 if (node->right->right || node->right->left
2486 || !tree_int_cst_equal (node->right->low, node->right->high))
2488 if (!node_has_low_bound (node, index_type))
2490 probability
2491 = conditional_probability (default_prob.apply_scale (1, 2),
2492 subtree_prob + default_prob);
2493 bb = emit_cmp_and_jump_insns (bb, index, node->high, LT_EXPR,
2494 default_bb, probability,
2495 phi_mapping);
2496 default_prob = default_prob.apply_scale (1, 2);
2499 bb = emit_case_nodes (bb, index, node->right, default_bb,
2500 default_label, default_prob, index_type,
2501 phi_mapping);
2503 else
2505 probability
2506 = conditional_probability (node->right->subtree_prob,
2507 subtree_prob + default_prob);
2508 /* We cannot process node->right normally
2509 since we haven't ruled out the numbers less than
2510 this node's value. So handle node->right explicitly. */
2511 bb = do_jump_if_equal (bb, index, node->right->low,
2512 node->right->case_bb, probability,
2513 phi_mapping);
2517 else if (node->right == 0 && node->left != 0)
2519 /* Just one subtree, on the left. */
2520 if (node->left->left || node->left->right
2521 || !tree_int_cst_equal (node->left->low, node->left->high))
2523 if (!node_has_high_bound (node, index_type))
2525 probability
2526 = conditional_probability (default_prob.apply_scale (1, 2),
2527 subtree_prob + default_prob);
2528 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2529 default_bb, probability,
2530 phi_mapping);
2531 default_prob = default_prob.apply_scale (1, 2);
2534 bb = emit_case_nodes (bb, index, node->left, default_bb,
2535 default_label, default_prob, index_type,
2536 phi_mapping);
2538 else
2540 probability
2541 = conditional_probability (node->left->subtree_prob,
2542 subtree_prob + default_prob);
2543 /* We cannot process node->left normally
2544 since we haven't ruled out the numbers less than
2545 this node's value. So handle node->left explicitly. */
2546 do_jump_if_equal (bb, index, node->left->low, node->left->case_bb,
2547 probability, phi_mapping);
2551 else
2553 /* Node is a range. These cases are very similar to those for a single
2554 value, except that we do not start by testing whether this node
2555 is the one to branch to. */
2557 if (node->right != 0 && node->left != 0)
2559 /* Node has subtrees on both sides.
2560 If the right-hand subtree is bounded,
2561 test for it first, since we can go straight there.
2562 Otherwise, we need to make a branch in the control structure,
2563 then handle the two subtrees. */
2564 basic_block test_bb = NULL;
2566 if (node_is_bounded (node->right, index_type))
2568 /* Right hand node is fully bounded so we can eliminate any
2569 testing and branch directly to the target code. */
2570 probability
2571 = conditional_probability (node->right->subtree_prob,
2572 subtree_prob + default_prob);
2573 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2574 node->right->case_bb, probability,
2575 phi_mapping);
2577 else
2579 /* Right hand node requires testing.
2580 Branch to a label where we will handle it later. */
2582 test_bb = split_edge (single_succ_edge (bb));
2583 redirect_edge_succ (single_pred_edge (test_bb),
2584 single_succ_edge (bb)->dest);
2586 probability
2587 = conditional_probability (node->right->subtree_prob
2588 + default_prob.apply_scale (1, 2),
2589 subtree_prob + default_prob);
2590 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2591 test_bb, probability, phi_mapping);
2592 default_prob = default_prob.apply_scale (1, 2);
2595 /* Value belongs to this node or to the left-hand subtree. */
2597 probability
2598 = conditional_probability (prob, subtree_prob + default_prob);
2599 bb = emit_cmp_and_jump_insns (bb, index, node->low, GE_EXPR,
2600 node->case_bb, probability,
2601 phi_mapping);
2603 /* Handle the left-hand subtree. */
2604 bb = emit_case_nodes (bb, index, node->left, default_bb,
2605 default_label, default_prob, index_type,
2606 phi_mapping);
2608 /* If right node had to be handled later, do that now. */
2609 if (test_bb)
2611 /* If the left-hand subtree fell through,
2612 don't let it fall into the right-hand subtree. */
2613 if (bb && default_bb)
2614 emit_jump (bb, default_bb, phi_mapping);
2616 bb = emit_case_nodes (test_bb, index, node->right, default_bb,
2617 default_label, default_prob, index_type,
2618 phi_mapping);
2622 else if (node->right != 0 && node->left == 0)
2624 /* Deal with values to the left of this node,
2625 if they are possible. */
2626 if (!node_has_low_bound (node, index_type))
2628 probability
2629 = conditional_probability (default_prob.apply_scale (1, 2),
2630 subtree_prob + default_prob);
2631 bb = emit_cmp_and_jump_insns (bb, index, node->low, LT_EXPR,
2632 default_bb, probability,
2633 phi_mapping);
2634 default_prob = default_prob.apply_scale (1, 2);
2637 /* Value belongs to this node or to the right-hand subtree. */
2639 probability
2640 = conditional_probability (prob, subtree_prob + default_prob);
2641 bb = emit_cmp_and_jump_insns (bb, index, node->high, LE_EXPR,
2642 node->case_bb, probability,
2643 phi_mapping);
2645 bb = emit_case_nodes (bb, index, node->right, default_bb,
2646 default_label, default_prob, index_type,
2647 phi_mapping);
2650 else if (node->right == 0 && node->left != 0)
2652 /* Deal with values to the right of this node,
2653 if they are possible. */
2654 if (!node_has_high_bound (node, index_type))
2656 probability
2657 = conditional_probability (default_prob.apply_scale (1, 2),
2658 subtree_prob + default_prob);
2659 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2660 default_bb, probability,
2661 phi_mapping);
2662 default_prob = default_prob.apply_scale (1, 2);
2665 /* Value belongs to this node or to the left-hand subtree. */
2667 probability
2668 = conditional_probability (prob, subtree_prob + default_prob);
2669 bb = emit_cmp_and_jump_insns (bb, index, node->low, GE_EXPR,
2670 node->case_bb, probability,
2671 phi_mapping);
2673 bb = emit_case_nodes (bb, index, node->left, default_bb,
2674 default_label, default_prob, index_type,
2675 phi_mapping);
2678 else
2680 /* Node has no children so we check low and high bounds to remove
2681 redundant tests. Only one of the bounds can exist,
2682 since otherwise this node is bounded--a case tested already. */
2683 bool high_bound = node_has_high_bound (node, index_type);
2684 bool low_bound = node_has_low_bound (node, index_type);
2686 if (!high_bound && low_bound)
2688 probability
2689 = conditional_probability (default_prob,
2690 subtree_prob + default_prob);
2691 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2692 default_bb, probability,
2693 phi_mapping);
2696 else if (!low_bound && high_bound)
2698 probability
2699 = conditional_probability (default_prob,
2700 subtree_prob + default_prob);
2701 bb = emit_cmp_and_jump_insns (bb, index, node->low, LT_EXPR,
2702 default_bb, probability,
2703 phi_mapping);
2705 else if (!low_bound && !high_bound)
2707 tree lhs, rhs;
2708 generate_range_test (bb, index, node->low, node->high,
2709 &lhs, &rhs);
2710 probability
2711 = conditional_probability (default_prob,
2712 subtree_prob + default_prob);
2713 bb = emit_cmp_and_jump_insns (bb, lhs, rhs, GT_EXPR,
2714 default_bb, probability,
2715 phi_mapping);
2718 emit_jump (bb, node->case_bb, phi_mapping);
2719 return NULL;
2723 return bb;
2726 /* Search the parent sections of the case node tree
2727 to see if a test for the lower bound of NODE would be redundant.
2728 INDEX_TYPE is the type of the index expression.
2730 The instructions to generate the case decision tree are
2731 output in the same order as nodes are processed so it is
2732 known that if a parent node checks the range of the current
2733 node minus one that the current node is bounded at its lower
2734 span. Thus the test would be redundant. */
2736 static bool
2737 node_has_low_bound (case_node_ptr node, tree index_type)
2739 tree low_minus_one;
2740 case_node_ptr pnode;
2742 /* If the lower bound of this node is the lowest value in the index type,
2743 we need not test it. */
2745 if (tree_int_cst_equal (node->low, TYPE_MIN_VALUE (index_type)))
2746 return true;
2748 /* If this node has a left branch, the value at the left must be less
2749 than that at this node, so it cannot be bounded at the bottom and
2750 we need not bother testing any further. */
2752 if (node->left)
2753 return false;
2755 low_minus_one = fold_build2 (MINUS_EXPR, TREE_TYPE (node->low), node->low,
2756 build_int_cst (TREE_TYPE (node->low), 1));
2758 /* If the subtraction above overflowed, we can't verify anything.
2759 Otherwise, look for a parent that tests our value - 1. */
2761 if (!tree_int_cst_lt (low_minus_one, node->low))
2762 return false;
2764 for (pnode = node->parent; pnode; pnode = pnode->parent)
2765 if (tree_int_cst_equal (low_minus_one, pnode->high))
2766 return true;
2768 return false;
2771 /* Search the parent sections of the case node tree
2772 to see if a test for the upper bound of NODE would be redundant.
2773 INDEX_TYPE is the type of the index expression.
2775 The instructions to generate the case decision tree are
2776 output in the same order as nodes are processed so it is
2777 known that if a parent node checks the range of the current
2778 node plus one that the current node is bounded at its upper
2779 span. Thus the test would be redundant. */
2781 static bool
2782 node_has_high_bound (case_node_ptr node, tree index_type)
2784 tree high_plus_one;
2785 case_node_ptr pnode;
2787 /* If there is no upper bound, obviously no test is needed. */
2789 if (TYPE_MAX_VALUE (index_type) == NULL)
2790 return true;
2792 /* If the upper bound of this node is the highest value in the type
2793 of the index expression, we need not test against it. */
2795 if (tree_int_cst_equal (node->high, TYPE_MAX_VALUE (index_type)))
2796 return true;
2798 /* If this node has a right branch, the value at the right must be greater
2799 than that at this node, so it cannot be bounded at the top and
2800 we need not bother testing any further. */
2802 if (node->right)
2803 return false;
2805 high_plus_one = fold_build2 (PLUS_EXPR, TREE_TYPE (node->high), node->high,
2806 build_int_cst (TREE_TYPE (node->high), 1));
2808 /* If the addition above overflowed, we can't verify anything.
2809 Otherwise, look for a parent that tests our value + 1. */
2811 if (!tree_int_cst_lt (node->high, high_plus_one))
2812 return false;
2814 for (pnode = node->parent; pnode; pnode = pnode->parent)
2815 if (tree_int_cst_equal (high_plus_one, pnode->low))
2816 return true;
2818 return false;
2821 /* Search the parent sections of the
2822 case node tree to see if both tests for the upper and lower
2823 bounds of NODE would be redundant. */
2825 static bool
2826 node_is_bounded (case_node_ptr node, tree index_type)
2828 return (node_has_low_bound (node, index_type)
2829 && node_has_high_bound (node, index_type));