gimplify-be.h: New file.
[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_low_cst (int_const_binop (MINUS_EXPR,
358                                           CASE_LOW (cs), minval),
359                          1);
360       if (CASE_HIGH (cs) == NULL_TREE)
361         hi = lo;
362       else
363         hi = tree_low_cst (int_const_binop (MINUS_EXPR, 
364                                             CASE_HIGH (cs), minval),
365                            1);
366
367       for (j = lo; j <= hi; j++)
368         if (j >= HOST_BITS_PER_WIDE_INT)
369           test[k].hi |= (HOST_WIDE_INT) 1 << (j - HOST_BITS_PER_INT);
370         else
371           test[k].lo |= (HOST_WIDE_INT) 1 << j;
372     }
373
374   qsort (test, count, sizeof (*test), case_bit_test_cmp);
375
376   /* We generate two jumps to the default case label.
377      Split the default edge, so that we don't have to do any PHI node
378      updating.  */
379   new_default_bb = split_edge (default_edge);
380
381   if (update_dom)
382     {
383       bbs_to_fix_dom.create (10);
384       bbs_to_fix_dom.quick_push (switch_bb);
385       bbs_to_fix_dom.quick_push (default_bb);
386       bbs_to_fix_dom.quick_push (new_default_bb);
387     }
388
389   /* Now build the test-and-branch code.  */
390
391   gsi = gsi_last_bb (switch_bb);
392
393   /* idx = (unsigned)x - minval.  */
394   idx = fold_convert (unsigned_index_type, index_expr);
395   idx = fold_build2 (MINUS_EXPR, unsigned_index_type, idx,
396                      fold_convert (unsigned_index_type, minval));
397   idx = force_gimple_operand_gsi (&gsi, idx,
398                                   /*simple=*/true, NULL_TREE,
399                                   /*before=*/true, GSI_SAME_STMT);
400
401   /* if (idx > range) goto default */
402   range = force_gimple_operand_gsi (&gsi,
403                                     fold_convert (unsigned_index_type, range),
404                                     /*simple=*/true, NULL_TREE,
405                                     /*before=*/true, GSI_SAME_STMT);
406   tmp = fold_build2 (GT_EXPR, boolean_type_node, idx, range);
407   new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, default_edge, update_dom);
408   if (update_dom)
409     bbs_to_fix_dom.quick_push (new_bb);
410   gcc_assert (gimple_bb (swtch) == new_bb);
411   gsi = gsi_last_bb (new_bb);
412
413   /* Any blocks dominated by the GIMPLE_SWITCH, but that are not successors
414      of NEW_BB, are still immediately dominated by SWITCH_BB.  Make it so.  */
415   if (update_dom)
416     {
417       vec<basic_block> dom_bbs;
418       basic_block dom_son;
419
420       dom_bbs = get_dominated_by (CDI_DOMINATORS, new_bb);
421       FOR_EACH_VEC_ELT (dom_bbs, i, dom_son)
422         {
423           edge e = find_edge (new_bb, dom_son);
424           if (e && single_pred_p (e->dest))
425             continue;
426           set_immediate_dominator (CDI_DOMINATORS, dom_son, switch_bb);
427           bbs_to_fix_dom.safe_push (dom_son);
428         }
429       dom_bbs.release ();
430     }
431
432   /* csui = (1 << (word_mode) idx) */
433   csui = make_ssa_name (word_type_node, NULL);
434   tmp = fold_build2 (LSHIFT_EXPR, word_type_node, word_mode_one,
435                      fold_convert (word_type_node, idx));
436   tmp = force_gimple_operand_gsi (&gsi, tmp,
437                                   /*simple=*/false, NULL_TREE,
438                                   /*before=*/true, GSI_SAME_STMT);
439   shift_stmt = gimple_build_assign (csui, tmp);
440   gsi_insert_before (&gsi, shift_stmt, GSI_SAME_STMT);
441   update_stmt (shift_stmt);
442
443   /* for each unique set of cases:
444         if (const & csui) goto target  */
445   for (k = 0; k < count; k++)
446     {
447       tmp = build_int_cst_wide (word_type_node, test[k].lo, test[k].hi);
448       tmp = fold_build2 (BIT_AND_EXPR, word_type_node, csui, tmp);
449       tmp = force_gimple_operand_gsi (&gsi, tmp,
450                                       /*simple=*/true, NULL_TREE,
451                                       /*before=*/true, GSI_SAME_STMT);
452       tmp = fold_build2 (NE_EXPR, boolean_type_node, tmp, word_mode_zero);
453       new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, test[k].target_edge,
454                                               update_dom);
455       if (update_dom)
456         bbs_to_fix_dom.safe_push (new_bb);
457       gcc_assert (gimple_bb (swtch) == new_bb);
458       gsi = gsi_last_bb (new_bb);
459     }
460
461   /* We should have removed all edges now.  */
462   gcc_assert (EDGE_COUNT (gsi_bb (gsi)->succs) == 0);
463
464   /* If nothing matched, go to the default label.  */
465   make_edge (gsi_bb (gsi), new_default_bb, EDGE_FALLTHRU);
466
467   /* The GIMPLE_SWITCH is now redundant.  */
468   gsi_remove (&gsi, true);
469
470   if (update_dom)
471     {
472       /* Fix up the dominator tree.  */
473       iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
474       bbs_to_fix_dom.release ();
475     }
476 }
477 \f
478 /*
479      Switch initialization conversion
480
481 The following pass changes simple initializations of scalars in a switch
482 statement into initializations from a static array.  Obviously, the values
483 must be constant and known at compile time and a default branch must be
484 provided.  For example, the following code:
485
486         int a,b;
487
488         switch (argc)
489         {
490          case 1:
491          case 2:
492                 a_1 = 8;
493                 b_1 = 6;
494                 break;
495          case 3:
496                 a_2 = 9;
497                 b_2 = 5;
498                 break;
499          case 12:
500                 a_3 = 10;
501                 b_3 = 4;
502                 break;
503          default:
504                 a_4 = 16;
505                 b_4 = 1;
506                 break;
507         }
508         a_5 = PHI <a_1, a_2, a_3, a_4>
509         b_5 = PHI <b_1, b_2, b_3, b_4>
510
511
512 is changed into:
513
514         static const int = CSWTCH01[] = {6, 6, 5, 1, 1, 1, 1, 1, 1, 1, 1, 4};
515         static const int = CSWTCH02[] = {8, 8, 9, 16, 16, 16, 16, 16, 16, 16,
516                                  16, 16, 10};
517
518         if (((unsigned) argc) - 1 < 11)
519           {
520             a_6 = CSWTCH02[argc - 1];
521             b_6 = CSWTCH01[argc - 1];
522           }
523         else
524           {
525             a_7 = 16;
526             b_7 = 1;
527           }
528         a_5 = PHI <a_6, a_7>
529         b_b = PHI <b_6, b_7>
530
531 There are further constraints.  Specifically, the range of values across all
532 case labels must not be bigger than SWITCH_CONVERSION_BRANCH_RATIO (default
533 eight) times the number of the actual switch branches.
534
535 This transformation was contributed by Martin Jambor, see this e-mail:
536    http://gcc.gnu.org/ml/gcc-patches/2008-07/msg00011.html  */
537
538 /* The main structure of the pass.  */
539 struct switch_conv_info
540 {
541   /* The expression used to decide the switch branch.  */
542   tree index_expr;
543
544   /* The following integer constants store the minimum and maximum value
545      covered by the case labels.  */
546   tree range_min;
547   tree range_max;
548
549   /* The difference between the above two numbers.  Stored here because it
550      is used in all the conversion heuristics, as well as for some of the
551      transformation, and it is expensive to re-compute it all the time.  */
552   tree range_size;
553
554   /* Basic block that contains the actual GIMPLE_SWITCH.  */
555   basic_block switch_bb;
556
557   /* Basic block that is the target of the default case.  */
558   basic_block default_bb;
559
560   /* The single successor block of all branches out of the GIMPLE_SWITCH,
561      if such a block exists.  Otherwise NULL.  */
562   basic_block final_bb;
563
564   /* The probability of the default edge in the replaced switch.  */
565   int default_prob;
566
567   /* The count of the default edge in the replaced switch.  */
568   gcov_type default_count;
569
570   /* Combined count of all other (non-default) edges in the replaced switch.  */
571   gcov_type other_count;
572
573   /* Number of phi nodes in the final bb (that we'll be replacing).  */
574   int phi_count;
575
576   /* Array of default values, in the same order as phi nodes.  */
577   tree *default_values;
578
579   /* Constructors of new static arrays.  */
580   vec<constructor_elt, va_gc> **constructors;
581
582   /* Array of ssa names that are initialized with a value from a new static
583      array.  */
584   tree *target_inbound_names;
585
586   /* Array of ssa names that are initialized with the default value if the
587      switch expression is out of range.  */
588   tree *target_outbound_names;
589
590   /* The first load statement that loads a temporary from a new static array.
591    */
592   gimple arr_ref_first;
593
594   /* The last load statement that loads a temporary from a new static array.  */
595   gimple arr_ref_last;
596
597   /* String reason why the case wasn't a good candidate that is written to the
598      dump file, if there is one.  */
599   const char *reason;
600
601   /* Parameters for expand_switch_using_bit_tests.  Should be computed
602      the same way as in expand_case.  */
603   unsigned int uniq;
604   unsigned int count;
605 };
606
607 /* Collect information about GIMPLE_SWITCH statement SWTCH into INFO.  */
608
609 static void
610 collect_switch_conv_info (gimple swtch, struct switch_conv_info *info)
611 {
612   unsigned int branch_num = gimple_switch_num_labels (swtch);
613   tree min_case, max_case;
614   unsigned int count, i;
615   edge e, e_default;
616   edge_iterator ei;
617
618   memset (info, 0, sizeof (*info));
619
620   /* The gimplifier has already sorted the cases by CASE_LOW and ensured there
621      is a default label which is the first in the vector.
622      Collect the bits we can deduce from the CFG.  */
623   info->index_expr = gimple_switch_index (swtch);
624   info->switch_bb = gimple_bb (swtch);
625   info->default_bb =
626     label_to_block (CASE_LABEL (gimple_switch_default_label (swtch)));
627   e_default = find_edge (info->switch_bb, info->default_bb);
628   info->default_prob = e_default->probability;
629   info->default_count = e_default->count;
630   FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
631     if (e != e_default)
632       info->other_count += e->count;
633
634   /* See if there is one common successor block for all branch
635      targets.  If it exists, record it in FINAL_BB.  */
636   FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
637     {
638       if (! single_pred_p (e->dest))
639         {
640           info->final_bb = e->dest;
641           break;
642         }
643     }
644   if (info->final_bb)
645     FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
646       {
647         if (e->dest == info->final_bb)
648           continue;
649
650         if (single_pred_p (e->dest)
651             && single_succ_p (e->dest)
652             && single_succ (e->dest) == info->final_bb)
653           continue;
654
655         info->final_bb = NULL;
656         break;
657       }
658
659   /* Get upper and lower bounds of case values, and the covered range.  */
660   min_case = gimple_switch_label (swtch, 1);
661   max_case = gimple_switch_label (swtch, branch_num - 1);
662
663   info->range_min = CASE_LOW (min_case);
664   if (CASE_HIGH (max_case) != NULL_TREE)
665     info->range_max = CASE_HIGH (max_case);
666   else
667     info->range_max = CASE_LOW (max_case);
668
669   info->range_size =
670     int_const_binop (MINUS_EXPR, info->range_max, info->range_min);
671
672   /* Get a count of the number of case labels.  Single-valued case labels
673      simply count as one, but a case range counts double, since it may
674      require two compares if it gets lowered as a branching tree.  */
675   count = 0;
676   for (i = 1; i < branch_num; i++)
677     {
678       tree elt = gimple_switch_label (swtch, i);
679       count++;
680       if (CASE_HIGH (elt)
681           && ! tree_int_cst_equal (CASE_LOW (elt), CASE_HIGH (elt)))
682         count++;
683     }
684   info->count = count;
685  
686   /* Get the number of unique non-default targets out of the GIMPLE_SWITCH
687      block.  Assume a CFG cleanup would have already removed degenerate
688      switch statements, this allows us to just use EDGE_COUNT.  */
689   info->uniq = EDGE_COUNT (gimple_bb (swtch)->succs) - 1;
690 }
691
692 /* Checks whether the range given by individual case statements of the SWTCH
693    switch statement isn't too big and whether the number of branches actually
694    satisfies the size of the new array.  */
695
696 static bool
697 check_range (struct switch_conv_info *info)
698 {
699   gcc_assert (info->range_size);
700   if (!host_integerp (info->range_size, 1))
701     {
702       info->reason = "index range way too large or otherwise unusable";
703       return false;
704     }
705
706   if ((unsigned HOST_WIDE_INT) tree_low_cst (info->range_size, 1)
707       > ((unsigned) info->count * SWITCH_CONVERSION_BRANCH_RATIO))
708     {
709       info->reason = "the maximum range-branch ratio exceeded";
710       return false;
711     }
712
713   return true;
714 }
715
716 /* Checks whether all but the FINAL_BB basic blocks are empty.  */
717
718 static bool
719 check_all_empty_except_final (struct switch_conv_info *info)
720 {
721   edge e;
722   edge_iterator ei;
723
724   FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
725     {
726       if (e->dest == info->final_bb)
727         continue;
728
729       if (!empty_block_p (e->dest))
730         {
731           info->reason = "bad case - a non-final BB not empty";
732           return false;
733         }
734     }
735
736   return true;
737 }
738
739 /* This function checks whether all required values in phi nodes in final_bb
740    are constants.  Required values are those that correspond to a basic block
741    which is a part of the examined switch statement.  It returns true if the
742    phi nodes are OK, otherwise false.  */
743
744 static bool
745 check_final_bb (struct switch_conv_info *info)
746 {
747   gimple_stmt_iterator gsi;
748
749   info->phi_count = 0;
750   for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
751     {
752       gimple phi = gsi_stmt (gsi);
753       unsigned int i;
754
755       info->phi_count++;
756
757       for (i = 0; i < gimple_phi_num_args (phi); i++)
758         {
759           basic_block bb = gimple_phi_arg_edge (phi, i)->src;
760
761           if (bb == info->switch_bb
762               || (single_pred_p (bb) && single_pred (bb) == info->switch_bb))
763             {
764               tree reloc, val;
765
766               val = gimple_phi_arg_def (phi, i);
767               if (!is_gimple_ip_invariant (val))
768                 {
769                   info->reason = "non-invariant value from a case";
770                   return false; /* Non-invariant argument.  */
771                 }
772               reloc = initializer_constant_valid_p (val, TREE_TYPE (val));
773               if ((flag_pic && reloc != null_pointer_node)
774                   || (!flag_pic && reloc == NULL_TREE))
775                 {
776                   if (reloc)
777                     info->reason
778                       = "value from a case would need runtime relocations";
779                   else
780                     info->reason
781                       = "value from a case is not a valid initializer";
782                   return false;
783                 }
784             }
785         }
786     }
787
788   return true;
789 }
790
791 /* The following function allocates default_values, target_{in,out}_names and
792    constructors arrays.  The last one is also populated with pointers to
793    vectors that will become constructors of new arrays.  */
794
795 static void
796 create_temp_arrays (struct switch_conv_info *info)
797 {
798   int i;
799
800   info->default_values = XCNEWVEC (tree, info->phi_count * 3);
801   /* ??? Macros do not support multi argument templates in their
802      argument list.  We create a typedef to work around that problem.  */
803   typedef vec<constructor_elt, va_gc> *vec_constructor_elt_gc;
804   info->constructors = XCNEWVEC (vec_constructor_elt_gc, info->phi_count);
805   info->target_inbound_names = info->default_values + info->phi_count;
806   info->target_outbound_names = info->target_inbound_names + info->phi_count;
807   for (i = 0; i < info->phi_count; i++)
808     vec_alloc (info->constructors[i], tree_low_cst (info->range_size, 1) + 1);
809 }
810
811 /* Free the arrays created by create_temp_arrays().  The vectors that are
812    created by that function are not freed here, however, because they have
813    already become constructors and must be preserved.  */
814
815 static void
816 free_temp_arrays (struct switch_conv_info *info)
817 {
818   XDELETEVEC (info->constructors);
819   XDELETEVEC (info->default_values);
820 }
821
822 /* Populate the array of default values in the order of phi nodes.
823    DEFAULT_CASE is the CASE_LABEL_EXPR for the default switch branch.  */
824
825 static void
826 gather_default_values (tree default_case, struct switch_conv_info *info)
827 {
828   gimple_stmt_iterator gsi;
829   basic_block bb = label_to_block (CASE_LABEL (default_case));
830   edge e;
831   int i = 0;
832
833   gcc_assert (CASE_LOW (default_case) == NULL_TREE);
834
835   if (bb == info->final_bb)
836     e = find_edge (info->switch_bb, bb);
837   else
838     e = single_succ_edge (bb);
839
840   for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
841     {
842       gimple phi = gsi_stmt (gsi);
843       tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
844       gcc_assert (val);
845       info->default_values[i++] = val;
846     }
847 }
848
849 /* The following function populates the vectors in the constructors array with
850    future contents of the static arrays.  The vectors are populated in the
851    order of phi nodes.  SWTCH is the switch statement being converted.  */
852
853 static void
854 build_constructors (gimple swtch, struct switch_conv_info *info)
855 {
856   unsigned i, branch_num = gimple_switch_num_labels (swtch);
857   tree pos = info->range_min;
858
859   for (i = 1; i < branch_num; i++)
860     {
861       tree cs = gimple_switch_label (swtch, i);
862       basic_block bb = label_to_block (CASE_LABEL (cs));
863       edge e;
864       tree high;
865       gimple_stmt_iterator gsi;
866       int j;
867
868       if (bb == info->final_bb)
869         e = find_edge (info->switch_bb, bb);
870       else
871         e = single_succ_edge (bb);
872       gcc_assert (e);
873
874       while (tree_int_cst_lt (pos, CASE_LOW (cs)))
875         {
876           int k;
877           for (k = 0; k < info->phi_count; k++)
878             {
879               constructor_elt elt;
880
881               elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
882               elt.value
883                 = unshare_expr_without_location (info->default_values[k]);
884               info->constructors[k]->quick_push (elt);
885             }
886
887           pos = int_const_binop (PLUS_EXPR, pos, integer_one_node);
888         }
889       gcc_assert (tree_int_cst_equal (pos, CASE_LOW (cs)));
890
891       j = 0;
892       if (CASE_HIGH (cs))
893         high = CASE_HIGH (cs);
894       else
895         high = CASE_LOW (cs);
896       for (gsi = gsi_start_phis (info->final_bb);
897            !gsi_end_p (gsi); gsi_next (&gsi))
898         {
899           gimple phi = gsi_stmt (gsi);
900           tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
901           tree low = CASE_LOW (cs);
902           pos = CASE_LOW (cs);
903
904           do
905             {
906               constructor_elt elt;
907
908               elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
909               elt.value = unshare_expr_without_location (val);
910               info->constructors[j]->quick_push (elt);
911
912               pos = int_const_binop (PLUS_EXPR, pos, integer_one_node);
913             } while (!tree_int_cst_lt (high, pos)
914                      && tree_int_cst_lt (low, pos));
915           j++;
916         }
917     }
918 }
919
920 /* If all values in the constructor vector are the same, return the value.
921    Otherwise return NULL_TREE.  Not supposed to be called for empty
922    vectors.  */
923
924 static tree
925 constructor_contains_same_values_p (vec<constructor_elt, va_gc> *vec)
926 {
927   unsigned int i;
928   tree prev = NULL_TREE;
929   constructor_elt *elt;
930
931   FOR_EACH_VEC_SAFE_ELT (vec, i, elt)
932     {
933       if (!prev)
934         prev = elt->value;
935       else if (!operand_equal_p (elt->value, prev, OEP_ONLY_CONST))
936         return NULL_TREE;
937     }
938   return prev;
939 }
940
941 /* Return type which should be used for array elements, either TYPE,
942    or for integral type some smaller integral type that can still hold
943    all the constants.  */
944
945 static tree
946 array_value_type (gimple swtch, tree type, int num,
947                   struct switch_conv_info *info)
948 {
949   unsigned int i, len = vec_safe_length (info->constructors[num]);
950   constructor_elt *elt;
951   enum machine_mode mode;
952   int sign = 0;
953   tree smaller_type;
954
955   if (!INTEGRAL_TYPE_P (type))
956     return type;
957
958   mode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (TYPE_MODE (type)));
959   if (GET_MODE_SIZE (TYPE_MODE (type)) <= GET_MODE_SIZE (mode))
960     return type;
961
962   if (len < (optimize_bb_for_size_p (gimple_bb (swtch)) ? 2 : 32))
963     return type;
964
965   FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
966     {
967       double_int cst;
968
969       if (TREE_CODE (elt->value) != INTEGER_CST)
970         return type;
971
972       cst = TREE_INT_CST (elt->value);
973       while (1)
974         {
975           unsigned int prec = GET_MODE_BITSIZE (mode);
976           if (prec > HOST_BITS_PER_WIDE_INT)
977             return type;
978
979           if (sign >= 0 && cst == cst.zext (prec))
980             {
981               if (sign == 0 && cst == cst.sext (prec))
982                 break;
983               sign = 1;
984               break;
985             }
986           if (sign <= 0 && cst == cst.sext (prec))
987             {
988               sign = -1;
989               break;
990             }
991
992           if (sign == 1)
993             sign = 0;
994
995           mode = GET_MODE_WIDER_MODE (mode);
996           if (mode == VOIDmode
997               || GET_MODE_SIZE (mode) >= GET_MODE_SIZE (TYPE_MODE (type)))
998             return type;
999         }
1000     }
1001
1002   if (sign == 0)
1003     sign = TYPE_UNSIGNED (type) ? 1 : -1;
1004   smaller_type = lang_hooks.types.type_for_mode (mode, sign >= 0);
1005   if (GET_MODE_SIZE (TYPE_MODE (type))
1006       <= GET_MODE_SIZE (TYPE_MODE (smaller_type)))
1007     return type;
1008
1009   return smaller_type;
1010 }
1011
1012 /* Create an appropriate array type and declaration and assemble a static array
1013    variable.  Also create a load statement that initializes the variable in
1014    question with a value from the static array.  SWTCH is the switch statement
1015    being converted, NUM is the index to arrays of constructors, default values
1016    and target SSA names for this particular array.  ARR_INDEX_TYPE is the type
1017    of the index of the new array, PHI is the phi node of the final BB that
1018    corresponds to the value that will be loaded from the created array.  TIDX
1019    is an ssa name of a temporary variable holding the index for loads from the
1020    new array.  */
1021
1022 static void
1023 build_one_array (gimple swtch, int num, tree arr_index_type, gimple phi,
1024                  tree tidx, struct switch_conv_info *info)
1025 {
1026   tree name, cst;
1027   gimple load;
1028   gimple_stmt_iterator gsi = gsi_for_stmt (swtch);
1029   location_t loc = gimple_location (swtch);
1030
1031   gcc_assert (info->default_values[num]);
1032
1033   name = copy_ssa_name (PHI_RESULT (phi), NULL);
1034   info->target_inbound_names[num] = name;
1035
1036   cst = constructor_contains_same_values_p (info->constructors[num]);
1037   if (cst)
1038     load = gimple_build_assign (name, cst);
1039   else
1040     {
1041       tree array_type, ctor, decl, value_type, fetch, default_type;
1042
1043       default_type = TREE_TYPE (info->default_values[num]);
1044       value_type = array_value_type (swtch, default_type, num, info);
1045       array_type = build_array_type (value_type, arr_index_type);
1046       if (default_type != value_type)
1047         {
1048           unsigned int i;
1049           constructor_elt *elt;
1050
1051           FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
1052             elt->value = fold_convert (value_type, elt->value);
1053         }
1054       ctor = build_constructor (array_type, info->constructors[num]);
1055       TREE_CONSTANT (ctor) = true;
1056       TREE_STATIC (ctor) = true;
1057
1058       decl = build_decl (loc, VAR_DECL, NULL_TREE, array_type);
1059       TREE_STATIC (decl) = 1;
1060       DECL_INITIAL (decl) = ctor;
1061
1062       DECL_NAME (decl) = create_tmp_var_name ("CSWTCH");
1063       DECL_ARTIFICIAL (decl) = 1;
1064       TREE_CONSTANT (decl) = 1;
1065       TREE_READONLY (decl) = 1;
1066       varpool_finalize_decl (decl);
1067
1068       fetch = build4 (ARRAY_REF, value_type, decl, tidx, NULL_TREE,
1069                       NULL_TREE);
1070       if (default_type != value_type)
1071         {
1072           fetch = fold_convert (default_type, fetch);
1073           fetch = force_gimple_operand_gsi (&gsi, fetch, true, NULL_TREE,
1074                                             true, GSI_SAME_STMT);
1075         }
1076       load = gimple_build_assign (name, fetch);
1077     }
1078
1079   gsi_insert_before (&gsi, load, GSI_SAME_STMT);
1080   update_stmt (load);
1081   info->arr_ref_last = load;
1082 }
1083
1084 /* Builds and initializes static arrays initialized with values gathered from
1085    the SWTCH switch statement.  Also creates statements that load values from
1086    them.  */
1087
1088 static void
1089 build_arrays (gimple swtch, struct switch_conv_info *info)
1090 {
1091   tree arr_index_type;
1092   tree tidx, sub, utype;
1093   gimple stmt;
1094   gimple_stmt_iterator gsi;
1095   int i;
1096   location_t loc = gimple_location (swtch);
1097
1098   gsi = gsi_for_stmt (swtch);
1099
1100   /* Make sure we do not generate arithmetics in a subrange.  */
1101   utype = TREE_TYPE (info->index_expr);
1102   if (TREE_TYPE (utype))
1103     utype = lang_hooks.types.type_for_mode (TYPE_MODE (TREE_TYPE (utype)), 1);
1104   else
1105     utype = lang_hooks.types.type_for_mode (TYPE_MODE (utype), 1);
1106
1107   arr_index_type = build_index_type (info->range_size);
1108   tidx = make_ssa_name (utype, NULL);
1109   sub = fold_build2_loc (loc, MINUS_EXPR, utype,
1110                          fold_convert_loc (loc, utype, info->index_expr),
1111                          fold_convert_loc (loc, utype, info->range_min));
1112   sub = force_gimple_operand_gsi (&gsi, sub,
1113                                   false, NULL, true, GSI_SAME_STMT);
1114   stmt = gimple_build_assign (tidx, sub);
1115
1116   gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
1117   update_stmt (stmt);
1118   info->arr_ref_first = stmt;
1119
1120   for (gsi = gsi_start_phis (info->final_bb), i = 0;
1121        !gsi_end_p (gsi); gsi_next (&gsi), i++)
1122     build_one_array (swtch, i, arr_index_type, gsi_stmt (gsi), tidx, info);
1123 }
1124
1125 /* Generates and appropriately inserts loads of default values at the position
1126    given by BSI.  Returns the last inserted statement.  */
1127
1128 static gimple
1129 gen_def_assigns (gimple_stmt_iterator *gsi, struct switch_conv_info *info)
1130 {
1131   int i;
1132   gimple assign = NULL;
1133
1134   for (i = 0; i < info->phi_count; i++)
1135     {
1136       tree name = copy_ssa_name (info->target_inbound_names[i], NULL);
1137       info->target_outbound_names[i] = name;
1138       assign = gimple_build_assign (name, info->default_values[i]);
1139       gsi_insert_before (gsi, assign, GSI_SAME_STMT);
1140       update_stmt (assign);
1141     }
1142   return assign;
1143 }
1144
1145 /* Deletes the unused bbs and edges that now contain the switch statement and
1146    its empty branch bbs.  BBD is the now dead BB containing the original switch
1147    statement, FINAL is the last BB of the converted switch statement (in terms
1148    of succession).  */
1149
1150 static void
1151 prune_bbs (basic_block bbd, basic_block final)
1152 {
1153   edge_iterator ei;
1154   edge e;
1155
1156   for (ei = ei_start (bbd->succs); (e = ei_safe_edge (ei)); )
1157     {
1158       basic_block bb;
1159       bb = e->dest;
1160       remove_edge (e);
1161       if (bb != final)
1162         delete_basic_block (bb);
1163     }
1164   delete_basic_block (bbd);
1165 }
1166
1167 /* Add values to phi nodes in final_bb for the two new edges.  E1F is the edge
1168    from the basic block loading values from an array and E2F from the basic
1169    block loading default values.  BBF is the last switch basic block (see the
1170    bbf description in the comment below).  */
1171
1172 static void
1173 fix_phi_nodes (edge e1f, edge e2f, basic_block bbf,
1174                struct switch_conv_info *info)
1175 {
1176   gimple_stmt_iterator gsi;
1177   int i;
1178
1179   for (gsi = gsi_start_phis (bbf), i = 0;
1180        !gsi_end_p (gsi); gsi_next (&gsi), i++)
1181     {
1182       gimple phi = gsi_stmt (gsi);
1183       add_phi_arg (phi, info->target_inbound_names[i], e1f, UNKNOWN_LOCATION);
1184       add_phi_arg (phi, info->target_outbound_names[i], e2f, UNKNOWN_LOCATION);
1185     }
1186 }
1187
1188 /* Creates a check whether the switch expression value actually falls into the
1189    range given by all the cases.  If it does not, the temporaries are loaded
1190    with default values instead.  SWTCH is the switch statement being converted.
1191
1192    bb0 is the bb with the switch statement, however, we'll end it with a
1193        condition instead.
1194
1195    bb1 is the bb to be used when the range check went ok.  It is derived from
1196        the switch BB
1197
1198    bb2 is the bb taken when the expression evaluated outside of the range
1199        covered by the created arrays.  It is populated by loads of default
1200        values.
1201
1202    bbF is a fall through for both bb1 and bb2 and contains exactly what
1203        originally followed the switch statement.
1204
1205    bbD contains the switch statement (in the end).  It is unreachable but we
1206        still need to strip off its edges.
1207 */
1208
1209 static void
1210 gen_inbound_check (gimple swtch, struct switch_conv_info *info)
1211 {
1212   tree label_decl1 = create_artificial_label (UNKNOWN_LOCATION);
1213   tree label_decl2 = create_artificial_label (UNKNOWN_LOCATION);
1214   tree label_decl3 = create_artificial_label (UNKNOWN_LOCATION);
1215   gimple label1, label2, label3;
1216   tree utype, tidx;
1217   tree bound;
1218
1219   gimple cond_stmt;
1220
1221   gimple last_assign;
1222   gimple_stmt_iterator gsi;
1223   basic_block bb0, bb1, bb2, bbf, bbd;
1224   edge e01, e02, e21, e1d, e1f, e2f;
1225   location_t loc = gimple_location (swtch);
1226
1227   gcc_assert (info->default_values);
1228
1229   bb0 = gimple_bb (swtch);
1230
1231   tidx = gimple_assign_lhs (info->arr_ref_first);
1232   utype = TREE_TYPE (tidx);
1233
1234   /* (end of) block 0 */
1235   gsi = gsi_for_stmt (info->arr_ref_first);
1236   gsi_next (&gsi);
1237
1238   bound = fold_convert_loc (loc, utype, info->range_size);
1239   cond_stmt = gimple_build_cond (LE_EXPR, tidx, bound, NULL_TREE, NULL_TREE);
1240   gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1241   update_stmt (cond_stmt);
1242
1243   /* block 2 */
1244   label2 = gimple_build_label (label_decl2);
1245   gsi_insert_before (&gsi, label2, GSI_SAME_STMT);
1246   last_assign = gen_def_assigns (&gsi, info);
1247
1248   /* block 1 */
1249   label1 = gimple_build_label (label_decl1);
1250   gsi_insert_before (&gsi, label1, GSI_SAME_STMT);
1251
1252   /* block F */
1253   gsi = gsi_start_bb (info->final_bb);
1254   label3 = gimple_build_label (label_decl3);
1255   gsi_insert_before (&gsi, label3, GSI_SAME_STMT);
1256
1257   /* cfg fix */
1258   e02 = split_block (bb0, cond_stmt);
1259   bb2 = e02->dest;
1260
1261   e21 = split_block (bb2, last_assign);
1262   bb1 = e21->dest;
1263   remove_edge (e21);
1264
1265   e1d = split_block (bb1, info->arr_ref_last);
1266   bbd = e1d->dest;
1267   remove_edge (e1d);
1268
1269   /* flags and profiles of the edge for in-range values */
1270   e01 = make_edge (bb0, bb1, EDGE_TRUE_VALUE);
1271   e01->probability = REG_BR_PROB_BASE - info->default_prob;
1272   e01->count = info->other_count;
1273
1274   /* flags and profiles of the edge taking care of out-of-range values */
1275   e02->flags &= ~EDGE_FALLTHRU;
1276   e02->flags |= EDGE_FALSE_VALUE;
1277   e02->probability = info->default_prob;
1278   e02->count = info->default_count;
1279
1280   bbf = info->final_bb;
1281
1282   e1f = make_edge (bb1, bbf, EDGE_FALLTHRU);
1283   e1f->probability = REG_BR_PROB_BASE;
1284   e1f->count = info->other_count;
1285
1286   e2f = make_edge (bb2, bbf, EDGE_FALLTHRU);
1287   e2f->probability = REG_BR_PROB_BASE;
1288   e2f->count = info->default_count;
1289
1290   /* frequencies of the new BBs */
1291   bb1->frequency = EDGE_FREQUENCY (e01);
1292   bb2->frequency = EDGE_FREQUENCY (e02);
1293   bbf->frequency = EDGE_FREQUENCY (e1f) + EDGE_FREQUENCY (e2f);
1294
1295   /* Tidy blocks that have become unreachable.  */
1296   prune_bbs (bbd, info->final_bb);
1297
1298   /* Fixup the PHI nodes in bbF.  */
1299   fix_phi_nodes (e1f, e2f, bbf, info);
1300
1301   /* Fix the dominator tree, if it is available.  */
1302   if (dom_info_available_p (CDI_DOMINATORS))
1303     {
1304       vec<basic_block> bbs_to_fix_dom;
1305
1306       set_immediate_dominator (CDI_DOMINATORS, bb1, bb0);
1307       set_immediate_dominator (CDI_DOMINATORS, bb2, bb0);
1308       if (! get_immediate_dominator (CDI_DOMINATORS, bbf))
1309         /* If bbD was the immediate dominator ...  */
1310         set_immediate_dominator (CDI_DOMINATORS, bbf, bb0);
1311
1312       bbs_to_fix_dom.create (4);
1313       bbs_to_fix_dom.quick_push (bb0);
1314       bbs_to_fix_dom.quick_push (bb1);
1315       bbs_to_fix_dom.quick_push (bb2);
1316       bbs_to_fix_dom.quick_push (bbf);
1317
1318       iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
1319       bbs_to_fix_dom.release ();
1320     }
1321 }
1322
1323 /* The following function is invoked on every switch statement (the current one
1324    is given in SWTCH) and runs the individual phases of switch conversion on it
1325    one after another until one fails or the conversion is completed.
1326    Returns NULL on success, or a pointer to a string with the reason why the
1327    conversion failed.  */
1328
1329 static const char *
1330 process_switch (gimple swtch)
1331 {
1332   struct switch_conv_info info;
1333
1334   /* Group case labels so that we get the right results from the heuristics
1335      that decide on the code generation approach for this switch.  */
1336   group_case_labels_stmt (swtch);
1337
1338   /* If this switch is now a degenerate case with only a default label,
1339      there is nothing left for us to do.   */
1340   if (gimple_switch_num_labels (swtch) < 2)
1341     return "switch is a degenerate case";
1342
1343   collect_switch_conv_info (swtch, &info);
1344
1345   /* No error markers should reach here (they should be filtered out
1346      during gimplification).  */
1347   gcc_checking_assert (TREE_TYPE (info.index_expr) != error_mark_node);
1348
1349   /* A switch on a constant should have been optimized in tree-cfg-cleanup.  */
1350   gcc_checking_assert (! TREE_CONSTANT (info.index_expr));
1351
1352   if (info.uniq <= MAX_CASE_BIT_TESTS)
1353     {
1354       if (expand_switch_using_bit_tests_p (info.range_size,
1355                                            info.uniq, info.count))
1356         {
1357           if (dump_file)
1358             fputs ("  expanding as bit test is preferable\n", dump_file);
1359           emit_case_bit_tests (swtch, info.index_expr,
1360                                info.range_min, info.range_size);
1361           if (current_loops)
1362             loops_state_set (LOOPS_NEED_FIXUP);
1363           return NULL;
1364         }
1365
1366       if (info.uniq <= 2)
1367         /* This will be expanded as a decision tree in stmt.c:expand_case.  */
1368         return "  expanding as jumps is preferable";
1369     }
1370
1371   /* If there is no common successor, we cannot do the transformation.  */
1372   if (! info.final_bb)
1373     return "no common successor to all case label target blocks found";
1374
1375   /* Check the case label values are within reasonable range:  */
1376   if (!check_range (&info))
1377     {
1378       gcc_assert (info.reason);
1379       return info.reason;
1380     }
1381
1382   /* For all the cases, see whether they are empty, the assignments they
1383      represent constant and so on...  */
1384   if (! check_all_empty_except_final (&info))
1385     {
1386       gcc_assert (info.reason);
1387       return info.reason;
1388     }
1389   if (!check_final_bb (&info))
1390     {
1391       gcc_assert (info.reason);
1392       return info.reason;
1393     }
1394
1395   /* At this point all checks have passed and we can proceed with the
1396      transformation.  */
1397
1398   create_temp_arrays (&info);
1399   gather_default_values (gimple_switch_default_label (swtch), &info);
1400   build_constructors (swtch, &info);
1401
1402   build_arrays (swtch, &info); /* Build the static arrays and assignments.   */
1403   gen_inbound_check (swtch, &info);     /* Build the bounds check.  */
1404
1405   /* Cleanup:  */
1406   free_temp_arrays (&info);
1407   return NULL;
1408 }
1409
1410 /* The main function of the pass scans statements for switches and invokes
1411    process_switch on them.  */
1412
1413 static unsigned int
1414 do_switchconv (void)
1415 {
1416   basic_block bb;
1417
1418   FOR_EACH_BB (bb)
1419   {
1420     const char *failure_reason;
1421     gimple stmt = last_stmt (bb);
1422     if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
1423       {
1424         if (dump_file)
1425           {
1426             expanded_location loc = expand_location (gimple_location (stmt));
1427
1428             fprintf (dump_file, "beginning to process the following "
1429                      "SWITCH statement (%s:%d) : ------- \n",
1430                      loc.file, loc.line);
1431             print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1432             putc ('\n', dump_file);
1433           }
1434
1435         failure_reason = process_switch (stmt);
1436         if (! failure_reason)
1437           {
1438             if (dump_file)
1439               {
1440                 fputs ("Switch converted\n", dump_file);
1441                 fputs ("--------------------------------\n", dump_file);
1442               }
1443
1444             /* Make no effort to update the post-dominator tree.  It is actually not
1445                that hard for the transformations we have performed, but it is not
1446                supported by iterate_fix_dominators.  */
1447             free_dominance_info (CDI_POST_DOMINATORS);
1448           }
1449         else
1450           {
1451             if (dump_file)
1452               {
1453                 fputs ("Bailing out - ", dump_file);
1454                 fputs (failure_reason, dump_file);
1455                 fputs ("\n--------------------------------\n", dump_file);
1456               }
1457           }
1458       }
1459   }
1460
1461   return 0;
1462 }
1463
1464 /* The pass gate. */
1465
1466 static bool
1467 switchconv_gate (void)
1468 {
1469   return flag_tree_switch_conversion != 0;
1470 }
1471
1472 namespace {
1473
1474 const pass_data pass_data_convert_switch =
1475 {
1476   GIMPLE_PASS, /* type */
1477   "switchconv", /* name */
1478   OPTGROUP_NONE, /* optinfo_flags */
1479   true, /* has_gate */
1480   true, /* has_execute */
1481   TV_TREE_SWITCH_CONVERSION, /* tv_id */
1482   ( PROP_cfg | PROP_ssa ), /* properties_required */
1483   0, /* properties_provided */
1484   0, /* properties_destroyed */
1485   0, /* todo_flags_start */
1486   ( TODO_update_ssa | TODO_verify_ssa
1487     | TODO_verify_stmts
1488     | TODO_verify_flow ), /* todo_flags_finish */
1489 };
1490
1491 class pass_convert_switch : public gimple_opt_pass
1492 {
1493 public:
1494   pass_convert_switch (gcc::context *ctxt)
1495     : gimple_opt_pass (pass_data_convert_switch, ctxt)
1496   {}
1497
1498   /* opt_pass methods: */
1499   bool gate () { return switchconv_gate (); }
1500   unsigned int execute () { return do_switchconv (); }
1501
1502 }; // class pass_convert_switch
1503
1504 } // anon namespace
1505
1506 gimple_opt_pass *
1507 make_pass_convert_switch (gcc::context *ctxt)
1508 {
1509   return new pass_convert_switch (ctxt);
1510 }