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