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