cuintp.c (UI_From_gnu): Use tree_to_shwi rather than tree_low_cst.
[platform/upstream/gcc.git] / gcc / tree-switch-conversion.c
1 /* Lower GIMPLE_SWITCH expressions to something more efficient than
2    a jump table.
3    Copyright (C) 2006-2013 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
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.
11
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.
16
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.  */
21
22 /* This file handles the lowering of GIMPLE_SWITCH to an indexed
23    load, or a series of bit-test-and-branch expressions.  */
24
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 "basic-block.h"
34 #include "gimple.h"
35 #include "gimplify.h"
36 #include "gimple-iterator.h"
37 #include "gimplify-me.h"
38 #include "gimple-ssa.h"
39 #include "cgraph.h"
40 #include "tree-cfg.h"
41 #include "tree-phinodes.h"
42 #include "tree-ssanames.h"
43 #include "tree-pass.h"
44 #include "gimple-pretty-print.h"
45 #include "cfgloop.h"
46
47 /* ??? For lang_hooks.types.type_for_mode, but is there a word_mode
48    type in the GIMPLE type system that is language-independent?  */
49 #include "langhooks.h"
50
51 /* Need to include expr.h and optabs.h for lshift_cheap_p.  */
52 #include "expr.h"
53 #include "optabs.h"
54 \f
55 /* Maximum number of case bit tests.
56    FIXME: This should be derived from PARAM_CASE_VALUES_THRESHOLD and
57           targetm.case_values_threshold(), or be its own param.  */
58 #define MAX_CASE_BIT_TESTS  3
59
60 /* Split the basic block at the statement pointed to by GSIP, and insert
61    a branch to the target basic block of E_TRUE conditional on tree
62    expression COND.
63
64    It is assumed that there is already an edge from the to-be-split
65    basic block to E_TRUE->dest block.  This edge is removed, and the
66    profile information on the edge is re-used for the new conditional
67    jump.
68    
69    The CFG is updated.  The dominator tree will not be valid after
70    this transformation, but the immediate dominators are updated if
71    UPDATE_DOMINATORS is true.
72    
73    Returns the newly created basic block.  */
74
75 static basic_block
76 hoist_edge_and_branch_if_true (gimple_stmt_iterator *gsip,
77                                tree cond, edge e_true,
78                                bool update_dominators)
79 {
80   tree tmp;
81   gimple cond_stmt;
82   edge e_false;
83   basic_block new_bb, split_bb = gsi_bb (*gsip);
84   bool dominated_e_true = false;
85
86   gcc_assert (e_true->src == split_bb);
87
88   if (update_dominators
89       && get_immediate_dominator (CDI_DOMINATORS, e_true->dest) == split_bb)
90     dominated_e_true = true;
91
92   tmp = force_gimple_operand_gsi (gsip, cond, /*simple=*/true, NULL,
93                                   /*before=*/true, GSI_SAME_STMT);
94   cond_stmt = gimple_build_cond_from_tree (tmp, NULL_TREE, NULL_TREE);
95   gsi_insert_before (gsip, cond_stmt, GSI_SAME_STMT);
96
97   e_false = split_block (split_bb, cond_stmt);
98   new_bb = e_false->dest;
99   redirect_edge_pred (e_true, split_bb);
100
101   e_true->flags &= ~EDGE_FALLTHRU;
102   e_true->flags |= EDGE_TRUE_VALUE;
103
104   e_false->flags &= ~EDGE_FALLTHRU;
105   e_false->flags |= EDGE_FALSE_VALUE;
106   e_false->probability = REG_BR_PROB_BASE - e_true->probability;
107   e_false->count = split_bb->count - e_true->count;
108   new_bb->count = e_false->count;
109
110   if (update_dominators)
111     {
112       if (dominated_e_true)
113         set_immediate_dominator (CDI_DOMINATORS, e_true->dest, split_bb);
114       set_immediate_dominator (CDI_DOMINATORS, e_false->dest, split_bb);
115     }
116
117   return new_bb;
118 }
119
120
121 /* Determine whether "1 << x" is relatively cheap in word_mode.  */
122 /* FIXME: This is the function that we need rtl.h and optabs.h for.
123    This function (and similar RTL-related cost code in e.g. IVOPTS) should
124    be moved to some kind of interface file for GIMPLE/RTL interactions.  */
125 static bool
126 lshift_cheap_p (void)
127 {
128   /* FIXME: This should be made target dependent via this "this_target"
129      mechanism, similar to e.g. can_copy_init_p in gcse.c.  */
130   static bool init[2] = {false, false};
131   static bool cheap[2] = {true, true};
132   bool speed_p;
133
134   /* If the targer has no lshift in word_mode, the operation will most
135      probably not be cheap.  ??? Does GCC even work for such targets?  */
136   if (optab_handler (ashl_optab, word_mode) == CODE_FOR_nothing)
137     return false;
138
139   speed_p = optimize_insn_for_speed_p ();
140
141   if (!init[speed_p])
142     {
143       rtx reg = gen_raw_REG (word_mode, 10000);
144       int cost = set_src_cost (gen_rtx_ASHIFT (word_mode, const1_rtx, reg),
145                                speed_p);
146       cheap[speed_p] = cost < COSTS_N_INSNS (MAX_CASE_BIT_TESTS);
147       init[speed_p] = true;
148     }
149
150   return cheap[speed_p];
151 }
152
153 /* Return true if a switch should be expanded as a bit test.
154    RANGE is the difference between highest and lowest case.
155    UNIQ is number of unique case node targets, not counting the default case.
156    COUNT is the number of comparisons needed, not counting the default case.  */
157
158 static bool
159 expand_switch_using_bit_tests_p (tree range,
160                                  unsigned int uniq,
161                                  unsigned int count)
162 {
163   return (((uniq == 1 && count >= 3)
164            || (uniq == 2 && count >= 5)
165            || (uniq == 3 && count >= 6))
166           && lshift_cheap_p ()
167           && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0
168           && compare_tree_int (range, 0) > 0);
169 }
170 \f
171 /* Implement switch statements with bit tests
172
173 A GIMPLE switch statement can be expanded to a short sequence of bit-wise
174 comparisons.  "switch(x)" is converted into "if ((1 << (x-MINVAL)) & CST)"
175 where CST and MINVAL are integer constants.  This is better than a series
176 of compare-and-banch insns in some cases,  e.g. we can implement:
177
178         if ((x==4) || (x==6) || (x==9) || (x==11))
179
180 as a single bit test:
181
182         if ((1<<x) & ((1<<4)|(1<<6)|(1<<9)|(1<<11)))
183
184 This transformation is only applied if the number of case targets is small,
185 if CST constains at least 3 bits, and "1 << x" is cheap.  The bit tests are
186 performed in "word_mode".
187
188 The following example shows the code the transformation generates:
189
190         int bar(int x)
191         {
192                 switch (x)
193                 {
194                 case '0':  case '1':  case '2':  case '3':  case '4':
195                 case '5':  case '6':  case '7':  case '8':  case '9':
196                 case 'A':  case 'B':  case 'C':  case 'D':  case 'E':
197                 case 'F':
198                         return 1;
199                 }
200                 return 0;
201         }
202
203 ==>
204
205         bar (int x)
206         {
207                 tmp1 = x - 48;
208                 if (tmp1 > (70 - 48)) goto L2;
209                 tmp2 = 1 << tmp1;
210                 tmp3 = 0b11111100000001111111111;
211                 if ((tmp2 & tmp3) != 0) goto L1 ; else goto L2;
212         L1:
213                 return 1;
214         L2:
215                 return 0;
216         }
217
218 TODO: There are still some improvements to this transformation that could
219 be implemented:
220
221 * A narrower mode than word_mode could be used if that is cheaper, e.g.
222   for x86_64 where a narrower-mode shift may result in smaller code.
223
224 * The compounded constant could be shifted rather than the one.  The
225   test would be either on the sign bit or on the least significant bit,
226   depending on the direction of the shift.  On some machines, the test
227   for the branch would be free if the bit to test is already set by the
228   shift operation.
229
230 This transformation was contributed by Roger Sayle, see this e-mail:
231    http://gcc.gnu.org/ml/gcc-patches/2003-01/msg01950.html
232 */
233
234 /* A case_bit_test represents a set of case nodes that may be
235    selected from using a bit-wise comparison.  HI and LO hold
236    the integer to be tested against, TARGET_EDGE contains the
237    edge to the basic block to jump to upon success and BITS
238    counts the number of case nodes handled by this test,
239    typically the number of bits set in HI:LO.  The LABEL field
240    is used to quickly identify all cases in this set without
241    looking at label_to_block for every case label.  */
242
243 struct case_bit_test
244 {
245   HOST_WIDE_INT hi;
246   HOST_WIDE_INT lo;
247   edge target_edge;
248   tree label;
249   int bits;
250 };
251
252 /* Comparison function for qsort to order bit tests by decreasing
253    probability of execution.  Our best guess comes from a measured
254    profile.  If the profile counts are equal, break even on the
255    number of case nodes, i.e. the node with the most cases gets
256    tested first.
257
258    TODO: Actually this currently runs before a profile is available.
259    Therefore the case-as-bit-tests transformation should be done
260    later in the pass pipeline, or something along the lines of
261    "Efficient and effective branch reordering using profile data"
262    (Yang et. al., 2002) should be implemented (although, how good
263    is a paper is called "Efficient and effective ..." when the
264    latter is implied by the former, but oh well...).  */
265
266 static int
267 case_bit_test_cmp (const void *p1, const void *p2)
268 {
269   const struct case_bit_test *const d1 = (const struct case_bit_test *) p1;
270   const struct case_bit_test *const d2 = (const struct case_bit_test *) p2;
271
272   if (d2->target_edge->count != d1->target_edge->count)
273     return d2->target_edge->count - d1->target_edge->count;
274   if (d2->bits != d1->bits)
275     return d2->bits - d1->bits;
276
277   /* Stabilize the sort.  */
278   return LABEL_DECL_UID (d2->label) - LABEL_DECL_UID (d1->label);
279 }
280
281 /*  Expand a switch statement by a short sequence of bit-wise
282     comparisons.  "switch(x)" is effectively converted into
283     "if ((1 << (x-MINVAL)) & CST)" where CST and MINVAL are
284     integer constants.
285
286     INDEX_EXPR is the value being switched on.
287
288     MINVAL is the lowest case value of in the case nodes,
289     and RANGE is highest value minus MINVAL.  MINVAL and RANGE
290     are not guaranteed to be of the same type as INDEX_EXPR
291     (the gimplifier doesn't change the type of case label values,
292     and MINVAL and RANGE are derived from those values).
293
294     There *MUST* be MAX_CASE_BIT_TESTS or less unique case
295     node targets.  */
296
297 static void
298 emit_case_bit_tests (gimple swtch, tree index_expr,
299                      tree minval, tree range)
300 {
301   struct case_bit_test test[MAX_CASE_BIT_TESTS];
302   unsigned int i, j, k;
303   unsigned int count;
304
305   basic_block switch_bb = gimple_bb (swtch);
306   basic_block default_bb, new_default_bb, new_bb;
307   edge default_edge;
308   bool update_dom = dom_info_available_p (CDI_DOMINATORS);
309
310   vec<basic_block> bbs_to_fix_dom = vNULL;
311
312   tree index_type = TREE_TYPE (index_expr);
313   tree unsigned_index_type = unsigned_type_for (index_type);
314   unsigned int branch_num = gimple_switch_num_labels (swtch);
315
316   gimple_stmt_iterator gsi;
317   gimple shift_stmt;
318
319   tree idx, tmp, csui;
320   tree word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
321   tree word_mode_zero = fold_convert (word_type_node, integer_zero_node);
322   tree word_mode_one = fold_convert (word_type_node, integer_one_node);
323
324   memset (&test, 0, sizeof (test));
325
326   /* Get the edge for the default case.  */
327   tmp = gimple_switch_default_label (swtch);
328   default_bb = label_to_block (CASE_LABEL (tmp));
329   default_edge = find_edge (switch_bb, default_bb);
330
331   /* Go through all case labels, and collect the case labels, profile
332      counts, and other information we need to build the branch tests.  */
333   count = 0;
334   for (i = 1; i < branch_num; i++)
335     {
336       unsigned int lo, hi;
337       tree cs = gimple_switch_label (swtch, i);
338       tree label = CASE_LABEL (cs);
339       edge e = find_edge (switch_bb, label_to_block (label));
340       for (k = 0; k < count; k++)
341         if (e == test[k].target_edge)
342           break;
343
344       if (k == count)
345         {
346           gcc_checking_assert (count < MAX_CASE_BIT_TESTS);
347           test[k].hi = 0;
348           test[k].lo = 0;
349           test[k].target_edge = e;
350           test[k].label = label;
351           test[k].bits = 1;
352           count++;
353         }
354       else
355         test[k].bits++;
356
357       lo = tree_to_uhwi (int_const_binop (MINUS_EXPR,
358                                           CASE_LOW (cs), minval));
359       if (CASE_HIGH (cs) == NULL_TREE)
360         hi = lo;
361       else
362         hi = tree_to_uhwi (int_const_binop (MINUS_EXPR,
363                                             CASE_HIGH (cs), minval));
364
365       for (j = lo; j <= hi; j++)
366         if (j >= HOST_BITS_PER_WIDE_INT)
367           test[k].hi |= (HOST_WIDE_INT) 1 << (j - HOST_BITS_PER_INT);
368         else
369           test[k].lo |= (HOST_WIDE_INT) 1 << j;
370     }
371
372   qsort (test, count, sizeof (*test), case_bit_test_cmp);
373
374   /* We generate two jumps to the default case label.
375      Split the default edge, so that we don't have to do any PHI node
376      updating.  */
377   new_default_bb = split_edge (default_edge);
378
379   if (update_dom)
380     {
381       bbs_to_fix_dom.create (10);
382       bbs_to_fix_dom.quick_push (switch_bb);
383       bbs_to_fix_dom.quick_push (default_bb);
384       bbs_to_fix_dom.quick_push (new_default_bb);
385     }
386
387   /* Now build the test-and-branch code.  */
388
389   gsi = gsi_last_bb (switch_bb);
390
391   /* idx = (unsigned)x - minval.  */
392   idx = fold_convert (unsigned_index_type, index_expr);
393   idx = fold_build2 (MINUS_EXPR, unsigned_index_type, idx,
394                      fold_convert (unsigned_index_type, minval));
395   idx = force_gimple_operand_gsi (&gsi, idx,
396                                   /*simple=*/true, NULL_TREE,
397                                   /*before=*/true, GSI_SAME_STMT);
398
399   /* if (idx > range) goto default */
400   range = force_gimple_operand_gsi (&gsi,
401                                     fold_convert (unsigned_index_type, range),
402                                     /*simple=*/true, NULL_TREE,
403                                     /*before=*/true, GSI_SAME_STMT);
404   tmp = fold_build2 (GT_EXPR, boolean_type_node, idx, range);
405   new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, default_edge, update_dom);
406   if (update_dom)
407     bbs_to_fix_dom.quick_push (new_bb);
408   gcc_assert (gimple_bb (swtch) == new_bb);
409   gsi = gsi_last_bb (new_bb);
410
411   /* Any blocks dominated by the GIMPLE_SWITCH, but that are not successors
412      of NEW_BB, are still immediately dominated by SWITCH_BB.  Make it so.  */
413   if (update_dom)
414     {
415       vec<basic_block> dom_bbs;
416       basic_block dom_son;
417
418       dom_bbs = get_dominated_by (CDI_DOMINATORS, new_bb);
419       FOR_EACH_VEC_ELT (dom_bbs, i, dom_son)
420         {
421           edge e = find_edge (new_bb, dom_son);
422           if (e && single_pred_p (e->dest))
423             continue;
424           set_immediate_dominator (CDI_DOMINATORS, dom_son, switch_bb);
425           bbs_to_fix_dom.safe_push (dom_son);
426         }
427       dom_bbs.release ();
428     }
429
430   /* csui = (1 << (word_mode) idx) */
431   csui = make_ssa_name (word_type_node, NULL);
432   tmp = fold_build2 (LSHIFT_EXPR, word_type_node, word_mode_one,
433                      fold_convert (word_type_node, idx));
434   tmp = force_gimple_operand_gsi (&gsi, tmp,
435                                   /*simple=*/false, NULL_TREE,
436                                   /*before=*/true, GSI_SAME_STMT);
437   shift_stmt = gimple_build_assign (csui, tmp);
438   gsi_insert_before (&gsi, shift_stmt, GSI_SAME_STMT);
439   update_stmt (shift_stmt);
440
441   /* for each unique set of cases:
442         if (const & csui) goto target  */
443   for (k = 0; k < count; k++)
444     {
445       tmp = build_int_cst_wide (word_type_node, test[k].lo, test[k].hi);
446       tmp = fold_build2 (BIT_AND_EXPR, word_type_node, csui, tmp);
447       tmp = force_gimple_operand_gsi (&gsi, tmp,
448                                       /*simple=*/true, NULL_TREE,
449                                       /*before=*/true, GSI_SAME_STMT);
450       tmp = fold_build2 (NE_EXPR, boolean_type_node, tmp, word_mode_zero);
451       new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, test[k].target_edge,
452                                               update_dom);
453       if (update_dom)
454         bbs_to_fix_dom.safe_push (new_bb);
455       gcc_assert (gimple_bb (swtch) == new_bb);
456       gsi = gsi_last_bb (new_bb);
457     }
458
459   /* We should have removed all edges now.  */
460   gcc_assert (EDGE_COUNT (gsi_bb (gsi)->succs) == 0);
461
462   /* If nothing matched, go to the default label.  */
463   make_edge (gsi_bb (gsi), new_default_bb, EDGE_FALLTHRU);
464
465   /* The GIMPLE_SWITCH is now redundant.  */
466   gsi_remove (&gsi, true);
467
468   if (update_dom)
469     {
470       /* Fix up the dominator tree.  */
471       iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
472       bbs_to_fix_dom.release ();
473     }
474 }
475 \f
476 /*
477      Switch initialization conversion
478
479 The following pass changes simple initializations of scalars in a switch
480 statement into initializations from a static array.  Obviously, the values
481 must be constant and known at compile time and a default branch must be
482 provided.  For example, the following code:
483
484         int a,b;
485
486         switch (argc)
487         {
488          case 1:
489          case 2:
490                 a_1 = 8;
491                 b_1 = 6;
492                 break;
493          case 3:
494                 a_2 = 9;
495                 b_2 = 5;
496                 break;
497          case 12:
498                 a_3 = 10;
499                 b_3 = 4;
500                 break;
501          default:
502                 a_4 = 16;
503                 b_4 = 1;
504                 break;
505         }
506         a_5 = PHI <a_1, a_2, a_3, a_4>
507         b_5 = PHI <b_1, b_2, b_3, b_4>
508
509
510 is changed into:
511
512         static const int = CSWTCH01[] = {6, 6, 5, 1, 1, 1, 1, 1, 1, 1, 1, 4};
513         static const int = CSWTCH02[] = {8, 8, 9, 16, 16, 16, 16, 16, 16, 16,
514                                  16, 16, 10};
515
516         if (((unsigned) argc) - 1 < 11)
517           {
518             a_6 = CSWTCH02[argc - 1];
519             b_6 = CSWTCH01[argc - 1];
520           }
521         else
522           {
523             a_7 = 16;
524             b_7 = 1;
525           }
526         a_5 = PHI <a_6, a_7>
527         b_b = PHI <b_6, b_7>
528
529 There are further constraints.  Specifically, the range of values across all
530 case labels must not be bigger than SWITCH_CONVERSION_BRANCH_RATIO (default
531 eight) times the number of the actual switch branches.
532
533 This transformation was contributed by Martin Jambor, see this e-mail:
534    http://gcc.gnu.org/ml/gcc-patches/2008-07/msg00011.html  */
535
536 /* The main structure of the pass.  */
537 struct switch_conv_info
538 {
539   /* The expression used to decide the switch branch.  */
540   tree index_expr;
541
542   /* The following integer constants store the minimum and maximum value
543      covered by the case labels.  */
544   tree range_min;
545   tree range_max;
546
547   /* The difference between the above two numbers.  Stored here because it
548      is used in all the conversion heuristics, as well as for some of the
549      transformation, and it is expensive to re-compute it all the time.  */
550   tree range_size;
551
552   /* Basic block that contains the actual GIMPLE_SWITCH.  */
553   basic_block switch_bb;
554
555   /* Basic block that is the target of the default case.  */
556   basic_block default_bb;
557
558   /* The single successor block of all branches out of the GIMPLE_SWITCH,
559      if such a block exists.  Otherwise NULL.  */
560   basic_block final_bb;
561
562   /* The probability of the default edge in the replaced switch.  */
563   int default_prob;
564
565   /* The count of the default edge in the replaced switch.  */
566   gcov_type default_count;
567
568   /* Combined count of all other (non-default) edges in the replaced switch.  */
569   gcov_type other_count;
570
571   /* Number of phi nodes in the final bb (that we'll be replacing).  */
572   int phi_count;
573
574   /* Array of default values, in the same order as phi nodes.  */
575   tree *default_values;
576
577   /* Constructors of new static arrays.  */
578   vec<constructor_elt, va_gc> **constructors;
579
580   /* Array of ssa names that are initialized with a value from a new static
581      array.  */
582   tree *target_inbound_names;
583
584   /* Array of ssa names that are initialized with the default value if the
585      switch expression is out of range.  */
586   tree *target_outbound_names;
587
588   /* The first load statement that loads a temporary from a new static array.
589    */
590   gimple arr_ref_first;
591
592   /* The last load statement that loads a temporary from a new static array.  */
593   gimple arr_ref_last;
594
595   /* String reason why the case wasn't a good candidate that is written to the
596      dump file, if there is one.  */
597   const char *reason;
598
599   /* Parameters for expand_switch_using_bit_tests.  Should be computed
600      the same way as in expand_case.  */
601   unsigned int uniq;
602   unsigned int count;
603 };
604
605 /* Collect information about GIMPLE_SWITCH statement SWTCH into INFO.  */
606
607 static void
608 collect_switch_conv_info (gimple swtch, struct switch_conv_info *info)
609 {
610   unsigned int branch_num = gimple_switch_num_labels (swtch);
611   tree min_case, max_case;
612   unsigned int count, i;
613   edge e, e_default;
614   edge_iterator ei;
615
616   memset (info, 0, sizeof (*info));
617
618   /* The gimplifier has already sorted the cases by CASE_LOW and ensured there
619      is a default label which is the first in the vector.
620      Collect the bits we can deduce from the CFG.  */
621   info->index_expr = gimple_switch_index (swtch);
622   info->switch_bb = gimple_bb (swtch);
623   info->default_bb =
624     label_to_block (CASE_LABEL (gimple_switch_default_label (swtch)));
625   e_default = find_edge (info->switch_bb, info->default_bb);
626   info->default_prob = e_default->probability;
627   info->default_count = e_default->count;
628   FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
629     if (e != e_default)
630       info->other_count += e->count;
631
632   /* See if there is one common successor block for all branch
633      targets.  If it exists, record it in FINAL_BB.  */
634   FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
635     {
636       if (! single_pred_p (e->dest))
637         {
638           info->final_bb = e->dest;
639           break;
640         }
641     }
642   if (info->final_bb)
643     FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
644       {
645         if (e->dest == info->final_bb)
646           continue;
647
648         if (single_pred_p (e->dest)
649             && single_succ_p (e->dest)
650             && single_succ (e->dest) == info->final_bb)
651           continue;
652
653         info->final_bb = NULL;
654         break;
655       }
656
657   /* Get upper and lower bounds of case values, and the covered range.  */
658   min_case = gimple_switch_label (swtch, 1);
659   max_case = gimple_switch_label (swtch, branch_num - 1);
660
661   info->range_min = CASE_LOW (min_case);
662   if (CASE_HIGH (max_case) != NULL_TREE)
663     info->range_max = CASE_HIGH (max_case);
664   else
665     info->range_max = CASE_LOW (max_case);
666
667   info->range_size =
668     int_const_binop (MINUS_EXPR, info->range_max, info->range_min);
669
670   /* Get a count of the number of case labels.  Single-valued case labels
671      simply count as one, but a case range counts double, since it may
672      require two compares if it gets lowered as a branching tree.  */
673   count = 0;
674   for (i = 1; i < branch_num; i++)
675     {
676       tree elt = gimple_switch_label (swtch, i);
677       count++;
678       if (CASE_HIGH (elt)
679           && ! tree_int_cst_equal (CASE_LOW (elt), CASE_HIGH (elt)))
680         count++;
681     }
682   info->count = count;
683  
684   /* Get the number of unique non-default targets out of the GIMPLE_SWITCH
685      block.  Assume a CFG cleanup would have already removed degenerate
686      switch statements, this allows us to just use EDGE_COUNT.  */
687   info->uniq = EDGE_COUNT (gimple_bb (swtch)->succs) - 1;
688 }
689
690 /* Checks whether the range given by individual case statements of the SWTCH
691    switch statement isn't too big and whether the number of branches actually
692    satisfies the size of the new array.  */
693
694 static bool
695 check_range (struct switch_conv_info *info)
696 {
697   gcc_assert (info->range_size);
698   if (!tree_fits_uhwi_p (info->range_size))
699     {
700       info->reason = "index range way too large or otherwise unusable";
701       return false;
702     }
703
704   if ((unsigned HOST_WIDE_INT) tree_to_uhwi (info->range_size)
705       > ((unsigned) info->count * SWITCH_CONVERSION_BRANCH_RATIO))
706     {
707       info->reason = "the maximum range-branch ratio exceeded";
708       return false;
709     }
710
711   return true;
712 }
713
714 /* Checks whether all but the FINAL_BB basic blocks are empty.  */
715
716 static bool
717 check_all_empty_except_final (struct switch_conv_info *info)
718 {
719   edge e;
720   edge_iterator ei;
721
722   FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
723     {
724       if (e->dest == info->final_bb)
725         continue;
726
727       if (!empty_block_p (e->dest))
728         {
729           info->reason = "bad case - a non-final BB not empty";
730           return false;
731         }
732     }
733
734   return true;
735 }
736
737 /* This function checks whether all required values in phi nodes in final_bb
738    are constants.  Required values are those that correspond to a basic block
739    which is a part of the examined switch statement.  It returns true if the
740    phi nodes are OK, otherwise false.  */
741
742 static bool
743 check_final_bb (struct switch_conv_info *info)
744 {
745   gimple_stmt_iterator gsi;
746
747   info->phi_count = 0;
748   for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
749     {
750       gimple phi = gsi_stmt (gsi);
751       unsigned int i;
752
753       info->phi_count++;
754
755       for (i = 0; i < gimple_phi_num_args (phi); i++)
756         {
757           basic_block bb = gimple_phi_arg_edge (phi, i)->src;
758
759           if (bb == info->switch_bb
760               || (single_pred_p (bb) && single_pred (bb) == info->switch_bb))
761             {
762               tree reloc, val;
763
764               val = gimple_phi_arg_def (phi, i);
765               if (!is_gimple_ip_invariant (val))
766                 {
767                   info->reason = "non-invariant value from a case";
768                   return false; /* Non-invariant argument.  */
769                 }
770               reloc = initializer_constant_valid_p (val, TREE_TYPE (val));
771               if ((flag_pic && reloc != null_pointer_node)
772                   || (!flag_pic && reloc == NULL_TREE))
773                 {
774                   if (reloc)
775                     info->reason
776                       = "value from a case would need runtime relocations";
777                   else
778                     info->reason
779                       = "value from a case is not a valid initializer";
780                   return false;
781                 }
782             }
783         }
784     }
785
786   return true;
787 }
788
789 /* The following function allocates default_values, target_{in,out}_names and
790    constructors arrays.  The last one is also populated with pointers to
791    vectors that will become constructors of new arrays.  */
792
793 static void
794 create_temp_arrays (struct switch_conv_info *info)
795 {
796   int i;
797
798   info->default_values = XCNEWVEC (tree, info->phi_count * 3);
799   /* ??? Macros do not support multi argument templates in their
800      argument list.  We create a typedef to work around that problem.  */
801   typedef vec<constructor_elt, va_gc> *vec_constructor_elt_gc;
802   info->constructors = XCNEWVEC (vec_constructor_elt_gc, info->phi_count);
803   info->target_inbound_names = info->default_values + info->phi_count;
804   info->target_outbound_names = info->target_inbound_names + info->phi_count;
805   for (i = 0; i < info->phi_count; i++)
806     vec_alloc (info->constructors[i], tree_to_uhwi (info->range_size) + 1);
807 }
808
809 /* Free the arrays created by create_temp_arrays().  The vectors that are
810    created by that function are not freed here, however, because they have
811    already become constructors and must be preserved.  */
812
813 static void
814 free_temp_arrays (struct switch_conv_info *info)
815 {
816   XDELETEVEC (info->constructors);
817   XDELETEVEC (info->default_values);
818 }
819
820 /* Populate the array of default values in the order of phi nodes.
821    DEFAULT_CASE is the CASE_LABEL_EXPR for the default switch branch.  */
822
823 static void
824 gather_default_values (tree default_case, struct switch_conv_info *info)
825 {
826   gimple_stmt_iterator gsi;
827   basic_block bb = label_to_block (CASE_LABEL (default_case));
828   edge e;
829   int i = 0;
830
831   gcc_assert (CASE_LOW (default_case) == NULL_TREE);
832
833   if (bb == info->final_bb)
834     e = find_edge (info->switch_bb, bb);
835   else
836     e = single_succ_edge (bb);
837
838   for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
839     {
840       gimple phi = gsi_stmt (gsi);
841       tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
842       gcc_assert (val);
843       info->default_values[i++] = val;
844     }
845 }
846
847 /* The following function populates the vectors in the constructors array with
848    future contents of the static arrays.  The vectors are populated in the
849    order of phi nodes.  SWTCH is the switch statement being converted.  */
850
851 static void
852 build_constructors (gimple swtch, struct switch_conv_info *info)
853 {
854   unsigned i, branch_num = gimple_switch_num_labels (swtch);
855   tree pos = info->range_min;
856
857   for (i = 1; i < branch_num; i++)
858     {
859       tree cs = gimple_switch_label (swtch, i);
860       basic_block bb = label_to_block (CASE_LABEL (cs));
861       edge e;
862       tree high;
863       gimple_stmt_iterator gsi;
864       int j;
865
866       if (bb == info->final_bb)
867         e = find_edge (info->switch_bb, bb);
868       else
869         e = single_succ_edge (bb);
870       gcc_assert (e);
871
872       while (tree_int_cst_lt (pos, CASE_LOW (cs)))
873         {
874           int k;
875           for (k = 0; k < info->phi_count; k++)
876             {
877               constructor_elt elt;
878
879               elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
880               elt.value
881                 = unshare_expr_without_location (info->default_values[k]);
882               info->constructors[k]->quick_push (elt);
883             }
884
885           pos = int_const_binop (PLUS_EXPR, pos, integer_one_node);
886         }
887       gcc_assert (tree_int_cst_equal (pos, CASE_LOW (cs)));
888
889       j = 0;
890       if (CASE_HIGH (cs))
891         high = CASE_HIGH (cs);
892       else
893         high = CASE_LOW (cs);
894       for (gsi = gsi_start_phis (info->final_bb);
895            !gsi_end_p (gsi); gsi_next (&gsi))
896         {
897           gimple phi = gsi_stmt (gsi);
898           tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
899           tree low = CASE_LOW (cs);
900           pos = CASE_LOW (cs);
901
902           do
903             {
904               constructor_elt elt;
905
906               elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
907               elt.value = unshare_expr_without_location (val);
908               info->constructors[j]->quick_push (elt);
909
910               pos = int_const_binop (PLUS_EXPR, pos, integer_one_node);
911             } while (!tree_int_cst_lt (high, pos)
912                      && tree_int_cst_lt (low, pos));
913           j++;
914         }
915     }
916 }
917
918 /* If all values in the constructor vector are the same, return the value.
919    Otherwise return NULL_TREE.  Not supposed to be called for empty
920    vectors.  */
921
922 static tree
923 constructor_contains_same_values_p (vec<constructor_elt, va_gc> *vec)
924 {
925   unsigned int i;
926   tree prev = NULL_TREE;
927   constructor_elt *elt;
928
929   FOR_EACH_VEC_SAFE_ELT (vec, i, elt)
930     {
931       if (!prev)
932         prev = elt->value;
933       else if (!operand_equal_p (elt->value, prev, OEP_ONLY_CONST))
934         return NULL_TREE;
935     }
936   return prev;
937 }
938
939 /* Return type which should be used for array elements, either TYPE,
940    or for integral type some smaller integral type that can still hold
941    all the constants.  */
942
943 static tree
944 array_value_type (gimple swtch, tree type, int num,
945                   struct switch_conv_info *info)
946 {
947   unsigned int i, len = vec_safe_length (info->constructors[num]);
948   constructor_elt *elt;
949   enum machine_mode mode;
950   int sign = 0;
951   tree smaller_type;
952
953   if (!INTEGRAL_TYPE_P (type))
954     return type;
955
956   mode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (TYPE_MODE (type)));
957   if (GET_MODE_SIZE (TYPE_MODE (type)) <= GET_MODE_SIZE (mode))
958     return type;
959
960   if (len < (optimize_bb_for_size_p (gimple_bb (swtch)) ? 2 : 32))
961     return type;
962
963   FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
964     {
965       double_int cst;
966
967       if (TREE_CODE (elt->value) != INTEGER_CST)
968         return type;
969
970       cst = TREE_INT_CST (elt->value);
971       while (1)
972         {
973           unsigned int prec = GET_MODE_BITSIZE (mode);
974           if (prec > HOST_BITS_PER_WIDE_INT)
975             return type;
976
977           if (sign >= 0 && cst == cst.zext (prec))
978             {
979               if (sign == 0 && cst == cst.sext (prec))
980                 break;
981               sign = 1;
982               break;
983             }
984           if (sign <= 0 && cst == cst.sext (prec))
985             {
986               sign = -1;
987               break;
988             }
989
990           if (sign == 1)
991             sign = 0;
992
993           mode = GET_MODE_WIDER_MODE (mode);
994           if (mode == VOIDmode
995               || GET_MODE_SIZE (mode) >= GET_MODE_SIZE (TYPE_MODE (type)))
996             return type;
997         }
998     }
999
1000   if (sign == 0)
1001     sign = TYPE_UNSIGNED (type) ? 1 : -1;
1002   smaller_type = lang_hooks.types.type_for_mode (mode, sign >= 0);
1003   if (GET_MODE_SIZE (TYPE_MODE (type))
1004       <= GET_MODE_SIZE (TYPE_MODE (smaller_type)))
1005     return type;
1006
1007   return smaller_type;
1008 }
1009
1010 /* Create an appropriate array type and declaration and assemble a static array
1011    variable.  Also create a load statement that initializes the variable in
1012    question with a value from the static array.  SWTCH is the switch statement
1013    being converted, NUM is the index to arrays of constructors, default values
1014    and target SSA names for this particular array.  ARR_INDEX_TYPE is the type
1015    of the index of the new array, PHI is the phi node of the final BB that
1016    corresponds to the value that will be loaded from the created array.  TIDX
1017    is an ssa name of a temporary variable holding the index for loads from the
1018    new array.  */
1019
1020 static void
1021 build_one_array (gimple swtch, int num, tree arr_index_type, gimple phi,
1022                  tree tidx, struct switch_conv_info *info)
1023 {
1024   tree name, cst;
1025   gimple load;
1026   gimple_stmt_iterator gsi = gsi_for_stmt (swtch);
1027   location_t loc = gimple_location (swtch);
1028
1029   gcc_assert (info->default_values[num]);
1030
1031   name = copy_ssa_name (PHI_RESULT (phi), NULL);
1032   info->target_inbound_names[num] = name;
1033
1034   cst = constructor_contains_same_values_p (info->constructors[num]);
1035   if (cst)
1036     load = gimple_build_assign (name, cst);
1037   else
1038     {
1039       tree array_type, ctor, decl, value_type, fetch, default_type;
1040
1041       default_type = TREE_TYPE (info->default_values[num]);
1042       value_type = array_value_type (swtch, default_type, num, info);
1043       array_type = build_array_type (value_type, arr_index_type);
1044       if (default_type != value_type)
1045         {
1046           unsigned int i;
1047           constructor_elt *elt;
1048
1049           FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
1050             elt->value = fold_convert (value_type, elt->value);
1051         }
1052       ctor = build_constructor (array_type, info->constructors[num]);
1053       TREE_CONSTANT (ctor) = true;
1054       TREE_STATIC (ctor) = true;
1055
1056       decl = build_decl (loc, VAR_DECL, NULL_TREE, array_type);
1057       TREE_STATIC (decl) = 1;
1058       DECL_INITIAL (decl) = ctor;
1059
1060       DECL_NAME (decl) = create_tmp_var_name ("CSWTCH");
1061       DECL_ARTIFICIAL (decl) = 1;
1062       TREE_CONSTANT (decl) = 1;
1063       TREE_READONLY (decl) = 1;
1064       varpool_finalize_decl (decl);
1065
1066       fetch = build4 (ARRAY_REF, value_type, decl, tidx, NULL_TREE,
1067                       NULL_TREE);
1068       if (default_type != value_type)
1069         {
1070           fetch = fold_convert (default_type, fetch);
1071           fetch = force_gimple_operand_gsi (&gsi, fetch, true, NULL_TREE,
1072                                             true, GSI_SAME_STMT);
1073         }
1074       load = gimple_build_assign (name, fetch);
1075     }
1076
1077   gsi_insert_before (&gsi, load, GSI_SAME_STMT);
1078   update_stmt (load);
1079   info->arr_ref_last = load;
1080 }
1081
1082 /* Builds and initializes static arrays initialized with values gathered from
1083    the SWTCH switch statement.  Also creates statements that load values from
1084    them.  */
1085
1086 static void
1087 build_arrays (gimple swtch, struct switch_conv_info *info)
1088 {
1089   tree arr_index_type;
1090   tree tidx, sub, utype;
1091   gimple stmt;
1092   gimple_stmt_iterator gsi;
1093   int i;
1094   location_t loc = gimple_location (swtch);
1095
1096   gsi = gsi_for_stmt (swtch);
1097
1098   /* Make sure we do not generate arithmetics in a subrange.  */
1099   utype = TREE_TYPE (info->index_expr);
1100   if (TREE_TYPE (utype))
1101     utype = lang_hooks.types.type_for_mode (TYPE_MODE (TREE_TYPE (utype)), 1);
1102   else
1103     utype = lang_hooks.types.type_for_mode (TYPE_MODE (utype), 1);
1104
1105   arr_index_type = build_index_type (info->range_size);
1106   tidx = make_ssa_name (utype, NULL);
1107   sub = fold_build2_loc (loc, MINUS_EXPR, utype,
1108                          fold_convert_loc (loc, utype, info->index_expr),
1109                          fold_convert_loc (loc, utype, info->range_min));
1110   sub = force_gimple_operand_gsi (&gsi, sub,
1111                                   false, NULL, true, GSI_SAME_STMT);
1112   stmt = gimple_build_assign (tidx, sub);
1113
1114   gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
1115   update_stmt (stmt);
1116   info->arr_ref_first = stmt;
1117
1118   for (gsi = gsi_start_phis (info->final_bb), i = 0;
1119        !gsi_end_p (gsi); gsi_next (&gsi), i++)
1120     build_one_array (swtch, i, arr_index_type, gsi_stmt (gsi), tidx, info);
1121 }
1122
1123 /* Generates and appropriately inserts loads of default values at the position
1124    given by BSI.  Returns the last inserted statement.  */
1125
1126 static gimple
1127 gen_def_assigns (gimple_stmt_iterator *gsi, struct switch_conv_info *info)
1128 {
1129   int i;
1130   gimple assign = NULL;
1131
1132   for (i = 0; i < info->phi_count; i++)
1133     {
1134       tree name = copy_ssa_name (info->target_inbound_names[i], NULL);
1135       info->target_outbound_names[i] = name;
1136       assign = gimple_build_assign (name, info->default_values[i]);
1137       gsi_insert_before (gsi, assign, GSI_SAME_STMT);
1138       update_stmt (assign);
1139     }
1140   return assign;
1141 }
1142
1143 /* Deletes the unused bbs and edges that now contain the switch statement and
1144    its empty branch bbs.  BBD is the now dead BB containing the original switch
1145    statement, FINAL is the last BB of the converted switch statement (in terms
1146    of succession).  */
1147
1148 static void
1149 prune_bbs (basic_block bbd, basic_block final)
1150 {
1151   edge_iterator ei;
1152   edge e;
1153
1154   for (ei = ei_start (bbd->succs); (e = ei_safe_edge (ei)); )
1155     {
1156       basic_block bb;
1157       bb = e->dest;
1158       remove_edge (e);
1159       if (bb != final)
1160         delete_basic_block (bb);
1161     }
1162   delete_basic_block (bbd);
1163 }
1164
1165 /* Add values to phi nodes in final_bb for the two new edges.  E1F is the edge
1166    from the basic block loading values from an array and E2F from the basic
1167    block loading default values.  BBF is the last switch basic block (see the
1168    bbf description in the comment below).  */
1169
1170 static void
1171 fix_phi_nodes (edge e1f, edge e2f, basic_block bbf,
1172                struct switch_conv_info *info)
1173 {
1174   gimple_stmt_iterator gsi;
1175   int i;
1176
1177   for (gsi = gsi_start_phis (bbf), i = 0;
1178        !gsi_end_p (gsi); gsi_next (&gsi), i++)
1179     {
1180       gimple phi = gsi_stmt (gsi);
1181       add_phi_arg (phi, info->target_inbound_names[i], e1f, UNKNOWN_LOCATION);
1182       add_phi_arg (phi, info->target_outbound_names[i], e2f, UNKNOWN_LOCATION);
1183     }
1184 }
1185
1186 /* Creates a check whether the switch expression value actually falls into the
1187    range given by all the cases.  If it does not, the temporaries are loaded
1188    with default values instead.  SWTCH is the switch statement being converted.
1189
1190    bb0 is the bb with the switch statement, however, we'll end it with a
1191        condition instead.
1192
1193    bb1 is the bb to be used when the range check went ok.  It is derived from
1194        the switch BB
1195
1196    bb2 is the bb taken when the expression evaluated outside of the range
1197        covered by the created arrays.  It is populated by loads of default
1198        values.
1199
1200    bbF is a fall through for both bb1 and bb2 and contains exactly what
1201        originally followed the switch statement.
1202
1203    bbD contains the switch statement (in the end).  It is unreachable but we
1204        still need to strip off its edges.
1205 */
1206
1207 static void
1208 gen_inbound_check (gimple swtch, struct switch_conv_info *info)
1209 {
1210   tree label_decl1 = create_artificial_label (UNKNOWN_LOCATION);
1211   tree label_decl2 = create_artificial_label (UNKNOWN_LOCATION);
1212   tree label_decl3 = create_artificial_label (UNKNOWN_LOCATION);
1213   gimple label1, label2, label3;
1214   tree utype, tidx;
1215   tree bound;
1216
1217   gimple cond_stmt;
1218
1219   gimple last_assign;
1220   gimple_stmt_iterator gsi;
1221   basic_block bb0, bb1, bb2, bbf, bbd;
1222   edge e01, e02, e21, e1d, e1f, e2f;
1223   location_t loc = gimple_location (swtch);
1224
1225   gcc_assert (info->default_values);
1226
1227   bb0 = gimple_bb (swtch);
1228
1229   tidx = gimple_assign_lhs (info->arr_ref_first);
1230   utype = TREE_TYPE (tidx);
1231
1232   /* (end of) block 0 */
1233   gsi = gsi_for_stmt (info->arr_ref_first);
1234   gsi_next (&gsi);
1235
1236   bound = fold_convert_loc (loc, utype, info->range_size);
1237   cond_stmt = gimple_build_cond (LE_EXPR, tidx, bound, NULL_TREE, NULL_TREE);
1238   gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1239   update_stmt (cond_stmt);
1240
1241   /* block 2 */
1242   label2 = gimple_build_label (label_decl2);
1243   gsi_insert_before (&gsi, label2, GSI_SAME_STMT);
1244   last_assign = gen_def_assigns (&gsi, info);
1245
1246   /* block 1 */
1247   label1 = gimple_build_label (label_decl1);
1248   gsi_insert_before (&gsi, label1, GSI_SAME_STMT);
1249
1250   /* block F */
1251   gsi = gsi_start_bb (info->final_bb);
1252   label3 = gimple_build_label (label_decl3);
1253   gsi_insert_before (&gsi, label3, GSI_SAME_STMT);
1254
1255   /* cfg fix */
1256   e02 = split_block (bb0, cond_stmt);
1257   bb2 = e02->dest;
1258
1259   e21 = split_block (bb2, last_assign);
1260   bb1 = e21->dest;
1261   remove_edge (e21);
1262
1263   e1d = split_block (bb1, info->arr_ref_last);
1264   bbd = e1d->dest;
1265   remove_edge (e1d);
1266
1267   /* flags and profiles of the edge for in-range values */
1268   e01 = make_edge (bb0, bb1, EDGE_TRUE_VALUE);
1269   e01->probability = REG_BR_PROB_BASE - info->default_prob;
1270   e01->count = info->other_count;
1271
1272   /* flags and profiles of the edge taking care of out-of-range values */
1273   e02->flags &= ~EDGE_FALLTHRU;
1274   e02->flags |= EDGE_FALSE_VALUE;
1275   e02->probability = info->default_prob;
1276   e02->count = info->default_count;
1277
1278   bbf = info->final_bb;
1279
1280   e1f = make_edge (bb1, bbf, EDGE_FALLTHRU);
1281   e1f->probability = REG_BR_PROB_BASE;
1282   e1f->count = info->other_count;
1283
1284   e2f = make_edge (bb2, bbf, EDGE_FALLTHRU);
1285   e2f->probability = REG_BR_PROB_BASE;
1286   e2f->count = info->default_count;
1287
1288   /* frequencies of the new BBs */
1289   bb1->frequency = EDGE_FREQUENCY (e01);
1290   bb2->frequency = EDGE_FREQUENCY (e02);
1291   bbf->frequency = EDGE_FREQUENCY (e1f) + EDGE_FREQUENCY (e2f);
1292
1293   /* Tidy blocks that have become unreachable.  */
1294   prune_bbs (bbd, info->final_bb);
1295
1296   /* Fixup the PHI nodes in bbF.  */
1297   fix_phi_nodes (e1f, e2f, bbf, info);
1298
1299   /* Fix the dominator tree, if it is available.  */
1300   if (dom_info_available_p (CDI_DOMINATORS))
1301     {
1302       vec<basic_block> bbs_to_fix_dom;
1303
1304       set_immediate_dominator (CDI_DOMINATORS, bb1, bb0);
1305       set_immediate_dominator (CDI_DOMINATORS, bb2, bb0);
1306       if (! get_immediate_dominator (CDI_DOMINATORS, bbf))
1307         /* If bbD was the immediate dominator ...  */
1308         set_immediate_dominator (CDI_DOMINATORS, bbf, bb0);
1309
1310       bbs_to_fix_dom.create (4);
1311       bbs_to_fix_dom.quick_push (bb0);
1312       bbs_to_fix_dom.quick_push (bb1);
1313       bbs_to_fix_dom.quick_push (bb2);
1314       bbs_to_fix_dom.quick_push (bbf);
1315
1316       iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
1317       bbs_to_fix_dom.release ();
1318     }
1319 }
1320
1321 /* The following function is invoked on every switch statement (the current one
1322    is given in SWTCH) and runs the individual phases of switch conversion on it
1323    one after another until one fails or the conversion is completed.
1324    Returns NULL on success, or a pointer to a string with the reason why the
1325    conversion failed.  */
1326
1327 static const char *
1328 process_switch (gimple swtch)
1329 {
1330   struct switch_conv_info info;
1331
1332   /* Group case labels so that we get the right results from the heuristics
1333      that decide on the code generation approach for this switch.  */
1334   group_case_labels_stmt (swtch);
1335
1336   /* If this switch is now a degenerate case with only a default label,
1337      there is nothing left for us to do.   */
1338   if (gimple_switch_num_labels (swtch) < 2)
1339     return "switch is a degenerate case";
1340
1341   collect_switch_conv_info (swtch, &info);
1342
1343   /* No error markers should reach here (they should be filtered out
1344      during gimplification).  */
1345   gcc_checking_assert (TREE_TYPE (info.index_expr) != error_mark_node);
1346
1347   /* A switch on a constant should have been optimized in tree-cfg-cleanup.  */
1348   gcc_checking_assert (! TREE_CONSTANT (info.index_expr));
1349
1350   if (info.uniq <= MAX_CASE_BIT_TESTS)
1351     {
1352       if (expand_switch_using_bit_tests_p (info.range_size,
1353                                            info.uniq, info.count))
1354         {
1355           if (dump_file)
1356             fputs ("  expanding as bit test is preferable\n", dump_file);
1357           emit_case_bit_tests (swtch, info.index_expr,
1358                                info.range_min, info.range_size);
1359           if (current_loops)
1360             loops_state_set (LOOPS_NEED_FIXUP);
1361           return NULL;
1362         }
1363
1364       if (info.uniq <= 2)
1365         /* This will be expanded as a decision tree in stmt.c:expand_case.  */
1366         return "  expanding as jumps is preferable";
1367     }
1368
1369   /* If there is no common successor, we cannot do the transformation.  */
1370   if (! info.final_bb)
1371     return "no common successor to all case label target blocks found";
1372
1373   /* Check the case label values are within reasonable range:  */
1374   if (!check_range (&info))
1375     {
1376       gcc_assert (info.reason);
1377       return info.reason;
1378     }
1379
1380   /* For all the cases, see whether they are empty, the assignments they
1381      represent constant and so on...  */
1382   if (! check_all_empty_except_final (&info))
1383     {
1384       gcc_assert (info.reason);
1385       return info.reason;
1386     }
1387   if (!check_final_bb (&info))
1388     {
1389       gcc_assert (info.reason);
1390       return info.reason;
1391     }
1392
1393   /* At this point all checks have passed and we can proceed with the
1394      transformation.  */
1395
1396   create_temp_arrays (&info);
1397   gather_default_values (gimple_switch_default_label (swtch), &info);
1398   build_constructors (swtch, &info);
1399
1400   build_arrays (swtch, &info); /* Build the static arrays and assignments.   */
1401   gen_inbound_check (swtch, &info);     /* Build the bounds check.  */
1402
1403   /* Cleanup:  */
1404   free_temp_arrays (&info);
1405   return NULL;
1406 }
1407
1408 /* The main function of the pass scans statements for switches and invokes
1409    process_switch on them.  */
1410
1411 static unsigned int
1412 do_switchconv (void)
1413 {
1414   basic_block bb;
1415
1416   FOR_EACH_BB (bb)
1417   {
1418     const char *failure_reason;
1419     gimple stmt = last_stmt (bb);
1420     if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
1421       {
1422         if (dump_file)
1423           {
1424             expanded_location loc = expand_location (gimple_location (stmt));
1425
1426             fprintf (dump_file, "beginning to process the following "
1427                      "SWITCH statement (%s:%d) : ------- \n",
1428                      loc.file, loc.line);
1429             print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1430             putc ('\n', dump_file);
1431           }
1432
1433         failure_reason = process_switch (stmt);
1434         if (! failure_reason)
1435           {
1436             if (dump_file)
1437               {
1438                 fputs ("Switch converted\n", dump_file);
1439                 fputs ("--------------------------------\n", dump_file);
1440               }
1441
1442             /* Make no effort to update the post-dominator tree.  It is actually not
1443                that hard for the transformations we have performed, but it is not
1444                supported by iterate_fix_dominators.  */
1445             free_dominance_info (CDI_POST_DOMINATORS);
1446           }
1447         else
1448           {
1449             if (dump_file)
1450               {
1451                 fputs ("Bailing out - ", dump_file);
1452                 fputs (failure_reason, dump_file);
1453                 fputs ("\n--------------------------------\n", dump_file);
1454               }
1455           }
1456       }
1457   }
1458
1459   return 0;
1460 }
1461
1462 /* The pass gate. */
1463
1464 static bool
1465 switchconv_gate (void)
1466 {
1467   return flag_tree_switch_conversion != 0;
1468 }
1469
1470 namespace {
1471
1472 const pass_data pass_data_convert_switch =
1473 {
1474   GIMPLE_PASS, /* type */
1475   "switchconv", /* name */
1476   OPTGROUP_NONE, /* optinfo_flags */
1477   true, /* has_gate */
1478   true, /* has_execute */
1479   TV_TREE_SWITCH_CONVERSION, /* tv_id */
1480   ( PROP_cfg | PROP_ssa ), /* properties_required */
1481   0, /* properties_provided */
1482   0, /* properties_destroyed */
1483   0, /* todo_flags_start */
1484   ( TODO_update_ssa | TODO_verify_ssa
1485     | TODO_verify_stmts
1486     | TODO_verify_flow ), /* todo_flags_finish */
1487 };
1488
1489 class pass_convert_switch : public gimple_opt_pass
1490 {
1491 public:
1492   pass_convert_switch (gcc::context *ctxt)
1493     : gimple_opt_pass (pass_data_convert_switch, ctxt)
1494   {}
1495
1496   /* opt_pass methods: */
1497   bool gate () { return switchconv_gate (); }
1498   unsigned int execute () { return do_switchconv (); }
1499
1500 }; // class pass_convert_switch
1501
1502 } // anon namespace
1503
1504 gimple_opt_pass *
1505 make_pass_convert_switch (gcc::context *ctxt)
1506 {
1507   return new pass_convert_switch (ctxt);
1508 }