]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-switch-conversion.c
decl.c, [...]: Remove redundant enum from machine_mode.
[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.
23a5b65a 3 Copyright (C) 2006-2014 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"
60393bbc
AM
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"
531b10fc 46#include "basic-block.h"
2fb9a547
AM
47#include "tree-ssa-alias.h"
48#include "internal-fn.h"
49#include "gimple-expr.h"
50#include "is-a.h"
18f429e2 51#include "gimple.h"
45b0be94 52#include "gimplify.h"
5be5c238 53#include "gimple-iterator.h"
18f429e2 54#include "gimplify-me.h"
442b4905 55#include "gimple-ssa.h"
c582198b
AM
56#include "hash-map.h"
57#include "plugin-api.h"
58#include "ipa-ref.h"
442b4905
AM
59#include "cgraph.h"
60#include "tree-cfg.h"
61#include "tree-phinodes.h"
d8a2d370 62#include "stringpool.h"
442b4905 63#include "tree-ssanames.h"
531b10fc
SB
64#include "tree-pass.h"
65#include "gimple-pretty-print.h"
a9e0d843 66#include "cfgloop.h"
7ee2468b
SB
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? */
531b10fc
SB
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
96static basic_block
97hoist_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
531b10fc
SB
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
147static bool
148expand_switch_using_bit_tests_p (tree range,
149 unsigned int uniq,
72798784 150 unsigned int count, bool speed_p)
531b10fc
SB
151{
152 return (((uniq == 1 && count >= 3)
153 || (uniq == 2 && count >= 5)
154 || (uniq == 3 && count >= 6))
72798784 155 && lshift_cheap_p (speed_p)
531b10fc
SB
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
162A GIMPLE switch statement can be expanded to a short sequence of bit-wise
163comparisons. "switch(x)" is converted into "if ((1 << (x-MINVAL)) & CST)"
164where CST and MINVAL are integer constants. This is better than a series
165of compare-and-banch insns in some cases, e.g. we can implement:
166
167 if ((x==4) || (x==6) || (x==9) || (x==11))
168
169as a single bit test:
170
171 if ((1<<x) & ((1<<4)|(1<<6)|(1<<9)|(1<<11)))
172
173This transformation is only applied if the number of case targets is small,
34540577 174if CST constains at least 3 bits, and "1 << x" is cheap. The bit tests are
531b10fc
SB
175performed in "word_mode".
176
177The 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
207TODO: There are still some improvements to this transformation that could
208be 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
219This 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
232struct case_bit_test
233{
aa79a1e1 234 wide_int mask;
531b10fc
SB
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
254static int
255case_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).
aa79a1e1 281 MAXVAL is MINVAL + RANGE.
531b10fc
SB
282
283 There *MUST* be MAX_CASE_BIT_TESTS or less unique case
284 node targets. */
285
286static void
287emit_case_bit_tests (gimple swtch, tree index_expr,
aa79a1e1 288 tree minval, tree range, tree maxval)
531b10fc
SB
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
6e1aa848 299 vec<basic_block> bbs_to_fix_dom = vNULL;
531b10fc
SB
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);
aa79a1e1
JJ
312 int prec = TYPE_PRECISION (word_type_node);
313 wide_int wone = wi::one (prec);
531b10fc
SB
314
315 memset (&test, 0, sizeof (test));
316
317 /* Get the edge for the default case. */
fd8d363e 318 tmp = gimple_switch_default_label (swtch);
531b10fc
SB
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);
8166ff4d 330 edge e = find_edge (switch_bb, label_to_block (label));
531b10fc 331 for (k = 0; k < count; k++)
8166ff4d 332 if (e == test[k].target_edge)
531b10fc
SB
333 break;
334
335 if (k == count)
336 {
531b10fc 337 gcc_checking_assert (count < MAX_CASE_BIT_TESTS);
aa79a1e1 338 test[k].mask = wi::zero (prec);
531b10fc
SB
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
386b1f1f
RS
347 lo = tree_to_uhwi (int_const_binop (MINUS_EXPR,
348 CASE_LOW (cs), minval));
531b10fc
SB
349 if (CASE_HIGH (cs) == NULL_TREE)
350 hi = lo;
351 else
386b1f1f
RS
352 hi = tree_to_uhwi (int_const_binop (MINUS_EXPR,
353 CASE_HIGH (cs), minval));
531b10fc
SB
354
355 for (j = lo; j <= hi; j++)
aa79a1e1 356 test[k].mask |= wi::lshift (wone, j);
531b10fc
SB
357 }
358
c3284718 359 qsort (test, count, sizeof (*test), case_bit_test_cmp);
531b10fc 360
aa79a1e1
JJ
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
531b10fc
SB
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 {
9771b263
DN
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);
531b10fc
SB
400 }
401
402 /* Now build the test-and-branch code. */
403
404 gsi = gsi_last_bb (switch_bb);
405
d9e408de
TV
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));
531b10fc
SB
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)
9771b263 422 bbs_to_fix_dom.quick_push (new_bb);
531b10fc
SB
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 {
9771b263 430 vec<basic_block> dom_bbs;
531b10fc
SB
431 basic_block dom_son;
432
433 dom_bbs = get_dominated_by (CDI_DOMINATORS, new_bb);
9771b263 434 FOR_EACH_VEC_ELT (dom_bbs, i, dom_son)
531b10fc
SB
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);
9771b263 440 bbs_to_fix_dom.safe_push (dom_son);
531b10fc 441 }
9771b263 442 dom_bbs.release ();
531b10fc
SB
443 }
444
445 /* csui = (1 << (word_mode) idx) */
83d5977e 446 csui = make_ssa_name (word_type_node, NULL);
531b10fc
SB
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);
531b10fc
SB
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 {
aa79a1e1 460 tmp = wide_int_to_tree (word_type_node, test[k].mask);
531b10fc
SB
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)
9771b263 469 bbs_to_fix_dom.safe_push (new_bb);
531b10fc
SB
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);
9771b263 487 bbs_to_fix_dom.release ();
531b10fc
SB
488 }
489}
490\f
b6e99746
MJ
491/*
492 Switch initialization conversion
493
494The following pass changes simple initializations of scalars in a switch
fade902a
SB
495statement into initializations from a static array. Obviously, the values
496must be constant and known at compile time and a default branch must be
b6e99746
MJ
497provided. 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;
886cd84f 519 break;
b6e99746
MJ
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
525is 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 }
886cd84f
SB
541 a_5 = PHI <a_6, a_7>
542 b_b = PHI <b_6, b_7>
b6e99746
MJ
543
544There are further constraints. Specifically, the range of values across all
545case labels must not be bigger than SWITCH_CONVERSION_BRANCH_RATIO (default
531b10fc 546eight) times the number of the actual switch branches.
b6e99746 547
531b10fc
SB
548This transformation was contributed by Martin Jambor, see this e-mail:
549 http://gcc.gnu.org/ml/gcc-patches/2008-07/msg00011.html */
b6e99746
MJ
550
551/* The main structure of the pass. */
552struct switch_conv_info
553{
886cd84f 554 /* The expression used to decide the switch branch. */
b6e99746
MJ
555 tree index_expr;
556
886cd84f
SB
557 /* The following integer constants store the minimum and maximum value
558 covered by the case labels. */
b6e99746 559 tree range_min;
886cd84f 560 tree range_max;
b6e99746 561
886cd84f
SB
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. */
b6e99746
MJ
565 tree range_size;
566
886cd84f 567 /* Basic block that contains the actual GIMPLE_SWITCH. */
b6e99746
MJ
568 basic_block switch_bb;
569
886cd84f
SB
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. */
b6e99746
MJ
575 basic_block final_bb;
576
886cd84f
SB
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
b6e99746
MJ
586 /* Number of phi nodes in the final bb (that we'll be replacing). */
587 int phi_count;
588
b1ae1681 589 /* Array of default values, in the same order as phi nodes. */
b6e99746
MJ
590 tree *default_values;
591
592 /* Constructors of new static arrays. */
9771b263 593 vec<constructor_elt, va_gc> **constructors;
b6e99746
MJ
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
b1ae1681
MJ
603 /* The first load statement that loads a temporary from a new static array.
604 */
726a989a 605 gimple arr_ref_first;
b6e99746
MJ
606
607 /* The last load statement that loads a temporary from a new static array. */
726a989a 608 gimple arr_ref_last;
b6e99746
MJ
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;
8e97bc2b
JJ
613
614 /* Parameters for expand_switch_using_bit_tests. Should be computed
615 the same way as in expand_case. */
886cd84f
SB
616 unsigned int uniq;
617 unsigned int count;
b6e99746
MJ
618};
619
886cd84f 620/* Collect information about GIMPLE_SWITCH statement SWTCH into INFO. */
b6e99746 621
886cd84f
SB
622static void
623collect_switch_conv_info (gimple swtch, struct switch_conv_info *info)
b6e99746 624{
726a989a 625 unsigned int branch_num = gimple_switch_num_labels (swtch);
886cd84f
SB
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));
b6e99746
MJ
632
633 /* The gimplifier has already sorted the cases by CASE_LOW and ensured there
fd8d363e
SB
634 is a default label which is the first in the vector.
635 Collect the bits we can deduce from the CFG. */
886cd84f
SB
636 info->index_expr = gimple_switch_index (swtch);
637 info->switch_bb = gimple_bb (swtch);
638 info->default_bb =
fd8d363e 639 label_to_block (CASE_LABEL (gimple_switch_default_label (swtch)));
886cd84f
SB
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;
b6e99746 646
886cd84f 647 /* See if there is one common successor block for all branch
866f20d6
RB
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. */
886cd84f
SB
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);
726a989a 675 max_case = gimple_switch_label (swtch, branch_num - 1);
886cd84f
SB
676
677 info->range_min = CASE_LOW (min_case);
b6e99746 678 if (CASE_HIGH (max_case) != NULL_TREE)
886cd84f 679 info->range_max = CASE_HIGH (max_case);
b6e99746 680 else
886cd84f
SB
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);
b6e99746 685
886cd84f
SB
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}
b6e99746 705
886cd84f
SB
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. */
b6e99746 709
886cd84f
SB
710static bool
711check_range (struct switch_conv_info *info)
712{
fade902a 713 gcc_assert (info->range_size);
cc269bb6 714 if (!tree_fits_uhwi_p (info->range_size))
b6e99746 715 {
fade902a 716 info->reason = "index range way too large or otherwise unusable";
b6e99746
MJ
717 return false;
718 }
719
7d362f6c 720 if (tree_to_uhwi (info->range_size)
886cd84f 721 > ((unsigned) info->count * SWITCH_CONVERSION_BRANCH_RATIO))
b6e99746 722 {
fade902a 723 info->reason = "the maximum range-branch ratio exceeded";
b6e99746
MJ
724 return false;
725 }
726
727 return true;
728}
729
886cd84f 730/* Checks whether all but the FINAL_BB basic blocks are empty. */
b6e99746
MJ
731
732static bool
886cd84f 733check_all_empty_except_final (struct switch_conv_info *info)
b6e99746 734{
b6e99746 735 edge e;
886cd84f 736 edge_iterator ei;
b6e99746 737
886cd84f 738 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
b6e99746 739 {
886cd84f
SB
740 if (e->dest == info->final_bb)
741 continue;
b6e99746 742
886cd84f 743 if (!empty_block_p (e->dest))
b6e99746 744 {
fade902a 745 info->reason = "bad case - a non-final BB not empty";
b6e99746
MJ
746 return false;
747 }
b6e99746
MJ
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
758static bool
fade902a 759check_final_bb (struct switch_conv_info *info)
b6e99746 760{
726a989a 761 gimple_stmt_iterator gsi;
b6e99746 762
fade902a
SB
763 info->phi_count = 0;
764 for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
b6e99746 765 {
726a989a
RB
766 gimple phi = gsi_stmt (gsi);
767 unsigned int i;
b6e99746 768
fade902a 769 info->phi_count++;
b6e99746 770
726a989a 771 for (i = 0; i < gimple_phi_num_args (phi); i++)
b6e99746 772 {
726a989a 773 basic_block bb = gimple_phi_arg_edge (phi, i)->src;
b6e99746 774
fade902a
SB
775 if (bb == info->switch_bb
776 || (single_pred_p (bb) && single_pred (bb) == info->switch_bb))
b6e99746 777 {
f6e6e990
JJ
778 tree reloc, val;
779
780 val = gimple_phi_arg_def (phi, i);
781 if (!is_gimple_ip_invariant (val))
782 {
fade902a 783 info->reason = "non-invariant value from a case";
f6e6e990
JJ
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)
fade902a
SB
791 info->reason
792 = "value from a case would need runtime relocations";
f6e6e990 793 else
fade902a
SB
794 info->reason
795 = "value from a case is not a valid initializer";
f6e6e990
JJ
796 return false;
797 }
b6e99746
MJ
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
809static void
fade902a 810create_temp_arrays (struct switch_conv_info *info)
b6e99746
MJ
811{
812 int i;
813
fade902a 814 info->default_values = XCNEWVEC (tree, info->phi_count * 3);
9771b263
DN
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);
fade902a
SB
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++)
ae7e9ddd 822 vec_alloc (info->constructors[i], tree_to_uhwi (info->range_size) + 1);
b6e99746
MJ
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
829static void
fade902a 830free_temp_arrays (struct switch_conv_info *info)
b6e99746 831{
fade902a
SB
832 XDELETEVEC (info->constructors);
833 XDELETEVEC (info->default_values);
b6e99746
MJ
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
839static void
fade902a 840gather_default_values (tree default_case, struct switch_conv_info *info)
b6e99746 841{
726a989a 842 gimple_stmt_iterator gsi;
b6e99746
MJ
843 basic_block bb = label_to_block (CASE_LABEL (default_case));
844 edge e;
726a989a 845 int i = 0;
b6e99746
MJ
846
847 gcc_assert (CASE_LOW (default_case) == NULL_TREE);
848
fade902a
SB
849 if (bb == info->final_bb)
850 e = find_edge (info->switch_bb, bb);
b6e99746
MJ
851 else
852 e = single_succ_edge (bb);
853
fade902a 854 for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
b6e99746 855 {
726a989a 856 gimple phi = gsi_stmt (gsi);
b6e99746
MJ
857 tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
858 gcc_assert (val);
fade902a 859 info->default_values[i++] = val;
b6e99746
MJ
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
867static void
fade902a 868build_constructors (gimple swtch, struct switch_conv_info *info)
b6e99746 869{
726a989a 870 unsigned i, branch_num = gimple_switch_num_labels (swtch);
fade902a 871 tree pos = info->range_min;
b6e99746 872
726a989a 873 for (i = 1; i < branch_num; i++)
b6e99746 874 {
726a989a 875 tree cs = gimple_switch_label (swtch, i);
b6e99746
MJ
876 basic_block bb = label_to_block (CASE_LABEL (cs));
877 edge e;
726a989a
RB
878 tree high;
879 gimple_stmt_iterator gsi;
b6e99746
MJ
880 int j;
881
fade902a
SB
882 if (bb == info->final_bb)
883 e = find_edge (info->switch_bb, bb);
b6e99746
MJ
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;
fade902a 891 for (k = 0; k < info->phi_count; k++)
b6e99746 892 {
f32682ca 893 constructor_elt elt;
b6e99746 894
f32682ca 895 elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
d1f98542
RB
896 elt.value
897 = unshare_expr_without_location (info->default_values[k]);
9771b263 898 info->constructors[k]->quick_push (elt);
b6e99746
MJ
899 }
900
807e902e
KZ
901 pos = int_const_binop (PLUS_EXPR, pos,
902 build_int_cst (TREE_TYPE (pos), 1));
b6e99746 903 }
b1ae1681 904 gcc_assert (tree_int_cst_equal (pos, CASE_LOW (cs)));
b6e99746
MJ
905
906 j = 0;
907 if (CASE_HIGH (cs))
908 high = CASE_HIGH (cs);
909 else
b1ae1681 910 high = CASE_LOW (cs);
fade902a 911 for (gsi = gsi_start_phis (info->final_bb);
726a989a 912 !gsi_end_p (gsi); gsi_next (&gsi))
b6e99746 913 {
726a989a 914 gimple phi = gsi_stmt (gsi);
b6e99746 915 tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
7f2a9982 916 tree low = CASE_LOW (cs);
b6e99746
MJ
917 pos = CASE_LOW (cs);
918
b8698a0f 919 do
b6e99746 920 {
f32682ca 921 constructor_elt elt;
b6e99746 922
f32682ca 923 elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
d1f98542 924 elt.value = unshare_expr_without_location (val);
9771b263 925 info->constructors[j]->quick_push (elt);
b6e99746 926
807e902e
KZ
927 pos = int_const_binop (PLUS_EXPR, pos,
928 build_int_cst (TREE_TYPE (pos), 1));
7156c8ab
MJ
929 } while (!tree_int_cst_lt (high, pos)
930 && tree_int_cst_lt (low, pos));
b6e99746
MJ
931 j++;
932 }
933 }
934}
935
7156c8ab
MJ
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
940static tree
9771b263 941constructor_contains_same_values_p (vec<constructor_elt, va_gc> *vec)
7156c8ab 942{
8e97bc2b 943 unsigned int i;
7156c8ab 944 tree prev = NULL_TREE;
8e97bc2b 945 constructor_elt *elt;
7156c8ab 946
9771b263 947 FOR_EACH_VEC_SAFE_ELT (vec, i, elt)
7156c8ab 948 {
7156c8ab
MJ
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
8e97bc2b
JJ
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
961static tree
fade902a
SB
962array_value_type (gimple swtch, tree type, int num,
963 struct switch_conv_info *info)
8e97bc2b 964{
9771b263 965 unsigned int i, len = vec_safe_length (info->constructors[num]);
8e97bc2b 966 constructor_elt *elt;
ef4bddc2 967 machine_mode mode;
8e97bc2b
JJ
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
9771b263 981 FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
8e97bc2b 982 {
807e902e 983 wide_int cst;
8e97bc2b
JJ
984
985 if (TREE_CODE (elt->value) != INTEGER_CST)
986 return type;
987
807e902e 988 cst = elt->value;
8e97bc2b
JJ
989 while (1)
990 {
991 unsigned int prec = GET_MODE_BITSIZE (mode);
992 if (prec > HOST_BITS_PER_WIDE_INT)
993 return type;
994
807e902e 995 if (sign >= 0 && cst == wi::zext (cst, prec))
8e97bc2b 996 {
807e902e 997 if (sign == 0 && cst == wi::sext (cst, prec))
8e97bc2b
JJ
998 break;
999 sign = 1;
1000 break;
1001 }
807e902e 1002 if (sign <= 0 && cst == wi::sext (cst, prec))
8e97bc2b
JJ
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
b6e99746
MJ
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
7156c8ab
MJ
1035 is an ssa name of a temporary variable holding the index for loads from the
1036 new array. */
b6e99746
MJ
1037
1038static void
726a989a 1039build_one_array (gimple swtch, int num, tree arr_index_type, gimple phi,
fade902a 1040 tree tidx, struct switch_conv_info *info)
b6e99746 1041{
7156c8ab 1042 tree name, cst;
726a989a 1043 gimple load;
7156c8ab 1044 gimple_stmt_iterator gsi = gsi_for_stmt (swtch);
c2255bc4 1045 location_t loc = gimple_location (swtch);
b6e99746 1046
fade902a 1047 gcc_assert (info->default_values[num]);
b6e99746 1048
070ecdfd 1049 name = copy_ssa_name (PHI_RESULT (phi), NULL);
fade902a 1050 info->target_inbound_names[num] = name;
b6e99746 1051
fade902a 1052 cst = constructor_contains_same_values_p (info->constructors[num]);
7156c8ab
MJ
1053 if (cst)
1054 load = gimple_build_assign (name, cst);
1055 else
1056 {
8e97bc2b 1057 tree array_type, ctor, decl, value_type, fetch, default_type;
7156c8ab 1058
fade902a
SB
1059 default_type = TREE_TYPE (info->default_values[num]);
1060 value_type = array_value_type (swtch, default_type, num, info);
7156c8ab 1061 array_type = build_array_type (value_type, arr_index_type);
8e97bc2b
JJ
1062 if (default_type != value_type)
1063 {
1064 unsigned int i;
1065 constructor_elt *elt;
1066
9771b263 1067 FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
8e97bc2b
JJ
1068 elt->value = fold_convert (value_type, elt->value);
1069 }
fade902a 1070 ctor = build_constructor (array_type, info->constructors[num]);
7156c8ab 1071 TREE_CONSTANT (ctor) = true;
5f7ae6b6 1072 TREE_STATIC (ctor) = true;
7156c8ab 1073
c2255bc4 1074 decl = build_decl (loc, VAR_DECL, NULL_TREE, array_type);
7156c8ab
MJ
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;
2e3b4885 1081 TREE_READONLY (decl) = 1;
9041d2e6 1082 varpool_node::finalize_decl (decl);
7156c8ab
MJ
1083
1084 fetch = build4 (ARRAY_REF, value_type, decl, tidx, NULL_TREE,
1085 NULL_TREE);
8e97bc2b
JJ
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 }
7156c8ab
MJ
1092 load = gimple_build_assign (name, fetch);
1093 }
b6e99746 1094
726a989a 1095 gsi_insert_before (&gsi, load, GSI_SAME_STMT);
7156c8ab 1096 update_stmt (load);
fade902a 1097 info->arr_ref_last = load;
b6e99746
MJ
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
1104static void
fade902a 1105build_arrays (gimple swtch, struct switch_conv_info *info)
b6e99746
MJ
1106{
1107 tree arr_index_type;
83d5977e 1108 tree tidx, sub, utype;
726a989a
RB
1109 gimple stmt;
1110 gimple_stmt_iterator gsi;
b6e99746 1111 int i;
db3927fb 1112 location_t loc = gimple_location (swtch);
b6e99746 1113
726a989a 1114 gsi = gsi_for_stmt (swtch);
04e78aa9 1115
edb9b69e 1116 /* Make sure we do not generate arithmetics in a subrange. */
fade902a 1117 utype = TREE_TYPE (info->index_expr);
edb9b69e
JJ
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
fade902a 1123 arr_index_type = build_index_type (info->range_size);
83d5977e 1124 tidx = make_ssa_name (utype, NULL);
edb9b69e 1125 sub = fold_build2_loc (loc, MINUS_EXPR, utype,
fade902a
SB
1126 fold_convert_loc (loc, utype, info->index_expr),
1127 fold_convert_loc (loc, utype, info->range_min));
fae1034e 1128 sub = force_gimple_operand_gsi (&gsi, sub,
726a989a
RB
1129 false, NULL, true, GSI_SAME_STMT);
1130 stmt = gimple_build_assign (tidx, sub);
b6e99746 1131
726a989a 1132 gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
7156c8ab 1133 update_stmt (stmt);
fade902a 1134 info->arr_ref_first = stmt;
b6e99746 1135
fade902a 1136 for (gsi = gsi_start_phis (info->final_bb), i = 0;
726a989a 1137 !gsi_end_p (gsi); gsi_next (&gsi), i++)
fade902a 1138 build_one_array (swtch, i, arr_index_type, gsi_stmt (gsi), tidx, info);
b6e99746
MJ
1139}
1140
1141/* Generates and appropriately inserts loads of default values at the position
1142 given by BSI. Returns the last inserted statement. */
1143
726a989a 1144static gimple
fade902a 1145gen_def_assigns (gimple_stmt_iterator *gsi, struct switch_conv_info *info)
b6e99746
MJ
1146{
1147 int i;
726a989a 1148 gimple assign = NULL;
b6e99746 1149
fade902a 1150 for (i = 0; i < info->phi_count; i++)
b6e99746 1151 {
070ecdfd 1152 tree name = copy_ssa_name (info->target_inbound_names[i], NULL);
fade902a
SB
1153 info->target_outbound_names[i] = name;
1154 assign = gimple_build_assign (name, info->default_values[i]);
726a989a 1155 gsi_insert_before (gsi, assign, GSI_SAME_STMT);
7156c8ab 1156 update_stmt (assign);
b6e99746
MJ
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
1166static void
1167prune_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
1188static void
fade902a
SB
1189fix_phi_nodes (edge e1f, edge e2f, basic_block bbf,
1190 struct switch_conv_info *info)
b6e99746 1191{
726a989a 1192 gimple_stmt_iterator gsi;
b6e99746
MJ
1193 int i;
1194
726a989a
RB
1195 for (gsi = gsi_start_phis (bbf), i = 0;
1196 !gsi_end_p (gsi); gsi_next (&gsi), i++)
b6e99746 1197 {
726a989a 1198 gimple phi = gsi_stmt (gsi);
9e227d60
DC
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);
b6e99746 1201 }
b6e99746
MJ
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
1225static void
fade902a 1226gen_inbound_check (gimple swtch, struct switch_conv_info *info)
b6e99746 1227{
c2255bc4
AH
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);
726a989a 1231 gimple label1, label2, label3;
edb9b69e 1232 tree utype, tidx;
b6e99746
MJ
1233 tree bound;
1234
726a989a 1235 gimple cond_stmt;
b6e99746 1236
726a989a
RB
1237 gimple last_assign;
1238 gimple_stmt_iterator gsi;
b6e99746
MJ
1239 basic_block bb0, bb1, bb2, bbf, bbd;
1240 edge e01, e02, e21, e1d, e1f, e2f;
db3927fb 1241 location_t loc = gimple_location (swtch);
b6e99746 1242
fade902a 1243 gcc_assert (info->default_values);
6ab1ab14 1244
726a989a 1245 bb0 = gimple_bb (swtch);
b6e99746 1246
fade902a 1247 tidx = gimple_assign_lhs (info->arr_ref_first);
edb9b69e 1248 utype = TREE_TYPE (tidx);
145544ab 1249
b6e99746 1250 /* (end of) block 0 */
fade902a 1251 gsi = gsi_for_stmt (info->arr_ref_first);
edb9b69e 1252 gsi_next (&gsi);
b6e99746 1253
fade902a 1254 bound = fold_convert_loc (loc, utype, info->range_size);
edb9b69e 1255 cond_stmt = gimple_build_cond (LE_EXPR, tidx, bound, NULL_TREE, NULL_TREE);
726a989a 1256 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
7156c8ab 1257 update_stmt (cond_stmt);
b6e99746
MJ
1258
1259 /* block 2 */
726a989a
RB
1260 label2 = gimple_build_label (label_decl2);
1261 gsi_insert_before (&gsi, label2, GSI_SAME_STMT);
fade902a 1262 last_assign = gen_def_assigns (&gsi, info);
b6e99746
MJ
1263
1264 /* block 1 */
726a989a
RB
1265 label1 = gimple_build_label (label_decl1);
1266 gsi_insert_before (&gsi, label1, GSI_SAME_STMT);
b6e99746
MJ
1267
1268 /* block F */
fade902a 1269 gsi = gsi_start_bb (info->final_bb);
726a989a
RB
1270 label3 = gimple_build_label (label_decl3);
1271 gsi_insert_before (&gsi, label3, GSI_SAME_STMT);
b6e99746
MJ
1272
1273 /* cfg fix */
726a989a 1274 e02 = split_block (bb0, cond_stmt);
b6e99746
MJ
1275 bb2 = e02->dest;
1276
1277 e21 = split_block (bb2, last_assign);
1278 bb1 = e21->dest;
1279 remove_edge (e21);
1280
fade902a 1281 e1d = split_block (bb1, info->arr_ref_last);
b6e99746
MJ
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);
fade902a
SB
1287 e01->probability = REG_BR_PROB_BASE - info->default_prob;
1288 e01->count = info->other_count;
b6e99746
MJ
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;
fade902a
SB
1293 e02->probability = info->default_prob;
1294 e02->count = info->default_count;
b6e99746 1295
fade902a 1296 bbf = info->final_bb;
b6e99746
MJ
1297
1298 e1f = make_edge (bb1, bbf, EDGE_FALLTHRU);
1299 e1f->probability = REG_BR_PROB_BASE;
fade902a 1300 e1f->count = info->other_count;
b6e99746
MJ
1301
1302 e2f = make_edge (bb2, bbf, EDGE_FALLTHRU);
1303 e2f->probability = REG_BR_PROB_BASE;
fade902a 1304 e2f->count = info->default_count;
b6e99746
MJ
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
6ab1ab14
SB
1311 /* Tidy blocks that have become unreachable. */
1312 prune_bbs (bbd, info->final_bb);
b6e99746 1313
6ab1ab14 1314 /* Fixup the PHI nodes in bbF. */
fade902a 1315 fix_phi_nodes (e1f, e2f, bbf, info);
b6e99746 1316
6ab1ab14
SB
1317 /* Fix the dominator tree, if it is available. */
1318 if (dom_info_available_p (CDI_DOMINATORS))
1319 {
9771b263 1320 vec<basic_block> bbs_to_fix_dom;
6ab1ab14
SB
1321
1322 set_immediate_dominator (CDI_DOMINATORS, bb1, bb0);
1323 set_immediate_dominator (CDI_DOMINATORS, bb2, bb0);
531b10fc 1324 if (! get_immediate_dominator (CDI_DOMINATORS, bbf))
6ab1ab14
SB
1325 /* If bbD was the immediate dominator ... */
1326 set_immediate_dominator (CDI_DOMINATORS, bbf, bb0);
1327
9771b263
DN
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);
6ab1ab14
SB
1333
1334 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
9771b263 1335 bbs_to_fix_dom.release ();
6ab1ab14 1336 }
b6e99746
MJ
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
fade902a
SB
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. */
b6e99746 1344
fade902a 1345static const char *
726a989a 1346process_switch (gimple swtch)
b6e99746 1347{
fade902a 1348 struct switch_conv_info info;
b6e99746 1349
238065a7
SB
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";
886cd84f
SB
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
531b10fc
SB
1365 /* A switch on a constant should have been optimized in tree-cfg-cleanup. */
1366 gcc_checking_assert (! TREE_CONSTANT (info.index_expr));
886cd84f 1367
531b10fc 1368 if (info.uniq <= MAX_CASE_BIT_TESTS)
886cd84f 1369 {
531b10fc 1370 if (expand_switch_using_bit_tests_p (info.range_size,
72798784
RB
1371 info.uniq, info.count,
1372 optimize_bb_for_speed_p
1373 (gimple_bb (swtch))))
531b10fc
SB
1374 {
1375 if (dump_file)
1376 fputs (" expanding as bit test is preferable\n", dump_file);
aa79a1e1
JJ
1377 emit_case_bit_tests (swtch, info.index_expr, info.range_min,
1378 info.range_size, info.range_max);
726338f4 1379 loops_state_set (LOOPS_NEED_FIXUP);
531b10fc
SB
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";
886cd84f 1386 }
b6e99746 1387
531b10fc
SB
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
b6e99746 1392 /* Check the case label values are within reasonable range: */
886cd84f 1393 if (!check_range (&info))
fade902a
SB
1394 {
1395 gcc_assert (info.reason);
1396 return info.reason;
1397 }
b6e99746
MJ
1398
1399 /* For all the cases, see whether they are empty, the assignments they
1400 represent constant and so on... */
886cd84f 1401 if (! check_all_empty_except_final (&info))
8e97bc2b 1402 {
886cd84f
SB
1403 gcc_assert (info.reason);
1404 return info.reason;
8e97bc2b 1405 }
fade902a
SB
1406 if (!check_final_bb (&info))
1407 {
1408 gcc_assert (info.reason);
1409 return info.reason;
1410 }
b6e99746
MJ
1411
1412 /* At this point all checks have passed and we can proceed with the
1413 transformation. */
1414
fade902a 1415 create_temp_arrays (&info);
fd8d363e 1416 gather_default_values (gimple_switch_default_label (swtch), &info);
fade902a 1417 build_constructors (swtch, &info);
b6e99746 1418
fade902a
SB
1419 build_arrays (swtch, &info); /* Build the static arrays and assignments. */
1420 gen_inbound_check (swtch, &info); /* Build the bounds check. */
b6e99746
MJ
1421
1422 /* Cleanup: */
fade902a
SB
1423 free_temp_arrays (&info);
1424 return NULL;
b6e99746
MJ
1425}
1426
1427/* The main function of the pass scans statements for switches and invokes
1428 process_switch on them. */
1429
be55bfe6
TS
1430namespace {
1431
1432const pass_data pass_data_convert_switch =
1433{
1434 GIMPLE_PASS, /* type */
1435 "switchconv", /* name */
1436 OPTGROUP_NONE, /* optinfo_flags */
be55bfe6
TS
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 */
3bea341f 1442 TODO_update_ssa, /* todo_flags_finish */
be55bfe6
TS
1443};
1444
1445class pass_convert_switch : public gimple_opt_pass
1446{
1447public:
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
1458unsigned int
1459pass_convert_switch::execute (function *fun)
b6e99746
MJ
1460{
1461 basic_block bb;
1462
be55bfe6 1463 FOR_EACH_BB_FN (bb, fun)
b6e99746 1464 {
fade902a 1465 const char *failure_reason;
726a989a
RB
1466 gimple stmt = last_stmt (bb);
1467 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
b6e99746 1468 {
b6e99746
MJ
1469 if (dump_file)
1470 {
726a989a
RB
1471 expanded_location loc = expand_location (gimple_location (stmt));
1472
b6e99746
MJ
1473 fprintf (dump_file, "beginning to process the following "
1474 "SWITCH statement (%s:%d) : ------- \n",
1475 loc.file, loc.line);
726a989a 1476 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
edb30094 1477 putc ('\n', dump_file);
b6e99746
MJ
1478 }
1479
fade902a
SB
1480 failure_reason = process_switch (stmt);
1481 if (! failure_reason)
b6e99746
MJ
1482 {
1483 if (dump_file)
1484 {
edb30094
UB
1485 fputs ("Switch converted\n", dump_file);
1486 fputs ("--------------------------------\n", dump_file);
b6e99746 1487 }
531b10fc
SB
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);
b6e99746
MJ
1493 }
1494 else
1495 {
1496 if (dump_file)
1497 {
edb30094 1498 fputs ("Bailing out - ", dump_file);
fade902a
SB
1499 fputs (failure_reason, dump_file);
1500 fputs ("\n--------------------------------\n", dump_file);
b6e99746
MJ
1501 }
1502 }
1503 }
1504 }
1505
1506 return 0;
1507}
1508
27a4cd48
DM
1509} // anon namespace
1510
1511gimple_opt_pass *
1512make_pass_convert_switch (gcc::context *ctxt)
1513{
1514 return new pass_convert_switch (ctxt);
1515}