2014-10-29 Thomas Preud'homme <thomas.preudhomme@arm.com>
[official-gcc.git] / gcc / tree-switch-conversion.c
blob913bad4cbbe1f87a9c3b8767f9f4f3d8929f7510
1 /* Lower GIMPLE_SWITCH expressions to something more efficient than
2 a jump table.
3 Copyright (C) 2006-2014 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 "tm.h"
29 #include "line-map.h"
30 #include "params.h"
31 #include "flags.h"
32 #include "tree.h"
33 #include "varasm.h"
34 #include "stor-layout.h"
35 #include "predict.h"
36 #include "vec.h"
37 #include "hashtab.h"
38 #include "hash-set.h"
39 #include "machmode.h"
40 #include "hard-reg-set.h"
41 #include "input.h"
42 #include "function.h"
43 #include "dominance.h"
44 #include "cfg.h"
45 #include "cfganal.h"
46 #include "basic-block.h"
47 #include "tree-ssa-alias.h"
48 #include "internal-fn.h"
49 #include "gimple-expr.h"
50 #include "is-a.h"
51 #include "gimple.h"
52 #include "gimplify.h"
53 #include "gimple-iterator.h"
54 #include "gimplify-me.h"
55 #include "gimple-ssa.h"
56 #include "hash-map.h"
57 #include "plugin-api.h"
58 #include "ipa-ref.h"
59 #include "cgraph.h"
60 #include "tree-cfg.h"
61 #include "tree-phinodes.h"
62 #include "stringpool.h"
63 #include "tree-ssanames.h"
64 #include "tree-pass.h"
65 #include "gimple-pretty-print.h"
66 #include "cfgloop.h"
68 /* ??? For lang_hooks.types.type_for_mode, but is there a word_mode
69 type in the GIMPLE type system that is language-independent? */
70 #include "langhooks.h"
72 /* Need to include expr.h and optabs.h for lshift_cheap_p. */
73 #include "expr.h"
74 #include "optabs.h"
76 /* Maximum number of case bit tests.
77 FIXME: This should be derived from PARAM_CASE_VALUES_THRESHOLD and
78 targetm.case_values_threshold(), or be its own param. */
79 #define MAX_CASE_BIT_TESTS 3
81 /* Split the basic block at the statement pointed to by GSIP, and insert
82 a branch to the target basic block of E_TRUE conditional on tree
83 expression COND.
85 It is assumed that there is already an edge from the to-be-split
86 basic block to E_TRUE->dest block. This edge is removed, and the
87 profile information on the edge is re-used for the new conditional
88 jump.
90 The CFG is updated. The dominator tree will not be valid after
91 this transformation, but the immediate dominators are updated if
92 UPDATE_DOMINATORS is true.
94 Returns the newly created basic block. */
96 static basic_block
97 hoist_edge_and_branch_if_true (gimple_stmt_iterator *gsip,
98 tree cond, edge e_true,
99 bool update_dominators)
101 tree tmp;
102 gimple cond_stmt;
103 edge e_false;
104 basic_block new_bb, split_bb = gsi_bb (*gsip);
105 bool dominated_e_true = false;
107 gcc_assert (e_true->src == split_bb);
109 if (update_dominators
110 && get_immediate_dominator (CDI_DOMINATORS, e_true->dest) == split_bb)
111 dominated_e_true = true;
113 tmp = force_gimple_operand_gsi (gsip, cond, /*simple=*/true, NULL,
114 /*before=*/true, GSI_SAME_STMT);
115 cond_stmt = gimple_build_cond_from_tree (tmp, NULL_TREE, NULL_TREE);
116 gsi_insert_before (gsip, cond_stmt, GSI_SAME_STMT);
118 e_false = split_block (split_bb, cond_stmt);
119 new_bb = e_false->dest;
120 redirect_edge_pred (e_true, split_bb);
122 e_true->flags &= ~EDGE_FALLTHRU;
123 e_true->flags |= EDGE_TRUE_VALUE;
125 e_false->flags &= ~EDGE_FALLTHRU;
126 e_false->flags |= EDGE_FALSE_VALUE;
127 e_false->probability = REG_BR_PROB_BASE - e_true->probability;
128 e_false->count = split_bb->count - e_true->count;
129 new_bb->count = e_false->count;
131 if (update_dominators)
133 if (dominated_e_true)
134 set_immediate_dominator (CDI_DOMINATORS, e_true->dest, split_bb);
135 set_immediate_dominator (CDI_DOMINATORS, e_false->dest, split_bb);
138 return new_bb;
142 /* Return true if a switch should be expanded as a bit test.
143 RANGE is the difference between highest and lowest case.
144 UNIQ is number of unique case node targets, not counting the default case.
145 COUNT is the number of comparisons needed, not counting the default case. */
147 static bool
148 expand_switch_using_bit_tests_p (tree range,
149 unsigned int uniq,
150 unsigned int count, bool speed_p)
152 return (((uniq == 1 && count >= 3)
153 || (uniq == 2 && count >= 5)
154 || (uniq == 3 && count >= 6))
155 && lshift_cheap_p (speed_p)
156 && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0
157 && compare_tree_int (range, 0) > 0);
160 /* Implement switch statements with bit tests
162 A GIMPLE switch statement can be expanded to a short sequence of bit-wise
163 comparisons. "switch(x)" is converted into "if ((1 << (x-MINVAL)) & CST)"
164 where CST and MINVAL are integer constants. This is better than a series
165 of compare-and-banch insns in some cases, e.g. we can implement:
167 if ((x==4) || (x==6) || (x==9) || (x==11))
169 as a single bit test:
171 if ((1<<x) & ((1<<4)|(1<<6)|(1<<9)|(1<<11)))
173 This transformation is only applied if the number of case targets is small,
174 if CST constains at least 3 bits, and "1 << x" is cheap. The bit tests are
175 performed in "word_mode".
177 The following example shows the code the transformation generates:
179 int bar(int x)
181 switch (x)
183 case '0': case '1': case '2': case '3': case '4':
184 case '5': case '6': case '7': case '8': case '9':
185 case 'A': case 'B': case 'C': case 'D': case 'E':
186 case 'F':
187 return 1;
189 return 0;
194 bar (int x)
196 tmp1 = x - 48;
197 if (tmp1 > (70 - 48)) goto L2;
198 tmp2 = 1 << tmp1;
199 tmp3 = 0b11111100000001111111111;
200 if ((tmp2 & tmp3) != 0) goto L1 ; else goto L2;
202 return 1;
204 return 0;
207 TODO: There are still some improvements to this transformation that could
208 be implemented:
210 * A narrower mode than word_mode could be used if that is cheaper, e.g.
211 for x86_64 where a narrower-mode shift may result in smaller code.
213 * The compounded constant could be shifted rather than the one. The
214 test would be either on the sign bit or on the least significant bit,
215 depending on the direction of the shift. On some machines, the test
216 for the branch would be free if the bit to test is already set by the
217 shift operation.
219 This transformation was contributed by Roger Sayle, see this e-mail:
220 http://gcc.gnu.org/ml/gcc-patches/2003-01/msg01950.html
223 /* A case_bit_test represents a set of case nodes that may be
224 selected from using a bit-wise comparison. HI and LO hold
225 the integer to be tested against, TARGET_EDGE contains the
226 edge to the basic block to jump to upon success and BITS
227 counts the number of case nodes handled by this test,
228 typically the number of bits set in HI:LO. The LABEL field
229 is used to quickly identify all cases in this set without
230 looking at label_to_block for every case label. */
232 struct case_bit_test
234 wide_int mask;
235 edge target_edge;
236 tree label;
237 int bits;
240 /* Comparison function for qsort to order bit tests by decreasing
241 probability of execution. Our best guess comes from a measured
242 profile. If the profile counts are equal, break even on the
243 number of case nodes, i.e. the node with the most cases gets
244 tested first.
246 TODO: Actually this currently runs before a profile is available.
247 Therefore the case-as-bit-tests transformation should be done
248 later in the pass pipeline, or something along the lines of
249 "Efficient and effective branch reordering using profile data"
250 (Yang et. al., 2002) should be implemented (although, how good
251 is a paper is called "Efficient and effective ..." when the
252 latter is implied by the former, but oh well...). */
254 static int
255 case_bit_test_cmp (const void *p1, const void *p2)
257 const struct case_bit_test *const d1 = (const struct case_bit_test *) p1;
258 const struct case_bit_test *const d2 = (const struct case_bit_test *) p2;
260 if (d2->target_edge->count != d1->target_edge->count)
261 return d2->target_edge->count - d1->target_edge->count;
262 if (d2->bits != d1->bits)
263 return d2->bits - d1->bits;
265 /* Stabilize the sort. */
266 return LABEL_DECL_UID (d2->label) - LABEL_DECL_UID (d1->label);
269 /* Expand a switch statement by a short sequence of bit-wise
270 comparisons. "switch(x)" is effectively converted into
271 "if ((1 << (x-MINVAL)) & CST)" where CST and MINVAL are
272 integer constants.
274 INDEX_EXPR is the value being switched on.
276 MINVAL is the lowest case value of in the case nodes,
277 and RANGE is highest value minus MINVAL. MINVAL and RANGE
278 are not guaranteed to be of the same type as INDEX_EXPR
279 (the gimplifier doesn't change the type of case label values,
280 and MINVAL and RANGE are derived from those values).
281 MAXVAL is MINVAL + RANGE.
283 There *MUST* be MAX_CASE_BIT_TESTS or less unique case
284 node targets. */
286 static void
287 emit_case_bit_tests (gimple swtch, tree index_expr,
288 tree minval, tree range, tree maxval)
290 struct case_bit_test test[MAX_CASE_BIT_TESTS];
291 unsigned int i, j, k;
292 unsigned int count;
294 basic_block switch_bb = gimple_bb (swtch);
295 basic_block default_bb, new_default_bb, new_bb;
296 edge default_edge;
297 bool update_dom = dom_info_available_p (CDI_DOMINATORS);
299 vec<basic_block> bbs_to_fix_dom = vNULL;
301 tree index_type = TREE_TYPE (index_expr);
302 tree unsigned_index_type = unsigned_type_for (index_type);
303 unsigned int branch_num = gimple_switch_num_labels (swtch);
305 gimple_stmt_iterator gsi;
306 gimple shift_stmt;
308 tree idx, tmp, csui;
309 tree word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
310 tree word_mode_zero = fold_convert (word_type_node, integer_zero_node);
311 tree word_mode_one = fold_convert (word_type_node, integer_one_node);
312 int prec = TYPE_PRECISION (word_type_node);
313 wide_int wone = wi::one (prec);
315 memset (&test, 0, sizeof (test));
317 /* Get the edge for the default case. */
318 tmp = gimple_switch_default_label (swtch);
319 default_bb = label_to_block (CASE_LABEL (tmp));
320 default_edge = find_edge (switch_bb, default_bb);
322 /* Go through all case labels, and collect the case labels, profile
323 counts, and other information we need to build the branch tests. */
324 count = 0;
325 for (i = 1; i < branch_num; i++)
327 unsigned int lo, hi;
328 tree cs = gimple_switch_label (swtch, i);
329 tree label = CASE_LABEL (cs);
330 edge e = find_edge (switch_bb, label_to_block (label));
331 for (k = 0; k < count; k++)
332 if (e == test[k].target_edge)
333 break;
335 if (k == count)
337 gcc_checking_assert (count < MAX_CASE_BIT_TESTS);
338 test[k].mask = wi::zero (prec);
339 test[k].target_edge = e;
340 test[k].label = label;
341 test[k].bits = 1;
342 count++;
344 else
345 test[k].bits++;
347 lo = tree_to_uhwi (int_const_binop (MINUS_EXPR,
348 CASE_LOW (cs), minval));
349 if (CASE_HIGH (cs) == NULL_TREE)
350 hi = lo;
351 else
352 hi = tree_to_uhwi (int_const_binop (MINUS_EXPR,
353 CASE_HIGH (cs), minval));
355 for (j = lo; j <= hi; j++)
356 test[k].mask |= wi::lshift (wone, j);
359 qsort (test, count, sizeof (*test), case_bit_test_cmp);
361 /* If all values are in the 0 .. BITS_PER_WORD-1 range, we can get rid of
362 the minval subtractions, but it might make the mask constants more
363 expensive. So, compare the costs. */
364 if (compare_tree_int (minval, 0) > 0
365 && compare_tree_int (maxval, GET_MODE_BITSIZE (word_mode)) < 0)
367 int cost_diff;
368 HOST_WIDE_INT m = tree_to_uhwi (minval);
369 rtx reg = gen_raw_REG (word_mode, 10000);
370 bool speed_p = optimize_bb_for_speed_p (gimple_bb (swtch));
371 cost_diff = set_rtx_cost (gen_rtx_PLUS (word_mode, reg,
372 GEN_INT (-m)), speed_p);
373 for (i = 0; i < count; i++)
375 rtx r = immed_wide_int_const (test[i].mask, word_mode);
376 cost_diff += set_src_cost (gen_rtx_AND (word_mode, reg, r), speed_p);
377 r = immed_wide_int_const (wi::lshift (test[i].mask, m), word_mode);
378 cost_diff -= set_src_cost (gen_rtx_AND (word_mode, reg, r), speed_p);
380 if (cost_diff > 0)
382 for (i = 0; i < count; i++)
383 test[i].mask = wi::lshift (test[i].mask, m);
384 minval = build_zero_cst (TREE_TYPE (minval));
385 range = maxval;
389 /* We generate two jumps to the default case label.
390 Split the default edge, so that we don't have to do any PHI node
391 updating. */
392 new_default_bb = split_edge (default_edge);
394 if (update_dom)
396 bbs_to_fix_dom.create (10);
397 bbs_to_fix_dom.quick_push (switch_bb);
398 bbs_to_fix_dom.quick_push (default_bb);
399 bbs_to_fix_dom.quick_push (new_default_bb);
402 /* Now build the test-and-branch code. */
404 gsi = gsi_last_bb (switch_bb);
406 /* idx = (unsigned)x - minval. */
407 idx = fold_convert (unsigned_index_type, index_expr);
408 idx = fold_build2 (MINUS_EXPR, unsigned_index_type, idx,
409 fold_convert (unsigned_index_type, minval));
410 idx = force_gimple_operand_gsi (&gsi, idx,
411 /*simple=*/true, NULL_TREE,
412 /*before=*/true, GSI_SAME_STMT);
414 /* if (idx > range) goto default */
415 range = force_gimple_operand_gsi (&gsi,
416 fold_convert (unsigned_index_type, range),
417 /*simple=*/true, NULL_TREE,
418 /*before=*/true, GSI_SAME_STMT);
419 tmp = fold_build2 (GT_EXPR, boolean_type_node, idx, range);
420 new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, default_edge, update_dom);
421 if (update_dom)
422 bbs_to_fix_dom.quick_push (new_bb);
423 gcc_assert (gimple_bb (swtch) == new_bb);
424 gsi = gsi_last_bb (new_bb);
426 /* Any blocks dominated by the GIMPLE_SWITCH, but that are not successors
427 of NEW_BB, are still immediately dominated by SWITCH_BB. Make it so. */
428 if (update_dom)
430 vec<basic_block> dom_bbs;
431 basic_block dom_son;
433 dom_bbs = get_dominated_by (CDI_DOMINATORS, new_bb);
434 FOR_EACH_VEC_ELT (dom_bbs, i, dom_son)
436 edge e = find_edge (new_bb, dom_son);
437 if (e && single_pred_p (e->dest))
438 continue;
439 set_immediate_dominator (CDI_DOMINATORS, dom_son, switch_bb);
440 bbs_to_fix_dom.safe_push (dom_son);
442 dom_bbs.release ();
445 /* csui = (1 << (word_mode) idx) */
446 csui = make_ssa_name (word_type_node, NULL);
447 tmp = fold_build2 (LSHIFT_EXPR, word_type_node, word_mode_one,
448 fold_convert (word_type_node, idx));
449 tmp = force_gimple_operand_gsi (&gsi, tmp,
450 /*simple=*/false, NULL_TREE,
451 /*before=*/true, GSI_SAME_STMT);
452 shift_stmt = gimple_build_assign (csui, tmp);
453 gsi_insert_before (&gsi, shift_stmt, GSI_SAME_STMT);
454 update_stmt (shift_stmt);
456 /* for each unique set of cases:
457 if (const & csui) goto target */
458 for (k = 0; k < count; k++)
460 tmp = wide_int_to_tree (word_type_node, test[k].mask);
461 tmp = fold_build2 (BIT_AND_EXPR, word_type_node, csui, tmp);
462 tmp = force_gimple_operand_gsi (&gsi, tmp,
463 /*simple=*/true, NULL_TREE,
464 /*before=*/true, GSI_SAME_STMT);
465 tmp = fold_build2 (NE_EXPR, boolean_type_node, tmp, word_mode_zero);
466 new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, test[k].target_edge,
467 update_dom);
468 if (update_dom)
469 bbs_to_fix_dom.safe_push (new_bb);
470 gcc_assert (gimple_bb (swtch) == new_bb);
471 gsi = gsi_last_bb (new_bb);
474 /* We should have removed all edges now. */
475 gcc_assert (EDGE_COUNT (gsi_bb (gsi)->succs) == 0);
477 /* If nothing matched, go to the default label. */
478 make_edge (gsi_bb (gsi), new_default_bb, EDGE_FALLTHRU);
480 /* The GIMPLE_SWITCH is now redundant. */
481 gsi_remove (&gsi, true);
483 if (update_dom)
485 /* Fix up the dominator tree. */
486 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
487 bbs_to_fix_dom.release ();
492 Switch initialization conversion
494 The following pass changes simple initializations of scalars in a switch
495 statement into initializations from a static array. Obviously, the values
496 must be constant and known at compile time and a default branch must be
497 provided. For example, the following code:
499 int a,b;
501 switch (argc)
503 case 1:
504 case 2:
505 a_1 = 8;
506 b_1 = 6;
507 break;
508 case 3:
509 a_2 = 9;
510 b_2 = 5;
511 break;
512 case 12:
513 a_3 = 10;
514 b_3 = 4;
515 break;
516 default:
517 a_4 = 16;
518 b_4 = 1;
519 break;
521 a_5 = PHI <a_1, a_2, a_3, a_4>
522 b_5 = PHI <b_1, b_2, b_3, b_4>
525 is changed into:
527 static const int = CSWTCH01[] = {6, 6, 5, 1, 1, 1, 1, 1, 1, 1, 1, 4};
528 static const int = CSWTCH02[] = {8, 8, 9, 16, 16, 16, 16, 16, 16, 16,
529 16, 16, 10};
531 if (((unsigned) argc) - 1 < 11)
533 a_6 = CSWTCH02[argc - 1];
534 b_6 = CSWTCH01[argc - 1];
536 else
538 a_7 = 16;
539 b_7 = 1;
541 a_5 = PHI <a_6, a_7>
542 b_b = PHI <b_6, b_7>
544 There are further constraints. Specifically, the range of values across all
545 case labels must not be bigger than SWITCH_CONVERSION_BRANCH_RATIO (default
546 eight) times the number of the actual switch branches.
548 This transformation was contributed by Martin Jambor, see this e-mail:
549 http://gcc.gnu.org/ml/gcc-patches/2008-07/msg00011.html */
551 /* The main structure of the pass. */
552 struct switch_conv_info
554 /* The expression used to decide the switch branch. */
555 tree index_expr;
557 /* The following integer constants store the minimum and maximum value
558 covered by the case labels. */
559 tree range_min;
560 tree range_max;
562 /* The difference between the above two numbers. Stored here because it
563 is used in all the conversion heuristics, as well as for some of the
564 transformation, and it is expensive to re-compute it all the time. */
565 tree range_size;
567 /* Basic block that contains the actual GIMPLE_SWITCH. */
568 basic_block switch_bb;
570 /* Basic block that is the target of the default case. */
571 basic_block default_bb;
573 /* The single successor block of all branches out of the GIMPLE_SWITCH,
574 if such a block exists. Otherwise NULL. */
575 basic_block final_bb;
577 /* The probability of the default edge in the replaced switch. */
578 int default_prob;
580 /* The count of the default edge in the replaced switch. */
581 gcov_type default_count;
583 /* Combined count of all other (non-default) edges in the replaced switch. */
584 gcov_type other_count;
586 /* Number of phi nodes in the final bb (that we'll be replacing). */
587 int phi_count;
589 /* Array of default values, in the same order as phi nodes. */
590 tree *default_values;
592 /* Constructors of new static arrays. */
593 vec<constructor_elt, va_gc> **constructors;
595 /* Array of ssa names that are initialized with a value from a new static
596 array. */
597 tree *target_inbound_names;
599 /* Array of ssa names that are initialized with the default value if the
600 switch expression is out of range. */
601 tree *target_outbound_names;
603 /* The first load statement that loads a temporary from a new static array.
605 gimple arr_ref_first;
607 /* The last load statement that loads a temporary from a new static array. */
608 gimple arr_ref_last;
610 /* String reason why the case wasn't a good candidate that is written to the
611 dump file, if there is one. */
612 const char *reason;
614 /* Parameters for expand_switch_using_bit_tests. Should be computed
615 the same way as in expand_case. */
616 unsigned int uniq;
617 unsigned int count;
620 /* Collect information about GIMPLE_SWITCH statement SWTCH into INFO. */
622 static void
623 collect_switch_conv_info (gimple swtch, struct switch_conv_info *info)
625 unsigned int branch_num = gimple_switch_num_labels (swtch);
626 tree min_case, max_case;
627 unsigned int count, i;
628 edge e, e_default;
629 edge_iterator ei;
631 memset (info, 0, sizeof (*info));
633 /* The gimplifier has already sorted the cases by CASE_LOW and ensured there
634 is a default label which is the first in the vector.
635 Collect the bits we can deduce from the CFG. */
636 info->index_expr = gimple_switch_index (swtch);
637 info->switch_bb = gimple_bb (swtch);
638 info->default_bb =
639 label_to_block (CASE_LABEL (gimple_switch_default_label (swtch)));
640 e_default = find_edge (info->switch_bb, info->default_bb);
641 info->default_prob = e_default->probability;
642 info->default_count = e_default->count;
643 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
644 if (e != e_default)
645 info->other_count += e->count;
647 /* See if there is one common successor block for all branch
648 targets. If it exists, record it in FINAL_BB.
649 Start with the destination of the default case as guess
650 or its destination in case it is a forwarder block. */
651 if (! single_pred_p (e_default->dest))
652 info->final_bb = e_default->dest;
653 else if (single_succ_p (e_default->dest)
654 && ! single_pred_p (single_succ (e_default->dest)))
655 info->final_bb = single_succ (e_default->dest);
656 /* Require that all switch destinations are either that common
657 FINAL_BB or a forwarder to it. */
658 if (info->final_bb)
659 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
661 if (e->dest == info->final_bb)
662 continue;
664 if (single_pred_p (e->dest)
665 && single_succ_p (e->dest)
666 && single_succ (e->dest) == info->final_bb)
667 continue;
669 info->final_bb = NULL;
670 break;
673 /* Get upper and lower bounds of case values, and the covered range. */
674 min_case = gimple_switch_label (swtch, 1);
675 max_case = gimple_switch_label (swtch, branch_num - 1);
677 info->range_min = CASE_LOW (min_case);
678 if (CASE_HIGH (max_case) != NULL_TREE)
679 info->range_max = CASE_HIGH (max_case);
680 else
681 info->range_max = CASE_LOW (max_case);
683 info->range_size =
684 int_const_binop (MINUS_EXPR, info->range_max, info->range_min);
686 /* Get a count of the number of case labels. Single-valued case labels
687 simply count as one, but a case range counts double, since it may
688 require two compares if it gets lowered as a branching tree. */
689 count = 0;
690 for (i = 1; i < branch_num; i++)
692 tree elt = gimple_switch_label (swtch, i);
693 count++;
694 if (CASE_HIGH (elt)
695 && ! tree_int_cst_equal (CASE_LOW (elt), CASE_HIGH (elt)))
696 count++;
698 info->count = count;
700 /* Get the number of unique non-default targets out of the GIMPLE_SWITCH
701 block. Assume a CFG cleanup would have already removed degenerate
702 switch statements, this allows us to just use EDGE_COUNT. */
703 info->uniq = EDGE_COUNT (gimple_bb (swtch)->succs) - 1;
706 /* Checks whether the range given by individual case statements of the SWTCH
707 switch statement isn't too big and whether the number of branches actually
708 satisfies the size of the new array. */
710 static bool
711 check_range (struct switch_conv_info *info)
713 gcc_assert (info->range_size);
714 if (!tree_fits_uhwi_p (info->range_size))
716 info->reason = "index range way too large or otherwise unusable";
717 return false;
720 if (tree_to_uhwi (info->range_size)
721 > ((unsigned) info->count * SWITCH_CONVERSION_BRANCH_RATIO))
723 info->reason = "the maximum range-branch ratio exceeded";
724 return false;
727 return true;
730 /* Checks whether all but the FINAL_BB basic blocks are empty. */
732 static bool
733 check_all_empty_except_final (struct switch_conv_info *info)
735 edge e;
736 edge_iterator ei;
738 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
740 if (e->dest == info->final_bb)
741 continue;
743 if (!empty_block_p (e->dest))
745 info->reason = "bad case - a non-final BB not empty";
746 return false;
750 return true;
753 /* This function checks whether all required values in phi nodes in final_bb
754 are constants. Required values are those that correspond to a basic block
755 which is a part of the examined switch statement. It returns true if the
756 phi nodes are OK, otherwise false. */
758 static bool
759 check_final_bb (struct switch_conv_info *info)
761 gimple_stmt_iterator gsi;
763 info->phi_count = 0;
764 for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
766 gimple phi = gsi_stmt (gsi);
767 unsigned int i;
769 info->phi_count++;
771 for (i = 0; i < gimple_phi_num_args (phi); i++)
773 basic_block bb = gimple_phi_arg_edge (phi, i)->src;
775 if (bb == info->switch_bb
776 || (single_pred_p (bb) && single_pred (bb) == info->switch_bb))
778 tree reloc, val;
780 val = gimple_phi_arg_def (phi, i);
781 if (!is_gimple_ip_invariant (val))
783 info->reason = "non-invariant value from a case";
784 return false; /* Non-invariant argument. */
786 reloc = initializer_constant_valid_p (val, TREE_TYPE (val));
787 if ((flag_pic && reloc != null_pointer_node)
788 || (!flag_pic && reloc == NULL_TREE))
790 if (reloc)
791 info->reason
792 = "value from a case would need runtime relocations";
793 else
794 info->reason
795 = "value from a case is not a valid initializer";
796 return false;
802 return true;
805 /* The following function allocates default_values, target_{in,out}_names and
806 constructors arrays. The last one is also populated with pointers to
807 vectors that will become constructors of new arrays. */
809 static void
810 create_temp_arrays (struct switch_conv_info *info)
812 int i;
814 info->default_values = XCNEWVEC (tree, info->phi_count * 3);
815 /* ??? Macros do not support multi argument templates in their
816 argument list. We create a typedef to work around that problem. */
817 typedef vec<constructor_elt, va_gc> *vec_constructor_elt_gc;
818 info->constructors = XCNEWVEC (vec_constructor_elt_gc, info->phi_count);
819 info->target_inbound_names = info->default_values + info->phi_count;
820 info->target_outbound_names = info->target_inbound_names + info->phi_count;
821 for (i = 0; i < info->phi_count; i++)
822 vec_alloc (info->constructors[i], tree_to_uhwi (info->range_size) + 1);
825 /* Free the arrays created by create_temp_arrays(). The vectors that are
826 created by that function are not freed here, however, because they have
827 already become constructors and must be preserved. */
829 static void
830 free_temp_arrays (struct switch_conv_info *info)
832 XDELETEVEC (info->constructors);
833 XDELETEVEC (info->default_values);
836 /* Populate the array of default values in the order of phi nodes.
837 DEFAULT_CASE is the CASE_LABEL_EXPR for the default switch branch. */
839 static void
840 gather_default_values (tree default_case, struct switch_conv_info *info)
842 gimple_stmt_iterator gsi;
843 basic_block bb = label_to_block (CASE_LABEL (default_case));
844 edge e;
845 int i = 0;
847 gcc_assert (CASE_LOW (default_case) == NULL_TREE);
849 if (bb == info->final_bb)
850 e = find_edge (info->switch_bb, bb);
851 else
852 e = single_succ_edge (bb);
854 for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
856 gimple phi = gsi_stmt (gsi);
857 tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
858 gcc_assert (val);
859 info->default_values[i++] = val;
863 /* The following function populates the vectors in the constructors array with
864 future contents of the static arrays. The vectors are populated in the
865 order of phi nodes. SWTCH is the switch statement being converted. */
867 static void
868 build_constructors (gimple swtch, struct switch_conv_info *info)
870 unsigned i, branch_num = gimple_switch_num_labels (swtch);
871 tree pos = info->range_min;
873 for (i = 1; i < branch_num; i++)
875 tree cs = gimple_switch_label (swtch, i);
876 basic_block bb = label_to_block (CASE_LABEL (cs));
877 edge e;
878 tree high;
879 gimple_stmt_iterator gsi;
880 int j;
882 if (bb == info->final_bb)
883 e = find_edge (info->switch_bb, bb);
884 else
885 e = single_succ_edge (bb);
886 gcc_assert (e);
888 while (tree_int_cst_lt (pos, CASE_LOW (cs)))
890 int k;
891 for (k = 0; k < info->phi_count; k++)
893 constructor_elt elt;
895 elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
896 elt.value
897 = unshare_expr_without_location (info->default_values[k]);
898 info->constructors[k]->quick_push (elt);
901 pos = int_const_binop (PLUS_EXPR, pos,
902 build_int_cst (TREE_TYPE (pos), 1));
904 gcc_assert (tree_int_cst_equal (pos, CASE_LOW (cs)));
906 j = 0;
907 if (CASE_HIGH (cs))
908 high = CASE_HIGH (cs);
909 else
910 high = CASE_LOW (cs);
911 for (gsi = gsi_start_phis (info->final_bb);
912 !gsi_end_p (gsi); gsi_next (&gsi))
914 gimple phi = gsi_stmt (gsi);
915 tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
916 tree low = CASE_LOW (cs);
917 pos = CASE_LOW (cs);
921 constructor_elt elt;
923 elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
924 elt.value = unshare_expr_without_location (val);
925 info->constructors[j]->quick_push (elt);
927 pos = int_const_binop (PLUS_EXPR, pos,
928 build_int_cst (TREE_TYPE (pos), 1));
929 } while (!tree_int_cst_lt (high, pos)
930 && tree_int_cst_lt (low, pos));
931 j++;
936 /* If all values in the constructor vector are the same, return the value.
937 Otherwise return NULL_TREE. Not supposed to be called for empty
938 vectors. */
940 static tree
941 constructor_contains_same_values_p (vec<constructor_elt, va_gc> *vec)
943 unsigned int i;
944 tree prev = NULL_TREE;
945 constructor_elt *elt;
947 FOR_EACH_VEC_SAFE_ELT (vec, i, elt)
949 if (!prev)
950 prev = elt->value;
951 else if (!operand_equal_p (elt->value, prev, OEP_ONLY_CONST))
952 return NULL_TREE;
954 return prev;
957 /* Return type which should be used for array elements, either TYPE,
958 or for integral type some smaller integral type that can still hold
959 all the constants. */
961 static tree
962 array_value_type (gimple swtch, tree type, int num,
963 struct switch_conv_info *info)
965 unsigned int i, len = vec_safe_length (info->constructors[num]);
966 constructor_elt *elt;
967 enum machine_mode mode;
968 int sign = 0;
969 tree smaller_type;
971 if (!INTEGRAL_TYPE_P (type))
972 return type;
974 mode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (TYPE_MODE (type)));
975 if (GET_MODE_SIZE (TYPE_MODE (type)) <= GET_MODE_SIZE (mode))
976 return type;
978 if (len < (optimize_bb_for_size_p (gimple_bb (swtch)) ? 2 : 32))
979 return type;
981 FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
983 wide_int cst;
985 if (TREE_CODE (elt->value) != INTEGER_CST)
986 return type;
988 cst = elt->value;
989 while (1)
991 unsigned int prec = GET_MODE_BITSIZE (mode);
992 if (prec > HOST_BITS_PER_WIDE_INT)
993 return type;
995 if (sign >= 0 && cst == wi::zext (cst, prec))
997 if (sign == 0 && cst == wi::sext (cst, prec))
998 break;
999 sign = 1;
1000 break;
1002 if (sign <= 0 && cst == wi::sext (cst, prec))
1004 sign = -1;
1005 break;
1008 if (sign == 1)
1009 sign = 0;
1011 mode = GET_MODE_WIDER_MODE (mode);
1012 if (mode == VOIDmode
1013 || GET_MODE_SIZE (mode) >= GET_MODE_SIZE (TYPE_MODE (type)))
1014 return type;
1018 if (sign == 0)
1019 sign = TYPE_UNSIGNED (type) ? 1 : -1;
1020 smaller_type = lang_hooks.types.type_for_mode (mode, sign >= 0);
1021 if (GET_MODE_SIZE (TYPE_MODE (type))
1022 <= GET_MODE_SIZE (TYPE_MODE (smaller_type)))
1023 return type;
1025 return smaller_type;
1028 /* Create an appropriate array type and declaration and assemble a static array
1029 variable. Also create a load statement that initializes the variable in
1030 question with a value from the static array. SWTCH is the switch statement
1031 being converted, NUM is the index to arrays of constructors, default values
1032 and target SSA names for this particular array. ARR_INDEX_TYPE is the type
1033 of the index of the new array, PHI is the phi node of the final BB that
1034 corresponds to the value that will be loaded from the created array. TIDX
1035 is an ssa name of a temporary variable holding the index for loads from the
1036 new array. */
1038 static void
1039 build_one_array (gimple swtch, int num, tree arr_index_type, gimple phi,
1040 tree tidx, struct switch_conv_info *info)
1042 tree name, cst;
1043 gimple load;
1044 gimple_stmt_iterator gsi = gsi_for_stmt (swtch);
1045 location_t loc = gimple_location (swtch);
1047 gcc_assert (info->default_values[num]);
1049 name = copy_ssa_name (PHI_RESULT (phi), NULL);
1050 info->target_inbound_names[num] = name;
1052 cst = constructor_contains_same_values_p (info->constructors[num]);
1053 if (cst)
1054 load = gimple_build_assign (name, cst);
1055 else
1057 tree array_type, ctor, decl, value_type, fetch, default_type;
1059 default_type = TREE_TYPE (info->default_values[num]);
1060 value_type = array_value_type (swtch, default_type, num, info);
1061 array_type = build_array_type (value_type, arr_index_type);
1062 if (default_type != value_type)
1064 unsigned int i;
1065 constructor_elt *elt;
1067 FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
1068 elt->value = fold_convert (value_type, elt->value);
1070 ctor = build_constructor (array_type, info->constructors[num]);
1071 TREE_CONSTANT (ctor) = true;
1072 TREE_STATIC (ctor) = true;
1074 decl = build_decl (loc, VAR_DECL, NULL_TREE, array_type);
1075 TREE_STATIC (decl) = 1;
1076 DECL_INITIAL (decl) = ctor;
1078 DECL_NAME (decl) = create_tmp_var_name ("CSWTCH");
1079 DECL_ARTIFICIAL (decl) = 1;
1080 TREE_CONSTANT (decl) = 1;
1081 TREE_READONLY (decl) = 1;
1082 varpool_node::finalize_decl (decl);
1084 fetch = build4 (ARRAY_REF, value_type, decl, tidx, NULL_TREE,
1085 NULL_TREE);
1086 if (default_type != value_type)
1088 fetch = fold_convert (default_type, fetch);
1089 fetch = force_gimple_operand_gsi (&gsi, fetch, true, NULL_TREE,
1090 true, GSI_SAME_STMT);
1092 load = gimple_build_assign (name, fetch);
1095 gsi_insert_before (&gsi, load, GSI_SAME_STMT);
1096 update_stmt (load);
1097 info->arr_ref_last = load;
1100 /* Builds and initializes static arrays initialized with values gathered from
1101 the SWTCH switch statement. Also creates statements that load values from
1102 them. */
1104 static void
1105 build_arrays (gimple swtch, struct switch_conv_info *info)
1107 tree arr_index_type;
1108 tree tidx, sub, utype;
1109 gimple stmt;
1110 gimple_stmt_iterator gsi;
1111 int i;
1112 location_t loc = gimple_location (swtch);
1114 gsi = gsi_for_stmt (swtch);
1116 /* Make sure we do not generate arithmetics in a subrange. */
1117 utype = TREE_TYPE (info->index_expr);
1118 if (TREE_TYPE (utype))
1119 utype = lang_hooks.types.type_for_mode (TYPE_MODE (TREE_TYPE (utype)), 1);
1120 else
1121 utype = lang_hooks.types.type_for_mode (TYPE_MODE (utype), 1);
1123 arr_index_type = build_index_type (info->range_size);
1124 tidx = make_ssa_name (utype, NULL);
1125 sub = fold_build2_loc (loc, MINUS_EXPR, utype,
1126 fold_convert_loc (loc, utype, info->index_expr),
1127 fold_convert_loc (loc, utype, info->range_min));
1128 sub = force_gimple_operand_gsi (&gsi, sub,
1129 false, NULL, true, GSI_SAME_STMT);
1130 stmt = gimple_build_assign (tidx, sub);
1132 gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
1133 update_stmt (stmt);
1134 info->arr_ref_first = stmt;
1136 for (gsi = gsi_start_phis (info->final_bb), i = 0;
1137 !gsi_end_p (gsi); gsi_next (&gsi), i++)
1138 build_one_array (swtch, i, arr_index_type, gsi_stmt (gsi), tidx, info);
1141 /* Generates and appropriately inserts loads of default values at the position
1142 given by BSI. Returns the last inserted statement. */
1144 static gimple
1145 gen_def_assigns (gimple_stmt_iterator *gsi, struct switch_conv_info *info)
1147 int i;
1148 gimple assign = NULL;
1150 for (i = 0; i < info->phi_count; i++)
1152 tree name = copy_ssa_name (info->target_inbound_names[i], NULL);
1153 info->target_outbound_names[i] = name;
1154 assign = gimple_build_assign (name, info->default_values[i]);
1155 gsi_insert_before (gsi, assign, GSI_SAME_STMT);
1156 update_stmt (assign);
1158 return assign;
1161 /* Deletes the unused bbs and edges that now contain the switch statement and
1162 its empty branch bbs. BBD is the now dead BB containing the original switch
1163 statement, FINAL is the last BB of the converted switch statement (in terms
1164 of succession). */
1166 static void
1167 prune_bbs (basic_block bbd, basic_block final)
1169 edge_iterator ei;
1170 edge e;
1172 for (ei = ei_start (bbd->succs); (e = ei_safe_edge (ei)); )
1174 basic_block bb;
1175 bb = e->dest;
1176 remove_edge (e);
1177 if (bb != final)
1178 delete_basic_block (bb);
1180 delete_basic_block (bbd);
1183 /* Add values to phi nodes in final_bb for the two new edges. E1F is the edge
1184 from the basic block loading values from an array and E2F from the basic
1185 block loading default values. BBF is the last switch basic block (see the
1186 bbf description in the comment below). */
1188 static void
1189 fix_phi_nodes (edge e1f, edge e2f, basic_block bbf,
1190 struct switch_conv_info *info)
1192 gimple_stmt_iterator gsi;
1193 int i;
1195 for (gsi = gsi_start_phis (bbf), i = 0;
1196 !gsi_end_p (gsi); gsi_next (&gsi), i++)
1198 gimple phi = gsi_stmt (gsi);
1199 add_phi_arg (phi, info->target_inbound_names[i], e1f, UNKNOWN_LOCATION);
1200 add_phi_arg (phi, info->target_outbound_names[i], e2f, UNKNOWN_LOCATION);
1204 /* Creates a check whether the switch expression value actually falls into the
1205 range given by all the cases. If it does not, the temporaries are loaded
1206 with default values instead. SWTCH is the switch statement being converted.
1208 bb0 is the bb with the switch statement, however, we'll end it with a
1209 condition instead.
1211 bb1 is the bb to be used when the range check went ok. It is derived from
1212 the switch BB
1214 bb2 is the bb taken when the expression evaluated outside of the range
1215 covered by the created arrays. It is populated by loads of default
1216 values.
1218 bbF is a fall through for both bb1 and bb2 and contains exactly what
1219 originally followed the switch statement.
1221 bbD contains the switch statement (in the end). It is unreachable but we
1222 still need to strip off its edges.
1225 static void
1226 gen_inbound_check (gimple swtch, struct switch_conv_info *info)
1228 tree label_decl1 = create_artificial_label (UNKNOWN_LOCATION);
1229 tree label_decl2 = create_artificial_label (UNKNOWN_LOCATION);
1230 tree label_decl3 = create_artificial_label (UNKNOWN_LOCATION);
1231 gimple label1, label2, label3;
1232 tree utype, tidx;
1233 tree bound;
1235 gimple cond_stmt;
1237 gimple last_assign;
1238 gimple_stmt_iterator gsi;
1239 basic_block bb0, bb1, bb2, bbf, bbd;
1240 edge e01, e02, e21, e1d, e1f, e2f;
1241 location_t loc = gimple_location (swtch);
1243 gcc_assert (info->default_values);
1245 bb0 = gimple_bb (swtch);
1247 tidx = gimple_assign_lhs (info->arr_ref_first);
1248 utype = TREE_TYPE (tidx);
1250 /* (end of) block 0 */
1251 gsi = gsi_for_stmt (info->arr_ref_first);
1252 gsi_next (&gsi);
1254 bound = fold_convert_loc (loc, utype, info->range_size);
1255 cond_stmt = gimple_build_cond (LE_EXPR, tidx, bound, NULL_TREE, NULL_TREE);
1256 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1257 update_stmt (cond_stmt);
1259 /* block 2 */
1260 label2 = gimple_build_label (label_decl2);
1261 gsi_insert_before (&gsi, label2, GSI_SAME_STMT);
1262 last_assign = gen_def_assigns (&gsi, info);
1264 /* block 1 */
1265 label1 = gimple_build_label (label_decl1);
1266 gsi_insert_before (&gsi, label1, GSI_SAME_STMT);
1268 /* block F */
1269 gsi = gsi_start_bb (info->final_bb);
1270 label3 = gimple_build_label (label_decl3);
1271 gsi_insert_before (&gsi, label3, GSI_SAME_STMT);
1273 /* cfg fix */
1274 e02 = split_block (bb0, cond_stmt);
1275 bb2 = e02->dest;
1277 e21 = split_block (bb2, last_assign);
1278 bb1 = e21->dest;
1279 remove_edge (e21);
1281 e1d = split_block (bb1, info->arr_ref_last);
1282 bbd = e1d->dest;
1283 remove_edge (e1d);
1285 /* flags and profiles of the edge for in-range values */
1286 e01 = make_edge (bb0, bb1, EDGE_TRUE_VALUE);
1287 e01->probability = REG_BR_PROB_BASE - info->default_prob;
1288 e01->count = info->other_count;
1290 /* flags and profiles of the edge taking care of out-of-range values */
1291 e02->flags &= ~EDGE_FALLTHRU;
1292 e02->flags |= EDGE_FALSE_VALUE;
1293 e02->probability = info->default_prob;
1294 e02->count = info->default_count;
1296 bbf = info->final_bb;
1298 e1f = make_edge (bb1, bbf, EDGE_FALLTHRU);
1299 e1f->probability = REG_BR_PROB_BASE;
1300 e1f->count = info->other_count;
1302 e2f = make_edge (bb2, bbf, EDGE_FALLTHRU);
1303 e2f->probability = REG_BR_PROB_BASE;
1304 e2f->count = info->default_count;
1306 /* frequencies of the new BBs */
1307 bb1->frequency = EDGE_FREQUENCY (e01);
1308 bb2->frequency = EDGE_FREQUENCY (e02);
1309 bbf->frequency = EDGE_FREQUENCY (e1f) + EDGE_FREQUENCY (e2f);
1311 /* Tidy blocks that have become unreachable. */
1312 prune_bbs (bbd, info->final_bb);
1314 /* Fixup the PHI nodes in bbF. */
1315 fix_phi_nodes (e1f, e2f, bbf, info);
1317 /* Fix the dominator tree, if it is available. */
1318 if (dom_info_available_p (CDI_DOMINATORS))
1320 vec<basic_block> bbs_to_fix_dom;
1322 set_immediate_dominator (CDI_DOMINATORS, bb1, bb0);
1323 set_immediate_dominator (CDI_DOMINATORS, bb2, bb0);
1324 if (! get_immediate_dominator (CDI_DOMINATORS, bbf))
1325 /* If bbD was the immediate dominator ... */
1326 set_immediate_dominator (CDI_DOMINATORS, bbf, bb0);
1328 bbs_to_fix_dom.create (4);
1329 bbs_to_fix_dom.quick_push (bb0);
1330 bbs_to_fix_dom.quick_push (bb1);
1331 bbs_to_fix_dom.quick_push (bb2);
1332 bbs_to_fix_dom.quick_push (bbf);
1334 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
1335 bbs_to_fix_dom.release ();
1339 /* The following function is invoked on every switch statement (the current one
1340 is given in SWTCH) and runs the individual phases of switch conversion on it
1341 one after another until one fails or the conversion is completed.
1342 Returns NULL on success, or a pointer to a string with the reason why the
1343 conversion failed. */
1345 static const char *
1346 process_switch (gimple swtch)
1348 struct switch_conv_info info;
1350 /* Group case labels so that we get the right results from the heuristics
1351 that decide on the code generation approach for this switch. */
1352 group_case_labels_stmt (swtch);
1354 /* If this switch is now a degenerate case with only a default label,
1355 there is nothing left for us to do. */
1356 if (gimple_switch_num_labels (swtch) < 2)
1357 return "switch is a degenerate case";
1359 collect_switch_conv_info (swtch, &info);
1361 /* No error markers should reach here (they should be filtered out
1362 during gimplification). */
1363 gcc_checking_assert (TREE_TYPE (info.index_expr) != error_mark_node);
1365 /* A switch on a constant should have been optimized in tree-cfg-cleanup. */
1366 gcc_checking_assert (! TREE_CONSTANT (info.index_expr));
1368 if (info.uniq <= MAX_CASE_BIT_TESTS)
1370 if (expand_switch_using_bit_tests_p (info.range_size,
1371 info.uniq, info.count,
1372 optimize_bb_for_speed_p
1373 (gimple_bb (swtch))))
1375 if (dump_file)
1376 fputs (" expanding as bit test is preferable\n", dump_file);
1377 emit_case_bit_tests (swtch, info.index_expr, info.range_min,
1378 info.range_size, info.range_max);
1379 loops_state_set (LOOPS_NEED_FIXUP);
1380 return NULL;
1383 if (info.uniq <= 2)
1384 /* This will be expanded as a decision tree in stmt.c:expand_case. */
1385 return " expanding as jumps is preferable";
1388 /* If there is no common successor, we cannot do the transformation. */
1389 if (! info.final_bb)
1390 return "no common successor to all case label target blocks found";
1392 /* Check the case label values are within reasonable range: */
1393 if (!check_range (&info))
1395 gcc_assert (info.reason);
1396 return info.reason;
1399 /* For all the cases, see whether they are empty, the assignments they
1400 represent constant and so on... */
1401 if (! check_all_empty_except_final (&info))
1403 gcc_assert (info.reason);
1404 return info.reason;
1406 if (!check_final_bb (&info))
1408 gcc_assert (info.reason);
1409 return info.reason;
1412 /* At this point all checks have passed and we can proceed with the
1413 transformation. */
1415 create_temp_arrays (&info);
1416 gather_default_values (gimple_switch_default_label (swtch), &info);
1417 build_constructors (swtch, &info);
1419 build_arrays (swtch, &info); /* Build the static arrays and assignments. */
1420 gen_inbound_check (swtch, &info); /* Build the bounds check. */
1422 /* Cleanup: */
1423 free_temp_arrays (&info);
1424 return NULL;
1427 /* The main function of the pass scans statements for switches and invokes
1428 process_switch on them. */
1430 namespace {
1432 const pass_data pass_data_convert_switch =
1434 GIMPLE_PASS, /* type */
1435 "switchconv", /* name */
1436 OPTGROUP_NONE, /* optinfo_flags */
1437 TV_TREE_SWITCH_CONVERSION, /* tv_id */
1438 ( PROP_cfg | PROP_ssa ), /* properties_required */
1439 0, /* properties_provided */
1440 0, /* properties_destroyed */
1441 0, /* todo_flags_start */
1442 TODO_update_ssa, /* todo_flags_finish */
1445 class pass_convert_switch : public gimple_opt_pass
1447 public:
1448 pass_convert_switch (gcc::context *ctxt)
1449 : gimple_opt_pass (pass_data_convert_switch, ctxt)
1452 /* opt_pass methods: */
1453 virtual bool gate (function *) { return flag_tree_switch_conversion != 0; }
1454 virtual unsigned int execute (function *);
1456 }; // class pass_convert_switch
1458 unsigned int
1459 pass_convert_switch::execute (function *fun)
1461 basic_block bb;
1463 FOR_EACH_BB_FN (bb, fun)
1465 const char *failure_reason;
1466 gimple stmt = last_stmt (bb);
1467 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
1469 if (dump_file)
1471 expanded_location loc = expand_location (gimple_location (stmt));
1473 fprintf (dump_file, "beginning to process the following "
1474 "SWITCH statement (%s:%d) : ------- \n",
1475 loc.file, loc.line);
1476 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1477 putc ('\n', dump_file);
1480 failure_reason = process_switch (stmt);
1481 if (! failure_reason)
1483 if (dump_file)
1485 fputs ("Switch converted\n", dump_file);
1486 fputs ("--------------------------------\n", dump_file);
1489 /* Make no effort to update the post-dominator tree. It is actually not
1490 that hard for the transformations we have performed, but it is not
1491 supported by iterate_fix_dominators. */
1492 free_dominance_info (CDI_POST_DOMINATORS);
1494 else
1496 if (dump_file)
1498 fputs ("Bailing out - ", dump_file);
1499 fputs (failure_reason, dump_file);
1500 fputs ("\n--------------------------------\n", dump_file);
1506 return 0;
1509 } // anon namespace
1511 gimple_opt_pass *
1512 make_pass_convert_switch (gcc::context *ctxt)
1514 return new pass_convert_switch (ctxt);