]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-switch-conversion.c
[62/77] Big machine_mode to scalar_int_mode replacement
[thirdparty/gcc.git] / gcc / tree-switch-conversion.c
CommitLineData
78b7a675 1/* Lower GIMPLE_SWITCH expressions to something more efficient than
2 a jump table.
aad93da1 3 Copyright (C) 2006-2017 Free Software Foundation, Inc.
a347af29 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
78b7a675 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"
9ef16211 28#include "backend.h"
7c29e30e 29#include "insn-codes.h"
30#include "rtl.h"
9ef16211 31#include "tree.h"
32#include "gimple.h"
7c29e30e 33#include "cfghooks.h"
34#include "tree-pass.h"
9ef16211 35#include "ssa.h"
7c29e30e 36#include "optabs-tree.h"
37#include "cgraph.h"
38#include "gimple-pretty-print.h"
78b7a675 39#include "params.h"
b20a8bb4 40#include "fold-const.h"
9ed99284 41#include "varasm.h"
42#include "stor-layout.h"
94ea8568 43#include "cfganal.h"
a8783bee 44#include "gimplify.h"
dcf1a1ec 45#include "gimple-iterator.h"
e795d6e1 46#include "gimplify-me.h"
073c1fd5 47#include "tree-cfg.h"
f6568ea4 48#include "cfgloop.h"
1d5640e3 49#include "alloc-pool.h"
50#include "target.h"
51#include "tree-into-ssa.h"
b9ed1410 52
53/* ??? For lang_hooks.types.type_for_mode, but is there a word_mode
54 type in the GIMPLE type system that is language-independent? */
78b7a675 55#include "langhooks.h"
56
78b7a675 57\f
58/* Maximum number of case bit tests.
59 FIXME: This should be derived from PARAM_CASE_VALUES_THRESHOLD and
60 targetm.case_values_threshold(), or be its own param. */
61#define MAX_CASE_BIT_TESTS 3
62
63/* Split the basic block at the statement pointed to by GSIP, and insert
64 a branch to the target basic block of E_TRUE conditional on tree
65 expression COND.
66
67 It is assumed that there is already an edge from the to-be-split
68 basic block to E_TRUE->dest block. This edge is removed, and the
69 profile information on the edge is re-used for the new conditional
70 jump.
71
72 The CFG is updated. The dominator tree will not be valid after
73 this transformation, but the immediate dominators are updated if
74 UPDATE_DOMINATORS is true.
75
76 Returns the newly created basic block. */
77
78static basic_block
79hoist_edge_and_branch_if_true (gimple_stmt_iterator *gsip,
80 tree cond, edge e_true,
81 bool update_dominators)
82{
83 tree tmp;
1a91d914 84 gcond *cond_stmt;
78b7a675 85 edge e_false;
86 basic_block new_bb, split_bb = gsi_bb (*gsip);
87 bool dominated_e_true = false;
88
89 gcc_assert (e_true->src == split_bb);
90
91 if (update_dominators
92 && get_immediate_dominator (CDI_DOMINATORS, e_true->dest) == split_bb)
93 dominated_e_true = true;
94
95 tmp = force_gimple_operand_gsi (gsip, cond, /*simple=*/true, NULL,
96 /*before=*/true, GSI_SAME_STMT);
97 cond_stmt = gimple_build_cond_from_tree (tmp, NULL_TREE, NULL_TREE);
98 gsi_insert_before (gsip, cond_stmt, GSI_SAME_STMT);
99
100 e_false = split_block (split_bb, cond_stmt);
101 new_bb = e_false->dest;
102 redirect_edge_pred (e_true, split_bb);
103
104 e_true->flags &= ~EDGE_FALLTHRU;
105 e_true->flags |= EDGE_TRUE_VALUE;
106
107 e_false->flags &= ~EDGE_FALLTHRU;
108 e_false->flags |= EDGE_FALSE_VALUE;
720cfc43 109 e_false->probability = e_true->probability.invert ();
78b7a675 110 e_false->count = split_bb->count - e_true->count;
111 new_bb->count = e_false->count;
112
113 if (update_dominators)
114 {
115 if (dominated_e_true)
116 set_immediate_dominator (CDI_DOMINATORS, e_true->dest, split_bb);
117 set_immediate_dominator (CDI_DOMINATORS, e_false->dest, split_bb);
118 }
119
120 return new_bb;
121}
122
123
78b7a675 124/* Return true if a switch should be expanded as a bit test.
125 RANGE is the difference between highest and lowest case.
126 UNIQ is number of unique case node targets, not counting the default case.
127 COUNT is the number of comparisons needed, not counting the default case. */
128
129static bool
130expand_switch_using_bit_tests_p (tree range,
131 unsigned int uniq,
637a765f 132 unsigned int count, bool speed_p)
78b7a675 133{
134 return (((uniq == 1 && count >= 3)
135 || (uniq == 2 && count >= 5)
136 || (uniq == 3 && count >= 6))
637a765f 137 && lshift_cheap_p (speed_p)
78b7a675 138 && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0
139 && compare_tree_int (range, 0) > 0);
140}
141\f
142/* Implement switch statements with bit tests
143
144A GIMPLE switch statement can be expanded to a short sequence of bit-wise
145comparisons. "switch(x)" is converted into "if ((1 << (x-MINVAL)) & CST)"
146where CST and MINVAL are integer constants. This is better than a series
147of compare-and-banch insns in some cases, e.g. we can implement:
148
149 if ((x==4) || (x==6) || (x==9) || (x==11))
150
151as a single bit test:
152
153 if ((1<<x) & ((1<<4)|(1<<6)|(1<<9)|(1<<11)))
154
155This transformation is only applied if the number of case targets is small,
d8ab4f2a 156if CST constains at least 3 bits, and "1 << x" is cheap. The bit tests are
78b7a675 157performed in "word_mode".
158
159The following example shows the code the transformation generates:
160
161 int bar(int x)
162 {
163 switch (x)
164 {
165 case '0': case '1': case '2': case '3': case '4':
166 case '5': case '6': case '7': case '8': case '9':
167 case 'A': case 'B': case 'C': case 'D': case 'E':
168 case 'F':
169 return 1;
170 }
171 return 0;
172 }
173
174==>
175
176 bar (int x)
177 {
178 tmp1 = x - 48;
179 if (tmp1 > (70 - 48)) goto L2;
180 tmp2 = 1 << tmp1;
181 tmp3 = 0b11111100000001111111111;
182 if ((tmp2 & tmp3) != 0) goto L1 ; else goto L2;
183 L1:
184 return 1;
185 L2:
186 return 0;
187 }
188
189TODO: There are still some improvements to this transformation that could
190be implemented:
191
192* A narrower mode than word_mode could be used if that is cheaper, e.g.
193 for x86_64 where a narrower-mode shift may result in smaller code.
194
195* The compounded constant could be shifted rather than the one. The
196 test would be either on the sign bit or on the least significant bit,
197 depending on the direction of the shift. On some machines, the test
198 for the branch would be free if the bit to test is already set by the
199 shift operation.
200
201This transformation was contributed by Roger Sayle, see this e-mail:
202 http://gcc.gnu.org/ml/gcc-patches/2003-01/msg01950.html
203*/
204
205/* A case_bit_test represents a set of case nodes that may be
206 selected from using a bit-wise comparison. HI and LO hold
207 the integer to be tested against, TARGET_EDGE contains the
208 edge to the basic block to jump to upon success and BITS
209 counts the number of case nodes handled by this test,
210 typically the number of bits set in HI:LO. The LABEL field
211 is used to quickly identify all cases in this set without
212 looking at label_to_block for every case label. */
213
214struct case_bit_test
215{
bcf8a30c 216 wide_int mask;
78b7a675 217 edge target_edge;
218 tree label;
219 int bits;
220};
221
222/* Comparison function for qsort to order bit tests by decreasing
223 probability of execution. Our best guess comes from a measured
224 profile. If the profile counts are equal, break even on the
225 number of case nodes, i.e. the node with the most cases gets
226 tested first.
227
228 TODO: Actually this currently runs before a profile is available.
229 Therefore the case-as-bit-tests transformation should be done
230 later in the pass pipeline, or something along the lines of
231 "Efficient and effective branch reordering using profile data"
232 (Yang et. al., 2002) should be implemented (although, how good
233 is a paper is called "Efficient and effective ..." when the
234 latter is implied by the former, but oh well...). */
235
236static int
237case_bit_test_cmp (const void *p1, const void *p2)
238{
239 const struct case_bit_test *const d1 = (const struct case_bit_test *) p1;
240 const struct case_bit_test *const d2 = (const struct case_bit_test *) p2;
241
db9cef39 242 if (d2->target_edge->count < d1->target_edge->count)
243 return -1;
244 if (d2->target_edge->count > d1->target_edge->count)
245 return 1;
78b7a675 246 if (d2->bits != d1->bits)
247 return d2->bits - d1->bits;
248
249 /* Stabilize the sort. */
250 return LABEL_DECL_UID (d2->label) - LABEL_DECL_UID (d1->label);
251}
252
253/* Expand a switch statement by a short sequence of bit-wise
254 comparisons. "switch(x)" is effectively converted into
255 "if ((1 << (x-MINVAL)) & CST)" where CST and MINVAL are
256 integer constants.
257
258 INDEX_EXPR is the value being switched on.
259
260 MINVAL is the lowest case value of in the case nodes,
261 and RANGE is highest value minus MINVAL. MINVAL and RANGE
262 are not guaranteed to be of the same type as INDEX_EXPR
263 (the gimplifier doesn't change the type of case label values,
264 and MINVAL and RANGE are derived from those values).
bcf8a30c 265 MAXVAL is MINVAL + RANGE.
78b7a675 266
267 There *MUST* be MAX_CASE_BIT_TESTS or less unique case
268 node targets. */
269
270static void
1a91d914 271emit_case_bit_tests (gswitch *swtch, tree index_expr,
bcf8a30c 272 tree minval, tree range, tree maxval)
78b7a675 273{
5eff5c71 274 struct case_bit_test test[MAX_CASE_BIT_TESTS] = { {} };
78b7a675 275 unsigned int i, j, k;
276 unsigned int count;
277
278 basic_block switch_bb = gimple_bb (swtch);
279 basic_block default_bb, new_default_bb, new_bb;
280 edge default_edge;
281 bool update_dom = dom_info_available_p (CDI_DOMINATORS);
282
1e094109 283 vec<basic_block> bbs_to_fix_dom = vNULL;
78b7a675 284
285 tree index_type = TREE_TYPE (index_expr);
286 tree unsigned_index_type = unsigned_type_for (index_type);
287 unsigned int branch_num = gimple_switch_num_labels (swtch);
288
289 gimple_stmt_iterator gsi;
1a91d914 290 gassign *shift_stmt;
78b7a675 291
292 tree idx, tmp, csui;
293 tree word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
294 tree word_mode_zero = fold_convert (word_type_node, integer_zero_node);
295 tree word_mode_one = fold_convert (word_type_node, integer_one_node);
bcf8a30c 296 int prec = TYPE_PRECISION (word_type_node);
297 wide_int wone = wi::one (prec);
78b7a675 298
78b7a675 299 /* Get the edge for the default case. */
49a70175 300 tmp = gimple_switch_default_label (swtch);
78b7a675 301 default_bb = label_to_block (CASE_LABEL (tmp));
302 default_edge = find_edge (switch_bb, default_bb);
303
304 /* Go through all case labels, and collect the case labels, profile
305 counts, and other information we need to build the branch tests. */
306 count = 0;
307 for (i = 1; i < branch_num; i++)
308 {
309 unsigned int lo, hi;
310 tree cs = gimple_switch_label (swtch, i);
311 tree label = CASE_LABEL (cs);
3a7ac8c6 312 edge e = find_edge (switch_bb, label_to_block (label));
78b7a675 313 for (k = 0; k < count; k++)
3a7ac8c6 314 if (e == test[k].target_edge)
78b7a675 315 break;
316
317 if (k == count)
318 {
78b7a675 319 gcc_checking_assert (count < MAX_CASE_BIT_TESTS);
bcf8a30c 320 test[k].mask = wi::zero (prec);
78b7a675 321 test[k].target_edge = e;
322 test[k].label = label;
323 test[k].bits = 1;
324 count++;
325 }
326 else
327 test[k].bits++;
328
e913b5cd 329 lo = tree_to_uhwi (int_const_binop (MINUS_EXPR,
330 CASE_LOW (cs), minval));
78b7a675 331 if (CASE_HIGH (cs) == NULL_TREE)
332 hi = lo;
333 else
08f817b3 334 hi = tree_to_uhwi (int_const_binop (MINUS_EXPR,
e913b5cd 335 CASE_HIGH (cs), minval));
78b7a675 336
337 for (j = lo; j <= hi; j++)
bcf8a30c 338 test[k].mask |= wi::lshift (wone, j);
78b7a675 339 }
340
9af5ce0c 341 qsort (test, count, sizeof (*test), case_bit_test_cmp);
78b7a675 342
bcf8a30c 343 /* If all values are in the 0 .. BITS_PER_WORD-1 range, we can get rid of
344 the minval subtractions, but it might make the mask constants more
345 expensive. So, compare the costs. */
346 if (compare_tree_int (minval, 0) > 0
347 && compare_tree_int (maxval, GET_MODE_BITSIZE (word_mode)) < 0)
348 {
349 int cost_diff;
350 HOST_WIDE_INT m = tree_to_uhwi (minval);
351 rtx reg = gen_raw_REG (word_mode, 10000);
352 bool speed_p = optimize_bb_for_speed_p (gimple_bb (swtch));
353 cost_diff = set_rtx_cost (gen_rtx_PLUS (word_mode, reg,
354 GEN_INT (-m)), speed_p);
355 for (i = 0; i < count; i++)
356 {
357 rtx r = immed_wide_int_const (test[i].mask, word_mode);
5ae4887d 358 cost_diff += set_src_cost (gen_rtx_AND (word_mode, reg, r),
359 word_mode, speed_p);
bcf8a30c 360 r = immed_wide_int_const (wi::lshift (test[i].mask, m), word_mode);
5ae4887d 361 cost_diff -= set_src_cost (gen_rtx_AND (word_mode, reg, r),
362 word_mode, speed_p);
bcf8a30c 363 }
364 if (cost_diff > 0)
365 {
366 for (i = 0; i < count; i++)
367 test[i].mask = wi::lshift (test[i].mask, m);
368 minval = build_zero_cst (TREE_TYPE (minval));
369 range = maxval;
370 }
371 }
372
78b7a675 373 /* We generate two jumps to the default case label.
374 Split the default edge, so that we don't have to do any PHI node
375 updating. */
376 new_default_bb = split_edge (default_edge);
377
378 if (update_dom)
379 {
f1f41a6c 380 bbs_to_fix_dom.create (10);
381 bbs_to_fix_dom.quick_push (switch_bb);
382 bbs_to_fix_dom.quick_push (default_bb);
383 bbs_to_fix_dom.quick_push (new_default_bb);
78b7a675 384 }
385
386 /* Now build the test-and-branch code. */
387
388 gsi = gsi_last_bb (switch_bb);
389
9e394672 390 /* idx = (unsigned)x - minval. */
391 idx = fold_convert (unsigned_index_type, index_expr);
392 idx = fold_build2 (MINUS_EXPR, unsigned_index_type, idx,
393 fold_convert (unsigned_index_type, minval));
78b7a675 394 idx = force_gimple_operand_gsi (&gsi, idx,
395 /*simple=*/true, NULL_TREE,
396 /*before=*/true, GSI_SAME_STMT);
397
398 /* if (idx > range) goto default */
399 range = force_gimple_operand_gsi (&gsi,
400 fold_convert (unsigned_index_type, range),
401 /*simple=*/true, NULL_TREE,
402 /*before=*/true, GSI_SAME_STMT);
403 tmp = fold_build2 (GT_EXPR, boolean_type_node, idx, range);
404 new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, default_edge, update_dom);
405 if (update_dom)
f1f41a6c 406 bbs_to_fix_dom.quick_push (new_bb);
78b7a675 407 gcc_assert (gimple_bb (swtch) == new_bb);
408 gsi = gsi_last_bb (new_bb);
409
410 /* Any blocks dominated by the GIMPLE_SWITCH, but that are not successors
411 of NEW_BB, are still immediately dominated by SWITCH_BB. Make it so. */
412 if (update_dom)
413 {
f1f41a6c 414 vec<basic_block> dom_bbs;
78b7a675 415 basic_block dom_son;
416
417 dom_bbs = get_dominated_by (CDI_DOMINATORS, new_bb);
f1f41a6c 418 FOR_EACH_VEC_ELT (dom_bbs, i, dom_son)
78b7a675 419 {
420 edge e = find_edge (new_bb, dom_son);
421 if (e && single_pred_p (e->dest))
422 continue;
423 set_immediate_dominator (CDI_DOMINATORS, dom_son, switch_bb);
f1f41a6c 424 bbs_to_fix_dom.safe_push (dom_son);
78b7a675 425 }
f1f41a6c 426 dom_bbs.release ();
78b7a675 427 }
428
429 /* csui = (1 << (word_mode) idx) */
f9e245b2 430 csui = make_ssa_name (word_type_node);
78b7a675 431 tmp = fold_build2 (LSHIFT_EXPR, word_type_node, word_mode_one,
432 fold_convert (word_type_node, idx));
433 tmp = force_gimple_operand_gsi (&gsi, tmp,
434 /*simple=*/false, NULL_TREE,
435 /*before=*/true, GSI_SAME_STMT);
436 shift_stmt = gimple_build_assign (csui, tmp);
78b7a675 437 gsi_insert_before (&gsi, shift_stmt, GSI_SAME_STMT);
438 update_stmt (shift_stmt);
439
440 /* for each unique set of cases:
441 if (const & csui) goto target */
442 for (k = 0; k < count; k++)
443 {
bcf8a30c 444 tmp = wide_int_to_tree (word_type_node, test[k].mask);
78b7a675 445 tmp = fold_build2 (BIT_AND_EXPR, word_type_node, csui, tmp);
446 tmp = force_gimple_operand_gsi (&gsi, tmp,
447 /*simple=*/true, NULL_TREE,
448 /*before=*/true, GSI_SAME_STMT);
449 tmp = fold_build2 (NE_EXPR, boolean_type_node, tmp, word_mode_zero);
450 new_bb = hoist_edge_and_branch_if_true (&gsi, tmp, test[k].target_edge,
451 update_dom);
452 if (update_dom)
f1f41a6c 453 bbs_to_fix_dom.safe_push (new_bb);
78b7a675 454 gcc_assert (gimple_bb (swtch) == new_bb);
455 gsi = gsi_last_bb (new_bb);
456 }
457
458 /* We should have removed all edges now. */
459 gcc_assert (EDGE_COUNT (gsi_bb (gsi)->succs) == 0);
460
461 /* If nothing matched, go to the default label. */
462 make_edge (gsi_bb (gsi), new_default_bb, EDGE_FALLTHRU);
463
464 /* The GIMPLE_SWITCH is now redundant. */
465 gsi_remove (&gsi, true);
466
467 if (update_dom)
468 {
469 /* Fix up the dominator tree. */
470 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
f1f41a6c 471 bbs_to_fix_dom.release ();
78b7a675 472 }
473}
474\f
a347af29 475/*
476 Switch initialization conversion
477
478The following pass changes simple initializations of scalars in a switch
5d459527 479statement into initializations from a static array. Obviously, the values
480must be constant and known at compile time and a default branch must be
a347af29 481provided. For example, the following code:
482
483 int a,b;
484
485 switch (argc)
486 {
487 case 1:
488 case 2:
489 a_1 = 8;
490 b_1 = 6;
491 break;
492 case 3:
493 a_2 = 9;
494 b_2 = 5;
495 break;
496 case 12:
497 a_3 = 10;
498 b_3 = 4;
499 break;
500 default:
501 a_4 = 16;
502 b_4 = 1;
11f2f313 503 break;
a347af29 504 }
505 a_5 = PHI <a_1, a_2, a_3, a_4>
506 b_5 = PHI <b_1, b_2, b_3, b_4>
507
508
509is changed into:
510
511 static const int = CSWTCH01[] = {6, 6, 5, 1, 1, 1, 1, 1, 1, 1, 1, 4};
512 static const int = CSWTCH02[] = {8, 8, 9, 16, 16, 16, 16, 16, 16, 16,
513 16, 16, 10};
514
515 if (((unsigned) argc) - 1 < 11)
516 {
517 a_6 = CSWTCH02[argc - 1];
518 b_6 = CSWTCH01[argc - 1];
519 }
520 else
521 {
522 a_7 = 16;
523 b_7 = 1;
524 }
11f2f313 525 a_5 = PHI <a_6, a_7>
526 b_b = PHI <b_6, b_7>
a347af29 527
528There are further constraints. Specifically, the range of values across all
529case labels must not be bigger than SWITCH_CONVERSION_BRANCH_RATIO (default
78b7a675 530eight) times the number of the actual switch branches.
a347af29 531
78b7a675 532This transformation was contributed by Martin Jambor, see this e-mail:
533 http://gcc.gnu.org/ml/gcc-patches/2008-07/msg00011.html */
a347af29 534
535/* The main structure of the pass. */
536struct switch_conv_info
537{
11f2f313 538 /* The expression used to decide the switch branch. */
a347af29 539 tree index_expr;
540
11f2f313 541 /* The following integer constants store the minimum and maximum value
542 covered by the case labels. */
a347af29 543 tree range_min;
11f2f313 544 tree range_max;
a347af29 545
11f2f313 546 /* The difference between the above two numbers. Stored here because it
547 is used in all the conversion heuristics, as well as for some of the
548 transformation, and it is expensive to re-compute it all the time. */
a347af29 549 tree range_size;
550
11f2f313 551 /* Basic block that contains the actual GIMPLE_SWITCH. */
a347af29 552 basic_block switch_bb;
553
11f2f313 554 /* Basic block that is the target of the default case. */
555 basic_block default_bb;
556
557 /* The single successor block of all branches out of the GIMPLE_SWITCH,
558 if such a block exists. Otherwise NULL. */
a347af29 559 basic_block final_bb;
560
11f2f313 561 /* The probability of the default edge in the replaced switch. */
720cfc43 562 profile_probability default_prob;
11f2f313 563
564 /* The count of the default edge in the replaced switch. */
db9cef39 565 profile_count default_count;
11f2f313 566
567 /* Combined count of all other (non-default) edges in the replaced switch. */
db9cef39 568 profile_count other_count;
11f2f313 569
a347af29 570 /* Number of phi nodes in the final bb (that we'll be replacing). */
571 int phi_count;
572
cc17b19b 573 /* Array of default values, in the same order as phi nodes. */
a347af29 574 tree *default_values;
575
576 /* Constructors of new static arrays. */
f1f41a6c 577 vec<constructor_elt, va_gc> **constructors;
a347af29 578
579 /* Array of ssa names that are initialized with a value from a new static
580 array. */
581 tree *target_inbound_names;
582
583 /* Array of ssa names that are initialized with the default value if the
584 switch expression is out of range. */
585 tree *target_outbound_names;
586
7992e6b5 587 /* VOP SSA_NAME. */
588 tree target_vop;
589
cc17b19b 590 /* The first load statement that loads a temporary from a new static array.
591 */
42acab1c 592 gimple *arr_ref_first;
a347af29 593
594 /* The last load statement that loads a temporary from a new static array. */
42acab1c 595 gimple *arr_ref_last;
a347af29 596
597 /* String reason why the case wasn't a good candidate that is written to the
598 dump file, if there is one. */
599 const char *reason;
df2813c5 600
c66f9851 601 /* True if default case is not used for any value between range_min and
602 range_max inclusive. */
603 bool contiguous_range;
604
605 /* True if default case does not have the required shape for other case
606 labels. */
607 bool default_case_nonstandard;
608
df2813c5 609 /* Parameters for expand_switch_using_bit_tests. Should be computed
610 the same way as in expand_case. */
11f2f313 611 unsigned int uniq;
612 unsigned int count;
a347af29 613};
614
11f2f313 615/* Collect information about GIMPLE_SWITCH statement SWTCH into INFO. */
a347af29 616
11f2f313 617static void
1a91d914 618collect_switch_conv_info (gswitch *swtch, struct switch_conv_info *info)
a347af29 619{
75a70cf9 620 unsigned int branch_num = gimple_switch_num_labels (swtch);
11f2f313 621 tree min_case, max_case;
622 unsigned int count, i;
c66f9851 623 edge e, e_default, e_first;
11f2f313 624 edge_iterator ei;
c66f9851 625 basic_block first;
11f2f313 626
627 memset (info, 0, sizeof (*info));
a347af29 628
629 /* The gimplifier has already sorted the cases by CASE_LOW and ensured there
49a70175 630 is a default label which is the first in the vector.
631 Collect the bits we can deduce from the CFG. */
11f2f313 632 info->index_expr = gimple_switch_index (swtch);
633 info->switch_bb = gimple_bb (swtch);
c66f9851 634 info->default_bb
635 = label_to_block (CASE_LABEL (gimple_switch_default_label (swtch)));
11f2f313 636 e_default = find_edge (info->switch_bb, info->default_bb);
637 info->default_prob = e_default->probability;
638 info->default_count = e_default->count;
639 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
640 if (e != e_default)
641 info->other_count += e->count;
a347af29 642
c66f9851 643 /* Get upper and lower bounds of case values, and the covered range. */
644 min_case = gimple_switch_label (swtch, 1);
645 max_case = gimple_switch_label (swtch, branch_num - 1);
646
647 info->range_min = CASE_LOW (min_case);
648 if (CASE_HIGH (max_case) != NULL_TREE)
649 info->range_max = CASE_HIGH (max_case);
650 else
651 info->range_max = CASE_LOW (max_case);
652
653 info->contiguous_range = true;
654 tree last = CASE_HIGH (min_case) ? CASE_HIGH (min_case) : info->range_min;
655 for (i = 2; i < branch_num; i++)
656 {
657 tree elt = gimple_switch_label (swtch, i);
658 wide_int w = last;
659 if (w + 1 != CASE_LOW (elt))
660 {
661 info->contiguous_range = false;
662 break;
663 }
664 last = CASE_HIGH (elt) ? CASE_HIGH (elt) : CASE_LOW (elt);
665 }
666
667 if (info->contiguous_range)
668 {
669 first = label_to_block (CASE_LABEL (gimple_switch_label (swtch, 1)));
670 e_first = find_edge (info->switch_bb, first);
671 }
672 else
673 {
674 first = info->default_bb;
675 e_first = e_default;
676 }
677
11f2f313 678 /* See if there is one common successor block for all branch
1c36b19f 679 targets. If it exists, record it in FINAL_BB.
c66f9851 680 Start with the destination of the first non-default case
681 if the range is contiguous and default case otherwise as
682 guess or its destination in case it is a forwarder block. */
683 if (! single_pred_p (e_first->dest))
684 info->final_bb = e_first->dest;
685 else if (single_succ_p (e_first->dest)
686 && ! single_pred_p (single_succ (e_first->dest)))
687 info->final_bb = single_succ (e_first->dest);
1c36b19f 688 /* Require that all switch destinations are either that common
c66f9851 689 FINAL_BB or a forwarder to it, except for the default
690 case if contiguous range. */
11f2f313 691 if (info->final_bb)
692 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
693 {
694 if (e->dest == info->final_bb)
695 continue;
696
697 if (single_pred_p (e->dest)
698 && single_succ_p (e->dest)
699 && single_succ (e->dest) == info->final_bb)
700 continue;
701
c66f9851 702 if (e == e_default && info->contiguous_range)
703 {
704 info->default_case_nonstandard = true;
705 continue;
706 }
707
11f2f313 708 info->final_bb = NULL;
709 break;
710 }
711
c66f9851 712 info->range_size
713 = int_const_binop (MINUS_EXPR, info->range_max, info->range_min);
a347af29 714
11f2f313 715 /* Get a count of the number of case labels. Single-valued case labels
716 simply count as one, but a case range counts double, since it may
717 require two compares if it gets lowered as a branching tree. */
718 count = 0;
719 for (i = 1; i < branch_num; i++)
720 {
721 tree elt = gimple_switch_label (swtch, i);
722 count++;
723 if (CASE_HIGH (elt)
724 && ! tree_int_cst_equal (CASE_LOW (elt), CASE_HIGH (elt)))
725 count++;
726 }
727 info->count = count;
728
729 /* Get the number of unique non-default targets out of the GIMPLE_SWITCH
730 block. Assume a CFG cleanup would have already removed degenerate
731 switch statements, this allows us to just use EDGE_COUNT. */
732 info->uniq = EDGE_COUNT (gimple_bb (swtch)->succs) - 1;
733}
a347af29 734
11f2f313 735/* Checks whether the range given by individual case statements of the SWTCH
736 switch statement isn't too big and whether the number of branches actually
737 satisfies the size of the new array. */
a347af29 738
11f2f313 739static bool
740check_range (struct switch_conv_info *info)
741{
5d459527 742 gcc_assert (info->range_size);
e913b5cd 743 if (!tree_fits_uhwi_p (info->range_size))
a347af29 744 {
5d459527 745 info->reason = "index range way too large or otherwise unusable";
a347af29 746 return false;
747 }
748
aa59f000 749 if (tree_to_uhwi (info->range_size)
11f2f313 750 > ((unsigned) info->count * SWITCH_CONVERSION_BRANCH_RATIO))
a347af29 751 {
5d459527 752 info->reason = "the maximum range-branch ratio exceeded";
a347af29 753 return false;
754 }
755
756 return true;
757}
758
11f2f313 759/* Checks whether all but the FINAL_BB basic blocks are empty. */
a347af29 760
761static bool
11f2f313 762check_all_empty_except_final (struct switch_conv_info *info)
a347af29 763{
c66f9851 764 edge e, e_default = find_edge (info->switch_bb, info->default_bb);
11f2f313 765 edge_iterator ei;
a347af29 766
11f2f313 767 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
a347af29 768 {
11f2f313 769 if (e->dest == info->final_bb)
770 continue;
a347af29 771
11f2f313 772 if (!empty_block_p (e->dest))
a347af29 773 {
c66f9851 774 if (info->contiguous_range && e == e_default)
775 {
776 info->default_case_nonstandard = true;
777 continue;
778 }
779
5d459527 780 info->reason = "bad case - a non-final BB not empty";
a347af29 781 return false;
782 }
a347af29 783 }
784
785 return true;
786}
787
788/* This function checks whether all required values in phi nodes in final_bb
789 are constants. Required values are those that correspond to a basic block
790 which is a part of the examined switch statement. It returns true if the
791 phi nodes are OK, otherwise false. */
792
793static bool
c66f9851 794check_final_bb (gswitch *swtch, struct switch_conv_info *info)
a347af29 795{
1a91d914 796 gphi_iterator gsi;
a347af29 797
5d459527 798 info->phi_count = 0;
799 for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
a347af29 800 {
1a91d914 801 gphi *phi = gsi.phi ();
75a70cf9 802 unsigned int i;
a347af29 803
c66f9851 804 if (virtual_operand_p (gimple_phi_result (phi)))
805 continue;
806
5d459527 807 info->phi_count++;
a347af29 808
75a70cf9 809 for (i = 0; i < gimple_phi_num_args (phi); i++)
a347af29 810 {
75a70cf9 811 basic_block bb = gimple_phi_arg_edge (phi, i)->src;
a347af29 812
5d459527 813 if (bb == info->switch_bb
c66f9851 814 || (single_pred_p (bb)
815 && single_pred (bb) == info->switch_bb
816 && (!info->default_case_nonstandard
817 || empty_block_p (bb))))
a347af29 818 {
54af7f7e 819 tree reloc, val;
c66f9851 820 const char *reason = NULL;
54af7f7e 821
822 val = gimple_phi_arg_def (phi, i);
823 if (!is_gimple_ip_invariant (val))
c66f9851 824 reason = "non-invariant value from a case";
825 else
54af7f7e 826 {
c66f9851 827 reloc = initializer_constant_valid_p (val, TREE_TYPE (val));
828 if ((flag_pic && reloc != null_pointer_node)
829 || (!flag_pic && reloc == NULL_TREE))
830 {
831 if (reloc)
832 reason
833 = "value from a case would need runtime relocations";
834 else
835 reason
836 = "value from a case is not a valid initializer";
837 }
54af7f7e 838 }
c66f9851 839 if (reason)
54af7f7e 840 {
c66f9851 841 /* For contiguous range, we can allow non-constant
842 or one that needs relocation, as long as it is
843 only reachable from the default case. */
844 if (bb == info->switch_bb)
845 bb = info->final_bb;
846 if (!info->contiguous_range || bb != info->default_bb)
847 {
848 info->reason = reason;
849 return false;
850 }
851
852 unsigned int branch_num = gimple_switch_num_labels (swtch);
853 for (unsigned int i = 1; i < branch_num; i++)
854 {
855 tree lab = CASE_LABEL (gimple_switch_label (swtch, i));
856 if (label_to_block (lab) == bb)
857 {
858 info->reason = reason;
859 return false;
860 }
861 }
862 info->default_case_nonstandard = true;
54af7f7e 863 }
a347af29 864 }
865 }
866 }
867
868 return true;
869}
870
871/* The following function allocates default_values, target_{in,out}_names and
872 constructors arrays. The last one is also populated with pointers to
873 vectors that will become constructors of new arrays. */
874
875static void
5d459527 876create_temp_arrays (struct switch_conv_info *info)
a347af29 877{
878 int i;
879
5d459527 880 info->default_values = XCNEWVEC (tree, info->phi_count * 3);
f1f41a6c 881 /* ??? Macros do not support multi argument templates in their
882 argument list. We create a typedef to work around that problem. */
883 typedef vec<constructor_elt, va_gc> *vec_constructor_elt_gc;
884 info->constructors = XCNEWVEC (vec_constructor_elt_gc, info->phi_count);
5d459527 885 info->target_inbound_names = info->default_values + info->phi_count;
886 info->target_outbound_names = info->target_inbound_names + info->phi_count;
887 for (i = 0; i < info->phi_count; i++)
e913b5cd 888 vec_alloc (info->constructors[i], tree_to_uhwi (info->range_size) + 1);
a347af29 889}
890
891/* Free the arrays created by create_temp_arrays(). The vectors that are
892 created by that function are not freed here, however, because they have
893 already become constructors and must be preserved. */
894
895static void
5d459527 896free_temp_arrays (struct switch_conv_info *info)
a347af29 897{
5d459527 898 XDELETEVEC (info->constructors);
899 XDELETEVEC (info->default_values);
a347af29 900}
901
902/* Populate the array of default values in the order of phi nodes.
c66f9851 903 DEFAULT_CASE is the CASE_LABEL_EXPR for the default switch branch
904 if the range is non-contiguous or the default case has standard
905 structure, otherwise it is the first non-default case instead. */
a347af29 906
907static void
5d459527 908gather_default_values (tree default_case, struct switch_conv_info *info)
a347af29 909{
1a91d914 910 gphi_iterator gsi;
a347af29 911 basic_block bb = label_to_block (CASE_LABEL (default_case));
912 edge e;
75a70cf9 913 int i = 0;
a347af29 914
c66f9851 915 gcc_assert (CASE_LOW (default_case) == NULL_TREE
916 || info->default_case_nonstandard);
a347af29 917
5d459527 918 if (bb == info->final_bb)
919 e = find_edge (info->switch_bb, bb);
a347af29 920 else
921 e = single_succ_edge (bb);
922
5d459527 923 for (gsi = gsi_start_phis (info->final_bb); !gsi_end_p (gsi); gsi_next (&gsi))
a347af29 924 {
1a91d914 925 gphi *phi = gsi.phi ();
c66f9851 926 if (virtual_operand_p (gimple_phi_result (phi)))
927 continue;
a347af29 928 tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
929 gcc_assert (val);
5d459527 930 info->default_values[i++] = val;
a347af29 931 }
932}
933
934/* The following function populates the vectors in the constructors array with
935 future contents of the static arrays. The vectors are populated in the
936 order of phi nodes. SWTCH is the switch statement being converted. */
937
938static void
1a91d914 939build_constructors (gswitch *swtch, struct switch_conv_info *info)
a347af29 940{
75a70cf9 941 unsigned i, branch_num = gimple_switch_num_labels (swtch);
5d459527 942 tree pos = info->range_min;
c66f9851 943 tree pos_one = build_int_cst (TREE_TYPE (pos), 1);
a347af29 944
75a70cf9 945 for (i = 1; i < branch_num; i++)
a347af29 946 {
75a70cf9 947 tree cs = gimple_switch_label (swtch, i);
a347af29 948 basic_block bb = label_to_block (CASE_LABEL (cs));
949 edge e;
75a70cf9 950 tree high;
1a91d914 951 gphi_iterator gsi;
a347af29 952 int j;
953
5d459527 954 if (bb == info->final_bb)
955 e = find_edge (info->switch_bb, bb);
a347af29 956 else
957 e = single_succ_edge (bb);
958 gcc_assert (e);
959
960 while (tree_int_cst_lt (pos, CASE_LOW (cs)))
961 {
962 int k;
c66f9851 963 gcc_assert (!info->contiguous_range);
5d459527 964 for (k = 0; k < info->phi_count; k++)
a347af29 965 {
e82e4eb5 966 constructor_elt elt;
a347af29 967
e82e4eb5 968 elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
827e392b 969 elt.value
970 = unshare_expr_without_location (info->default_values[k]);
f1f41a6c 971 info->constructors[k]->quick_push (elt);
a347af29 972 }
973
c66f9851 974 pos = int_const_binop (PLUS_EXPR, pos, pos_one);
a347af29 975 }
cc17b19b 976 gcc_assert (tree_int_cst_equal (pos, CASE_LOW (cs)));
a347af29 977
978 j = 0;
979 if (CASE_HIGH (cs))
980 high = CASE_HIGH (cs);
981 else
cc17b19b 982 high = CASE_LOW (cs);
5d459527 983 for (gsi = gsi_start_phis (info->final_bb);
75a70cf9 984 !gsi_end_p (gsi); gsi_next (&gsi))
a347af29 985 {
1a91d914 986 gphi *phi = gsi.phi ();
c66f9851 987 if (virtual_operand_p (gimple_phi_result (phi)))
988 continue;
a347af29 989 tree val = PHI_ARG_DEF_FROM_EDGE (phi, e);
7558c999 990 tree low = CASE_LOW (cs);
a347af29 991 pos = CASE_LOW (cs);
992
48e1416a 993 do
a347af29 994 {
e82e4eb5 995 constructor_elt elt;
a347af29 996
e82e4eb5 997 elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
827e392b 998 elt.value = unshare_expr_without_location (val);
f1f41a6c 999 info->constructors[j]->quick_push (elt);
a347af29 1000
c66f9851 1001 pos = int_const_binop (PLUS_EXPR, pos, pos_one);
f6ac75a7 1002 } while (!tree_int_cst_lt (high, pos)
1003 && tree_int_cst_lt (low, pos));
a347af29 1004 j++;
1005 }
1006 }
1007}
1008
f6ac75a7 1009/* If all values in the constructor vector are the same, return the value.
1010 Otherwise return NULL_TREE. Not supposed to be called for empty
1011 vectors. */
1012
1013static tree
f1f41a6c 1014constructor_contains_same_values_p (vec<constructor_elt, va_gc> *vec)
f6ac75a7 1015{
df2813c5 1016 unsigned int i;
f6ac75a7 1017 tree prev = NULL_TREE;
df2813c5 1018 constructor_elt *elt;
f6ac75a7 1019
f1f41a6c 1020 FOR_EACH_VEC_SAFE_ELT (vec, i, elt)
f6ac75a7 1021 {
f6ac75a7 1022 if (!prev)
1023 prev = elt->value;
1024 else if (!operand_equal_p (elt->value, prev, OEP_ONLY_CONST))
1025 return NULL_TREE;
1026 }
1027 return prev;
1028}
1029
ec4f3cf1 1030/* Return type which should be used for array elements, either TYPE's
1031 main variant or, for integral types, some smaller integral type
1032 that can still hold all the constants. */
df2813c5 1033
1034static tree
1a91d914 1035array_value_type (gswitch *swtch, tree type, int num,
5d459527 1036 struct switch_conv_info *info)
df2813c5 1037{
f1f41a6c 1038 unsigned int i, len = vec_safe_length (info->constructors[num]);
df2813c5 1039 constructor_elt *elt;
df2813c5 1040 int sign = 0;
1041 tree smaller_type;
1042
ec4f3cf1 1043 /* Types with alignments greater than their size can reach here, e.g. out of
1044 SRA. We couldn't use these as an array component type so get back to the
1045 main variant first, which, for our purposes, is fine for other types as
1046 well. */
1047
1048 type = TYPE_MAIN_VARIANT (type);
1049
df2813c5 1050 if (!INTEGRAL_TYPE_P (type))
1051 return type;
1052
03b7a719 1053 scalar_int_mode type_mode = SCALAR_INT_TYPE_MODE (type);
f77c4496 1054 scalar_int_mode mode = get_narrowest_mode (type_mode);
125344e3 1055 if (GET_MODE_SIZE (type_mode) <= GET_MODE_SIZE (mode))
df2813c5 1056 return type;
1057
1058 if (len < (optimize_bb_for_size_p (gimple_bb (swtch)) ? 2 : 32))
1059 return type;
1060
f1f41a6c 1061 FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
df2813c5 1062 {
e913b5cd 1063 wide_int cst;
df2813c5 1064
1065 if (TREE_CODE (elt->value) != INTEGER_CST)
1066 return type;
1067
e913b5cd 1068 cst = elt->value;
df2813c5 1069 while (1)
1070 {
1071 unsigned int prec = GET_MODE_BITSIZE (mode);
1072 if (prec > HOST_BITS_PER_WIDE_INT)
1073 return type;
1074
796b6678 1075 if (sign >= 0 && cst == wi::zext (cst, prec))
df2813c5 1076 {
796b6678 1077 if (sign == 0 && cst == wi::sext (cst, prec))
df2813c5 1078 break;
1079 sign = 1;
1080 break;
1081 }
796b6678 1082 if (sign <= 0 && cst == wi::sext (cst, prec))
df2813c5 1083 {
1084 sign = -1;
1085 break;
1086 }
1087
1088 if (sign == 1)
1089 sign = 0;
1090
28ebc73c 1091 if (!GET_MODE_WIDER_MODE (mode).exists (&mode)
125344e3 1092 || GET_MODE_SIZE (mode) >= GET_MODE_SIZE (type_mode))
df2813c5 1093 return type;
1094 }
1095 }
1096
1097 if (sign == 0)
1098 sign = TYPE_UNSIGNED (type) ? 1 : -1;
1099 smaller_type = lang_hooks.types.type_for_mode (mode, sign >= 0);
03b7a719 1100 if (GET_MODE_SIZE (type_mode)
1101 <= GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (smaller_type)))
df2813c5 1102 return type;
1103
1104 return smaller_type;
1105}
1106
a347af29 1107/* Create an appropriate array type and declaration and assemble a static array
1108 variable. Also create a load statement that initializes the variable in
1109 question with a value from the static array. SWTCH is the switch statement
1110 being converted, NUM is the index to arrays of constructors, default values
1111 and target SSA names for this particular array. ARR_INDEX_TYPE is the type
1112 of the index of the new array, PHI is the phi node of the final BB that
1113 corresponds to the value that will be loaded from the created array. TIDX
f6ac75a7 1114 is an ssa name of a temporary variable holding the index for loads from the
1115 new array. */
a347af29 1116
1117static void
1a91d914 1118build_one_array (gswitch *swtch, int num, tree arr_index_type,
1119 gphi *phi, tree tidx, struct switch_conv_info *info)
a347af29 1120{
f6ac75a7 1121 tree name, cst;
42acab1c 1122 gimple *load;
f6ac75a7 1123 gimple_stmt_iterator gsi = gsi_for_stmt (swtch);
e60a6f7b 1124 location_t loc = gimple_location (swtch);
a347af29 1125
5d459527 1126 gcc_assert (info->default_values[num]);
a347af29 1127
f9e245b2 1128 name = copy_ssa_name (PHI_RESULT (phi));
5d459527 1129 info->target_inbound_names[num] = name;
a347af29 1130
5d459527 1131 cst = constructor_contains_same_values_p (info->constructors[num]);
f6ac75a7 1132 if (cst)
1133 load = gimple_build_assign (name, cst);
1134 else
1135 {
df2813c5 1136 tree array_type, ctor, decl, value_type, fetch, default_type;
f6ac75a7 1137
5d459527 1138 default_type = TREE_TYPE (info->default_values[num]);
1139 value_type = array_value_type (swtch, default_type, num, info);
f6ac75a7 1140 array_type = build_array_type (value_type, arr_index_type);
df2813c5 1141 if (default_type != value_type)
1142 {
1143 unsigned int i;
1144 constructor_elt *elt;
1145
f1f41a6c 1146 FOR_EACH_VEC_SAFE_ELT (info->constructors[num], i, elt)
df2813c5 1147 elt->value = fold_convert (value_type, elt->value);
1148 }
5d459527 1149 ctor = build_constructor (array_type, info->constructors[num]);
f6ac75a7 1150 TREE_CONSTANT (ctor) = true;
e579afdd 1151 TREE_STATIC (ctor) = true;
f6ac75a7 1152
e60a6f7b 1153 decl = build_decl (loc, VAR_DECL, NULL_TREE, array_type);
f6ac75a7 1154 TREE_STATIC (decl) = 1;
1155 DECL_INITIAL (decl) = ctor;
1156
1157 DECL_NAME (decl) = create_tmp_var_name ("CSWTCH");
1158 DECL_ARTIFICIAL (decl) = 1;
0f9e75c9 1159 DECL_IGNORED_P (decl) = 1;
f6ac75a7 1160 TREE_CONSTANT (decl) = 1;
e7baf91d 1161 TREE_READONLY (decl) = 1;
3a1c9df2 1162 DECL_IGNORED_P (decl) = 1;
97221fd7 1163 varpool_node::finalize_decl (decl);
f6ac75a7 1164
1165 fetch = build4 (ARRAY_REF, value_type, decl, tidx, NULL_TREE,
1166 NULL_TREE);
df2813c5 1167 if (default_type != value_type)
1168 {
1169 fetch = fold_convert (default_type, fetch);
1170 fetch = force_gimple_operand_gsi (&gsi, fetch, true, NULL_TREE,
1171 true, GSI_SAME_STMT);
1172 }
f6ac75a7 1173 load = gimple_build_assign (name, fetch);
1174 }
a347af29 1175
75a70cf9 1176 gsi_insert_before (&gsi, load, GSI_SAME_STMT);
f6ac75a7 1177 update_stmt (load);
5d459527 1178 info->arr_ref_last = load;
a347af29 1179}
1180
1181/* Builds and initializes static arrays initialized with values gathered from
1182 the SWTCH switch statement. Also creates statements that load values from
1183 them. */
1184
1185static void
1a91d914 1186build_arrays (gswitch *swtch, struct switch_conv_info *info)
a347af29 1187{
1188 tree arr_index_type;
03d37e4e 1189 tree tidx, sub, utype;
42acab1c 1190 gimple *stmt;
75a70cf9 1191 gimple_stmt_iterator gsi;
1a91d914 1192 gphi_iterator gpi;
a347af29 1193 int i;
389dd41b 1194 location_t loc = gimple_location (swtch);
a347af29 1195
75a70cf9 1196 gsi = gsi_for_stmt (swtch);
49a931ef 1197
8853d378 1198 /* Make sure we do not generate arithmetics in a subrange. */
5d459527 1199 utype = TREE_TYPE (info->index_expr);
8853d378 1200 if (TREE_TYPE (utype))
1201 utype = lang_hooks.types.type_for_mode (TYPE_MODE (TREE_TYPE (utype)), 1);
1202 else
1203 utype = lang_hooks.types.type_for_mode (TYPE_MODE (utype), 1);
1204
5d459527 1205 arr_index_type = build_index_type (info->range_size);
f9e245b2 1206 tidx = make_ssa_name (utype);
8853d378 1207 sub = fold_build2_loc (loc, MINUS_EXPR, utype,
5d459527 1208 fold_convert_loc (loc, utype, info->index_expr),
1209 fold_convert_loc (loc, utype, info->range_min));
42d9ffa5 1210 sub = force_gimple_operand_gsi (&gsi, sub,
75a70cf9 1211 false, NULL, true, GSI_SAME_STMT);
1212 stmt = gimple_build_assign (tidx, sub);
a347af29 1213
75a70cf9 1214 gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
f6ac75a7 1215 update_stmt (stmt);
5d459527 1216 info->arr_ref_first = stmt;
a347af29 1217
1a91d914 1218 for (gpi = gsi_start_phis (info->final_bb), i = 0;
c66f9851 1219 !gsi_end_p (gpi); gsi_next (&gpi))
1220 {
1221 gphi *phi = gpi.phi ();
1222 if (!virtual_operand_p (gimple_phi_result (phi)))
1223 build_one_array (swtch, i++, arr_index_type, phi, tidx, info);
7992e6b5 1224 else
1225 {
1226 edge e;
1227 edge_iterator ei;
1228 FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
1229 {
1230 if (e->dest == info->final_bb)
1231 break;
1232 if (!info->default_case_nonstandard
1233 || e->dest != info->default_bb)
1234 {
1235 e = single_succ_edge (e->dest);
1236 break;
1237 }
1238 }
1239 gcc_assert (e && e->dest == info->final_bb);
1240 info->target_vop = PHI_ARG_DEF_FROM_EDGE (phi, e);
1241 }
c66f9851 1242 }
a347af29 1243}
1244
1245/* Generates and appropriately inserts loads of default values at the position
1246 given by BSI. Returns the last inserted statement. */
1247
1a91d914 1248static gassign *
5d459527 1249gen_def_assigns (gimple_stmt_iterator *gsi, struct switch_conv_info *info)
a347af29 1250{
1251 int i;
1a91d914 1252 gassign *assign = NULL;
a347af29 1253
5d459527 1254 for (i = 0; i < info->phi_count; i++)
a347af29 1255 {
f9e245b2 1256 tree name = copy_ssa_name (info->target_inbound_names[i]);
5d459527 1257 info->target_outbound_names[i] = name;
1258 assign = gimple_build_assign (name, info->default_values[i]);
75a70cf9 1259 gsi_insert_before (gsi, assign, GSI_SAME_STMT);
f6ac75a7 1260 update_stmt (assign);
a347af29 1261 }
1262 return assign;
1263}
1264
1265/* Deletes the unused bbs and edges that now contain the switch statement and
1266 its empty branch bbs. BBD is the now dead BB containing the original switch
1267 statement, FINAL is the last BB of the converted switch statement (in terms
1268 of succession). */
1269
1270static void
c66f9851 1271prune_bbs (basic_block bbd, basic_block final, basic_block default_bb)
a347af29 1272{
1273 edge_iterator ei;
1274 edge e;
1275
1276 for (ei = ei_start (bbd->succs); (e = ei_safe_edge (ei)); )
1277 {
1278 basic_block bb;
1279 bb = e->dest;
1280 remove_edge (e);
c66f9851 1281 if (bb != final && bb != default_bb)
a347af29 1282 delete_basic_block (bb);
1283 }
1284 delete_basic_block (bbd);
1285}
1286
1287/* Add values to phi nodes in final_bb for the two new edges. E1F is the edge
1288 from the basic block loading values from an array and E2F from the basic
1289 block loading default values. BBF is the last switch basic block (see the
1290 bbf description in the comment below). */
1291
1292static void
5d459527 1293fix_phi_nodes (edge e1f, edge e2f, basic_block bbf,
1294 struct switch_conv_info *info)
a347af29 1295{
1a91d914 1296 gphi_iterator gsi;
a347af29 1297 int i;
1298
75a70cf9 1299 for (gsi = gsi_start_phis (bbf), i = 0;
c66f9851 1300 !gsi_end_p (gsi); gsi_next (&gsi))
a347af29 1301 {
1a91d914 1302 gphi *phi = gsi.phi ();
c66f9851 1303 tree inbound, outbound;
1304 if (virtual_operand_p (gimple_phi_result (phi)))
7992e6b5 1305 inbound = outbound = info->target_vop;
c66f9851 1306 else
1307 {
1308 inbound = info->target_inbound_names[i];
1309 outbound = info->target_outbound_names[i++];
1310 }
1311 add_phi_arg (phi, inbound, e1f, UNKNOWN_LOCATION);
1312 if (!info->default_case_nonstandard)
1313 add_phi_arg (phi, outbound, e2f, UNKNOWN_LOCATION);
a347af29 1314 }
a347af29 1315}
1316
1317/* Creates a check whether the switch expression value actually falls into the
1318 range given by all the cases. If it does not, the temporaries are loaded
1319 with default values instead. SWTCH is the switch statement being converted.
1320
1321 bb0 is the bb with the switch statement, however, we'll end it with a
1322 condition instead.
1323
1324 bb1 is the bb to be used when the range check went ok. It is derived from
1325 the switch BB
1326
1327 bb2 is the bb taken when the expression evaluated outside of the range
1328 covered by the created arrays. It is populated by loads of default
1329 values.
1330
1331 bbF is a fall through for both bb1 and bb2 and contains exactly what
1332 originally followed the switch statement.
1333
1334 bbD contains the switch statement (in the end). It is unreachable but we
1335 still need to strip off its edges.
1336*/
1337
1338static void
1a91d914 1339gen_inbound_check (gswitch *swtch, struct switch_conv_info *info)
a347af29 1340{
e60a6f7b 1341 tree label_decl1 = create_artificial_label (UNKNOWN_LOCATION);
1342 tree label_decl2 = create_artificial_label (UNKNOWN_LOCATION);
1343 tree label_decl3 = create_artificial_label (UNKNOWN_LOCATION);
1a91d914 1344 glabel *label1, *label2, *label3;
8853d378 1345 tree utype, tidx;
a347af29 1346 tree bound;
1347
1a91d914 1348 gcond *cond_stmt;
a347af29 1349
c66f9851 1350 gassign *last_assign = NULL;
75a70cf9 1351 gimple_stmt_iterator gsi;
a347af29 1352 basic_block bb0, bb1, bb2, bbf, bbd;
c66f9851 1353 edge e01 = NULL, e02, e21, e1d, e1f, e2f;
389dd41b 1354 location_t loc = gimple_location (swtch);
a347af29 1355
5d459527 1356 gcc_assert (info->default_values);
6da0d726 1357
75a70cf9 1358 bb0 = gimple_bb (swtch);
a347af29 1359
5d459527 1360 tidx = gimple_assign_lhs (info->arr_ref_first);
8853d378 1361 utype = TREE_TYPE (tidx);
1763aab8 1362
a347af29 1363 /* (end of) block 0 */
5d459527 1364 gsi = gsi_for_stmt (info->arr_ref_first);
8853d378 1365 gsi_next (&gsi);
a347af29 1366
5d459527 1367 bound = fold_convert_loc (loc, utype, info->range_size);
8853d378 1368 cond_stmt = gimple_build_cond (LE_EXPR, tidx, bound, NULL_TREE, NULL_TREE);
75a70cf9 1369 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
f6ac75a7 1370 update_stmt (cond_stmt);
a347af29 1371
1372 /* block 2 */
c66f9851 1373 if (!info->default_case_nonstandard)
1374 {
1375 label2 = gimple_build_label (label_decl2);
1376 gsi_insert_before (&gsi, label2, GSI_SAME_STMT);
1377 last_assign = gen_def_assigns (&gsi, info);
1378 }
a347af29 1379
1380 /* block 1 */
75a70cf9 1381 label1 = gimple_build_label (label_decl1);
1382 gsi_insert_before (&gsi, label1, GSI_SAME_STMT);
a347af29 1383
1384 /* block F */
5d459527 1385 gsi = gsi_start_bb (info->final_bb);
75a70cf9 1386 label3 = gimple_build_label (label_decl3);
1387 gsi_insert_before (&gsi, label3, GSI_SAME_STMT);
a347af29 1388
1389 /* cfg fix */
75a70cf9 1390 e02 = split_block (bb0, cond_stmt);
a347af29 1391 bb2 = e02->dest;
1392
c66f9851 1393 if (info->default_case_nonstandard)
1394 {
1395 bb1 = bb2;
1396 bb2 = info->default_bb;
1397 e01 = e02;
1398 e01->flags = EDGE_TRUE_VALUE;
1399 e02 = make_edge (bb0, bb2, EDGE_FALSE_VALUE);
1400 edge e_default = find_edge (bb1, bb2);
1401 for (gphi_iterator gsi = gsi_start_phis (bb2);
1402 !gsi_end_p (gsi); gsi_next (&gsi))
1403 {
1404 gphi *phi = gsi.phi ();
1405 tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e_default);
1406 add_phi_arg (phi, arg, e02,
1407 gimple_phi_arg_location_from_edge (phi, e_default));
1408 }
1409 /* Partially fix the dominator tree, if it is available. */
1410 if (dom_info_available_p (CDI_DOMINATORS))
1411 redirect_immediate_dominators (CDI_DOMINATORS, bb1, bb0);
1412 }
1413 else
1414 {
1415 e21 = split_block (bb2, last_assign);
1416 bb1 = e21->dest;
1417 remove_edge (e21);
1418 }
a347af29 1419
5d459527 1420 e1d = split_block (bb1, info->arr_ref_last);
a347af29 1421 bbd = e1d->dest;
1422 remove_edge (e1d);
1423
1424 /* flags and profiles of the edge for in-range values */
c66f9851 1425 if (!info->default_case_nonstandard)
1426 e01 = make_edge (bb0, bb1, EDGE_TRUE_VALUE);
720cfc43 1427 e01->probability = info->default_prob.invert ();
5d459527 1428 e01->count = info->other_count;
a347af29 1429
1430 /* flags and profiles of the edge taking care of out-of-range values */
1431 e02->flags &= ~EDGE_FALLTHRU;
1432 e02->flags |= EDGE_FALSE_VALUE;
5d459527 1433 e02->probability = info->default_prob;
1434 e02->count = info->default_count;
a347af29 1435
5d459527 1436 bbf = info->final_bb;
a347af29 1437
1438 e1f = make_edge (bb1, bbf, EDGE_FALLTHRU);
720cfc43 1439 e1f->probability = profile_probability::always ();
5d459527 1440 e1f->count = info->other_count;
a347af29 1441
c66f9851 1442 if (info->default_case_nonstandard)
1443 e2f = NULL;
1444 else
1445 {
1446 e2f = make_edge (bb2, bbf, EDGE_FALLTHRU);
720cfc43 1447 e2f->probability = profile_probability::always ();
c66f9851 1448 e2f->count = info->default_count;
1449 }
a347af29 1450
1451 /* frequencies of the new BBs */
1452 bb1->frequency = EDGE_FREQUENCY (e01);
1453 bb2->frequency = EDGE_FREQUENCY (e02);
c66f9851 1454 if (!info->default_case_nonstandard)
1455 bbf->frequency = EDGE_FREQUENCY (e1f) + EDGE_FREQUENCY (e2f);
a347af29 1456
6da0d726 1457 /* Tidy blocks that have become unreachable. */
c66f9851 1458 prune_bbs (bbd, info->final_bb,
1459 info->default_case_nonstandard ? info->default_bb : NULL);
a347af29 1460
6da0d726 1461 /* Fixup the PHI nodes in bbF. */
5d459527 1462 fix_phi_nodes (e1f, e2f, bbf, info);
a347af29 1463
6da0d726 1464 /* Fix the dominator tree, if it is available. */
1465 if (dom_info_available_p (CDI_DOMINATORS))
1466 {
f1f41a6c 1467 vec<basic_block> bbs_to_fix_dom;
6da0d726 1468
1469 set_immediate_dominator (CDI_DOMINATORS, bb1, bb0);
c66f9851 1470 if (!info->default_case_nonstandard)
1471 set_immediate_dominator (CDI_DOMINATORS, bb2, bb0);
78b7a675 1472 if (! get_immediate_dominator (CDI_DOMINATORS, bbf))
6da0d726 1473 /* If bbD was the immediate dominator ... */
1474 set_immediate_dominator (CDI_DOMINATORS, bbf, bb0);
1475
c66f9851 1476 bbs_to_fix_dom.create (3 + (bb2 != bbf));
f1f41a6c 1477 bbs_to_fix_dom.quick_push (bb0);
1478 bbs_to_fix_dom.quick_push (bb1);
c66f9851 1479 if (bb2 != bbf)
1480 bbs_to_fix_dom.quick_push (bb2);
f1f41a6c 1481 bbs_to_fix_dom.quick_push (bbf);
6da0d726 1482
1483 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
f1f41a6c 1484 bbs_to_fix_dom.release ();
6da0d726 1485 }
a347af29 1486}
1487
1488/* The following function is invoked on every switch statement (the current one
1489 is given in SWTCH) and runs the individual phases of switch conversion on it
5d459527 1490 one after another until one fails or the conversion is completed.
1491 Returns NULL on success, or a pointer to a string with the reason why the
1492 conversion failed. */
a347af29 1493
5d459527 1494static const char *
1a91d914 1495process_switch (gswitch *swtch)
a347af29 1496{
5d459527 1497 struct switch_conv_info info;
a347af29 1498
b7d0690f 1499 /* Group case labels so that we get the right results from the heuristics
1500 that decide on the code generation approach for this switch. */
1501 group_case_labels_stmt (swtch);
1502
1503 /* If this switch is now a degenerate case with only a default label,
1504 there is nothing left for us to do. */
1505 if (gimple_switch_num_labels (swtch) < 2)
1506 return "switch is a degenerate case";
11f2f313 1507
1508 collect_switch_conv_info (swtch, &info);
1509
1510 /* No error markers should reach here (they should be filtered out
1511 during gimplification). */
1512 gcc_checking_assert (TREE_TYPE (info.index_expr) != error_mark_node);
1513
78b7a675 1514 /* A switch on a constant should have been optimized in tree-cfg-cleanup. */
1515 gcc_checking_assert (! TREE_CONSTANT (info.index_expr));
11f2f313 1516
78b7a675 1517 if (info.uniq <= MAX_CASE_BIT_TESTS)
11f2f313 1518 {
78b7a675 1519 if (expand_switch_using_bit_tests_p (info.range_size,
637a765f 1520 info.uniq, info.count,
1521 optimize_bb_for_speed_p
1522 (gimple_bb (swtch))))
78b7a675 1523 {
1524 if (dump_file)
1525 fputs (" expanding as bit test is preferable\n", dump_file);
bcf8a30c 1526 emit_case_bit_tests (swtch, info.index_expr, info.range_min,
1527 info.range_size, info.range_max);
b3083327 1528 loops_state_set (LOOPS_NEED_FIXUP);
78b7a675 1529 return NULL;
1530 }
1531
1532 if (info.uniq <= 2)
1533 /* This will be expanded as a decision tree in stmt.c:expand_case. */
1534 return " expanding as jumps is preferable";
11f2f313 1535 }
a347af29 1536
78b7a675 1537 /* If there is no common successor, we cannot do the transformation. */
1538 if (! info.final_bb)
1539 return "no common successor to all case label target blocks found";
1540
a347af29 1541 /* Check the case label values are within reasonable range: */
11f2f313 1542 if (!check_range (&info))
5d459527 1543 {
1544 gcc_assert (info.reason);
1545 return info.reason;
1546 }
a347af29 1547
1548 /* For all the cases, see whether they are empty, the assignments they
1549 represent constant and so on... */
11f2f313 1550 if (! check_all_empty_except_final (&info))
df2813c5 1551 {
11f2f313 1552 gcc_assert (info.reason);
1553 return info.reason;
df2813c5 1554 }
c66f9851 1555 if (!check_final_bb (swtch, &info))
5d459527 1556 {
1557 gcc_assert (info.reason);
1558 return info.reason;
1559 }
a347af29 1560
1561 /* At this point all checks have passed and we can proceed with the
1562 transformation. */
1563
5d459527 1564 create_temp_arrays (&info);
c66f9851 1565 gather_default_values (info.default_case_nonstandard
1566 ? gimple_switch_label (swtch, 1)
1567 : gimple_switch_default_label (swtch), &info);
5d459527 1568 build_constructors (swtch, &info);
a347af29 1569
5d459527 1570 build_arrays (swtch, &info); /* Build the static arrays and assignments. */
1571 gen_inbound_check (swtch, &info); /* Build the bounds check. */
a347af29 1572
1573 /* Cleanup: */
5d459527 1574 free_temp_arrays (&info);
1575 return NULL;
a347af29 1576}
1577
1578/* The main function of the pass scans statements for switches and invokes
1579 process_switch on them. */
1580
65b0537f 1581namespace {
1582
1583const pass_data pass_data_convert_switch =
1584{
1585 GIMPLE_PASS, /* type */
1586 "switchconv", /* name */
1587 OPTGROUP_NONE, /* optinfo_flags */
65b0537f 1588 TV_TREE_SWITCH_CONVERSION, /* tv_id */
1589 ( PROP_cfg | PROP_ssa ), /* properties_required */
1590 0, /* properties_provided */
1591 0, /* properties_destroyed */
1592 0, /* todo_flags_start */
8b88439e 1593 TODO_update_ssa, /* todo_flags_finish */
65b0537f 1594};
1595
1596class pass_convert_switch : public gimple_opt_pass
1597{
1598public:
1599 pass_convert_switch (gcc::context *ctxt)
1600 : gimple_opt_pass (pass_data_convert_switch, ctxt)
1601 {}
1602
1603 /* opt_pass methods: */
1604 virtual bool gate (function *) { return flag_tree_switch_conversion != 0; }
1605 virtual unsigned int execute (function *);
1606
1607}; // class pass_convert_switch
1608
1609unsigned int
1610pass_convert_switch::execute (function *fun)
a347af29 1611{
1612 basic_block bb;
1613
65b0537f 1614 FOR_EACH_BB_FN (bb, fun)
a347af29 1615 {
5d459527 1616 const char *failure_reason;
42acab1c 1617 gimple *stmt = last_stmt (bb);
75a70cf9 1618 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
a347af29 1619 {
a347af29 1620 if (dump_file)
1621 {
75a70cf9 1622 expanded_location loc = expand_location (gimple_location (stmt));
1623
a347af29 1624 fprintf (dump_file, "beginning to process the following "
1625 "SWITCH statement (%s:%d) : ------- \n",
1626 loc.file, loc.line);
75a70cf9 1627 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
609e7ca1 1628 putc ('\n', dump_file);
a347af29 1629 }
1630
1a91d914 1631 failure_reason = process_switch (as_a <gswitch *> (stmt));
5d459527 1632 if (! failure_reason)
a347af29 1633 {
1634 if (dump_file)
1635 {
609e7ca1 1636 fputs ("Switch converted\n", dump_file);
1637 fputs ("--------------------------------\n", dump_file);
a347af29 1638 }
78b7a675 1639
1640 /* Make no effort to update the post-dominator tree. It is actually not
1641 that hard for the transformations we have performed, but it is not
1642 supported by iterate_fix_dominators. */
1643 free_dominance_info (CDI_POST_DOMINATORS);
a347af29 1644 }
1645 else
1646 {
1647 if (dump_file)
1648 {
609e7ca1 1649 fputs ("Bailing out - ", dump_file);
5d459527 1650 fputs (failure_reason, dump_file);
1651 fputs ("\n--------------------------------\n", dump_file);
a347af29 1652 }
1653 }
1654 }
1655 }
1656
1657 return 0;
1658}
1659
cbe8bda8 1660} // anon namespace
1661
1662gimple_opt_pass *
1663make_pass_convert_switch (gcc::context *ctxt)
1664{
1665 return new pass_convert_switch (ctxt);
1666}
1d5640e3 1667
1668struct case_node
1669{
1670 case_node *left; /* Left son in binary tree. */
1671 case_node *right; /* Right son in binary tree;
1672 also node chain. */
1673 case_node *parent; /* Parent of node in binary tree. */
1674 tree low; /* Lowest index value for this label. */
1675 tree high; /* Highest index value for this label. */
1676 basic_block case_bb; /* Label to jump to when node matches. */
1677 tree case_label; /* Label to jump to when node matches. */
1678 profile_probability prob; /* Probability of taking this case. */
1679 profile_probability subtree_prob; /* Probability of reaching subtree
1680 rooted at this node. */
1681};
1682
1683typedef case_node *case_node_ptr;
1684
1685static basic_block emit_case_nodes (basic_block, tree, case_node_ptr,
1686 basic_block, tree, profile_probability,
1687 tree, hash_map<tree, tree> *);
1688static bool node_has_low_bound (case_node_ptr, tree);
1689static bool node_has_high_bound (case_node_ptr, tree);
1690static bool node_is_bounded (case_node_ptr, tree);
1691
1692/* Return the smallest number of different values for which it is best to use a
1693 jump-table instead of a tree of conditional branches. */
1694
1695static unsigned int
1696case_values_threshold (void)
1697{
1698 unsigned int threshold = PARAM_VALUE (PARAM_CASE_VALUES_THRESHOLD);
1699
1700 if (threshold == 0)
1701 threshold = targetm.case_values_threshold ();
1702
1703 return threshold;
1704}
1705
1706/* Reset the aux field of all outgoing edges of basic block BB. */
1707
1708static inline void
1709reset_out_edges_aux (basic_block bb)
1710{
1711 edge e;
1712 edge_iterator ei;
1713 FOR_EACH_EDGE (e, ei, bb->succs)
1714 e->aux = (void *) 0;
1715}
1716
1717/* Compute the number of case labels that correspond to each outgoing edge of
1718 STMT. Record this information in the aux field of the edge. */
1719
1720static inline void
1721compute_cases_per_edge (gswitch *stmt)
1722{
1723 basic_block bb = gimple_bb (stmt);
1724 reset_out_edges_aux (bb);
1725 int ncases = gimple_switch_num_labels (stmt);
1726 for (int i = ncases - 1; i >= 1; --i)
1727 {
1728 tree elt = gimple_switch_label (stmt, i);
1729 tree lab = CASE_LABEL (elt);
1730 basic_block case_bb = label_to_block_fn (cfun, lab);
1731 edge case_edge = find_edge (bb, case_bb);
1732 case_edge->aux = (void *) ((intptr_t) (case_edge->aux) + 1);
1733 }
1734}
1735
1736/* Do the insertion of a case label into case_list. The labels are
1737 fed to us in descending order from the sorted vector of case labels used
1738 in the tree part of the middle end. So the list we construct is
1739 sorted in ascending order.
1740
1741 LABEL is the case label to be inserted. LOW and HIGH are the bounds
1742 against which the index is compared to jump to LABEL and PROB is the
1743 estimated probability LABEL is reached from the switch statement. */
1744
1745static case_node *
1746add_case_node (case_node *head, tree low, tree high, basic_block case_bb,
1747 tree case_label, profile_probability prob,
1748 object_allocator<case_node> &case_node_pool)
1749{
1750 case_node *r;
1751
1752 gcc_checking_assert (low);
1753 gcc_checking_assert (high && (TREE_TYPE (low) == TREE_TYPE (high)));
1754
1755 /* Add this label to the chain. */
1756 r = case_node_pool.allocate ();
1757 r->low = low;
1758 r->high = high;
1759 r->case_bb = case_bb;
1760 r->case_label = case_label;
1761 r->parent = r->left = NULL;
1762 r->prob = prob;
1763 r->subtree_prob = prob;
1764 r->right = head;
1765 return r;
1766}
1767
1768/* Dump ROOT, a list or tree of case nodes, to file. */
1769
1770static void
1771dump_case_nodes (FILE *f, case_node *root, int indent_step, int indent_level)
1772{
1773 if (root == 0)
1774 return;
1775 indent_level++;
1776
1777 dump_case_nodes (f, root->left, indent_step, indent_level);
1778
1779 fputs (";; ", f);
1780 fprintf (f, "%*s", indent_step * indent_level, "");
1781 print_dec (root->low, f, TYPE_SIGN (TREE_TYPE (root->low)));
1782 if (!tree_int_cst_equal (root->low, root->high))
1783 {
1784 fprintf (f, " ... ");
1785 print_dec (root->high, f, TYPE_SIGN (TREE_TYPE (root->high)));
1786 }
1787 fputs ("\n", f);
1788
1789 dump_case_nodes (f, root->right, indent_step, indent_level);
1790}
1791
1792/* Take an ordered list of case nodes
1793 and transform them into a near optimal binary tree,
1794 on the assumption that any target code selection value is as
1795 likely as any other.
1796
1797 The transformation is performed by splitting the ordered
1798 list into two equal sections plus a pivot. The parts are
1799 then attached to the pivot as left and right branches. Each
1800 branch is then transformed recursively. */
1801
1802static void
1803balance_case_nodes (case_node_ptr *head, case_node_ptr parent)
1804{
1805 case_node_ptr np;
1806
1807 np = *head;
1808 if (np)
1809 {
1810 int i = 0;
1811 int ranges = 0;
1812 case_node_ptr *npp;
1813 case_node_ptr left;
1814
1815 /* Count the number of entries on branch. Also count the ranges. */
1816
1817 while (np)
1818 {
1819 if (!tree_int_cst_equal (np->low, np->high))
1820 ranges++;
1821
1822 i++;
1823 np = np->right;
1824 }
1825
1826 if (i > 2)
1827 {
1828 /* Split this list if it is long enough for that to help. */
1829 npp = head;
1830 left = *npp;
1831
1832 /* If there are just three nodes, split at the middle one. */
1833 if (i == 3)
1834 npp = &(*npp)->right;
1835 else
1836 {
1837 /* Find the place in the list that bisects the list's total cost,
1838 where ranges count as 2.
1839 Here I gets half the total cost. */
1840 i = (i + ranges + 1) / 2;
1841 while (1)
1842 {
1843 /* Skip nodes while their cost does not reach that amount. */
1844 if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
1845 i--;
1846 i--;
1847 if (i <= 0)
1848 break;
1849 npp = &(*npp)->right;
1850 }
1851 }
1852 *head = np = *npp;
1853 *npp = 0;
1854 np->parent = parent;
1855 np->left = left;
1856
1857 /* Optimize each of the two split parts. */
1858 balance_case_nodes (&np->left, np);
1859 balance_case_nodes (&np->right, np);
1860 np->subtree_prob = np->prob;
1861 np->subtree_prob += np->left->subtree_prob;
1862 np->subtree_prob += np->right->subtree_prob;
1863 }
1864 else
1865 {
1866 /* Else leave this branch as one level,
1867 but fill in `parent' fields. */
1868 np = *head;
1869 np->parent = parent;
1870 np->subtree_prob = np->prob;
1871 for (; np->right; np = np->right)
1872 {
1873 np->right->parent = np;
1874 (*head)->subtree_prob += np->right->subtree_prob;
1875 }
1876 }
1877 }
1878}
1879
1880/* Return true if a switch should be expanded as a decision tree.
1881 RANGE is the difference between highest and lowest case.
1882 UNIQ is number of unique case node targets, not counting the default case.
1883 COUNT is the number of comparisons needed, not counting the default case. */
1884
1885static bool
1886expand_switch_as_decision_tree_p (tree range,
1887 unsigned int uniq ATTRIBUTE_UNUSED,
1888 unsigned int count)
1889{
1890 int max_ratio;
1891
1892 /* If neither casesi or tablejump is available, or flag_jump_tables
1893 over-ruled us, we really have no choice. */
1894 if (!targetm.have_casesi () && !targetm.have_tablejump ())
1895 return true;
1896 if (!flag_jump_tables)
1897 return true;
1898#ifndef ASM_OUTPUT_ADDR_DIFF_ELT
1899 if (flag_pic)
1900 return true;
1901#endif
1902
1903 /* If the switch is relatively small such that the cost of one
1904 indirect jump on the target are higher than the cost of a
1905 decision tree, go with the decision tree.
1906
1907 If range of values is much bigger than number of values,
1908 or if it is too large to represent in a HOST_WIDE_INT,
1909 make a sequence of conditional branches instead of a dispatch.
1910
1911 The definition of "much bigger" depends on whether we are
1912 optimizing for size or for speed. If the former, the maximum
1913 ratio range/count = 3, because this was found to be the optimal
1914 ratio for size on i686-pc-linux-gnu, see PR11823. The ratio
1915 10 is much older, and was probably selected after an extensive
1916 benchmarking investigation on numerous platforms. Or maybe it
1917 just made sense to someone at some point in the history of GCC,
1918 who knows... */
1919 max_ratio = optimize_insn_for_size_p () ? 3 : 10;
1920 if (count < case_values_threshold () || !tree_fits_uhwi_p (range)
1921 || compare_tree_int (range, max_ratio * count) > 0)
1922 return true;
1923
1924 return false;
1925}
1926
1927static void
1928fix_phi_operands_for_edge (edge e, hash_map<tree, tree> *phi_mapping)
1929{
1930 basic_block bb = e->dest;
1931 gphi_iterator gsi;
1932 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1933 {
1934 gphi *phi = gsi.phi ();
1935
1936 tree *definition = phi_mapping->get (gimple_phi_result (phi));
1937 if (definition)
1938 add_phi_arg (phi, *definition, e, UNKNOWN_LOCATION);
1939 }
1940}
1941
1942
1943/* Add an unconditional jump to CASE_BB that happens in basic block BB. */
1944
1945static void
1946emit_jump (basic_block bb, basic_block case_bb,
1947 hash_map<tree, tree> *phi_mapping)
1948{
1949 edge e = single_succ_edge (bb);
1950 redirect_edge_succ (e, case_bb);
1951 fix_phi_operands_for_edge (e, phi_mapping);
1952}
1953
1954/* Generate a decision tree, switching on INDEX_EXPR and jumping to
1955 one of the labels in CASE_LIST or to the DEFAULT_LABEL.
1956 DEFAULT_PROB is the estimated probability that it jumps to
1957 DEFAULT_LABEL.
1958
1959 We generate a binary decision tree to select the appropriate target
1960 code. */
1961
1962static void
1963emit_case_decision_tree (gswitch *s, tree index_expr, tree index_type,
1964 case_node_ptr case_list, basic_block default_bb,
1965 tree default_label, profile_probability default_prob,
1966 hash_map<tree, tree> *phi_mapping)
1967{
1968 balance_case_nodes (&case_list, NULL);
1969
1970 if (dump_file)
1971 dump_function_to_file (current_function_decl, dump_file, dump_flags);
1972 if (dump_file && (dump_flags & TDF_DETAILS))
1973 {
1974 int indent_step = ceil_log2 (TYPE_PRECISION (index_type)) + 2;
1975 fprintf (dump_file, ";; Expanding GIMPLE switch as decision tree:\n");
1976 dump_case_nodes (dump_file, case_list, indent_step, 0);
1977 }
1978
1979 basic_block bb = gimple_bb (s);
1980 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1981 edge e;
1982 if (gsi_end_p (gsi))
1983 e = split_block_after_labels (bb);
1984 else
1985 {
1986 gsi_prev (&gsi);
1987 e = split_block (bb, gsi_stmt (gsi));
1988 }
1989 bb = split_edge (e);
1990
1991 bb = emit_case_nodes (bb, index_expr, case_list, default_bb, default_label,
1992 default_prob, index_type, phi_mapping);
1993
1994 if (bb)
1995 emit_jump (bb, default_bb, phi_mapping);
1996
1997 /* Remove all edges and do just an edge that will reach default_bb. */
1998 gsi = gsi_last_bb (gimple_bb (s));
1999 gsi_remove (&gsi, true);
2000}
2001
2002static void
2003record_phi_operand_mapping (const vec<basic_block> bbs, basic_block switch_bb,
2004 hash_map <tree, tree> *map)
2005{
2006 /* Record all PHI nodes that have to be fixed after conversion. */
2007 for (unsigned i = 0; i < bbs.length (); i++)
2008 {
2009 basic_block bb = bbs[i];
2010
2011 gphi_iterator gsi;
2012 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2013 {
2014 gphi *phi = gsi.phi ();
2015
2016 for (unsigned i = 0; i < gimple_phi_num_args (phi); i++)
2017 {
2018 basic_block phi_src_bb = gimple_phi_arg_edge (phi, i)->src;
2019 if (phi_src_bb == switch_bb)
2020 {
2021 tree def = gimple_phi_arg_def (phi, i);
2022 tree result = gimple_phi_result (phi);
2023 map->put (result, def);
2024 break;
2025 }
2026 }
2027 }
2028 }
2029}
2030
2031/* Attempt to expand gimple switch STMT to a decision tree. */
2032
2033static bool
2034try_switch_expansion (gswitch *stmt)
2035{
2036 tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE;
2037 basic_block default_bb;
2038 unsigned int count, uniq;
2039 int i;
2040 int ncases = gimple_switch_num_labels (stmt);
2041 tree index_expr = gimple_switch_index (stmt);
2042 tree index_type = TREE_TYPE (index_expr);
2043 tree elt;
2044 basic_block bb = gimple_bb (stmt);
2045
2046 hash_map<tree, tree> phi_mapping;
2047 auto_vec<basic_block> case_bbs;
2048
2049 /* A list of case labels; it is first built as a list and it may then
2050 be rearranged into a nearly balanced binary tree. */
2051 case_node *case_list = 0;
2052
2053 /* A pool for case nodes. */
2054 object_allocator<case_node> case_node_pool ("struct case_node pool");
2055
2056 /* cleanup_tree_cfg removes all SWITCH_EXPR with their index
2057 expressions being INTEGER_CST. */
2058 gcc_assert (TREE_CODE (index_expr) != INTEGER_CST);
2059
2060 /* Optimization of switch statements with only one label has already
2061 occurred, so we should never see them at this point. */
2062 gcc_assert (ncases > 1);
2063
2064 /* Find the default case target label. */
2065 tree default_label = CASE_LABEL (gimple_switch_default_label (stmt));
2066 default_bb = label_to_block_fn (cfun, default_label);
2067 edge default_edge = find_edge (bb, default_bb);
2068 profile_probability default_prob = default_edge->probability;
2069 case_bbs.safe_push (default_bb);
2070
2071 /* Get upper and lower bounds of case values. */
2072 elt = gimple_switch_label (stmt, 1);
2073 minval = fold_convert (index_type, CASE_LOW (elt));
2074 elt = gimple_switch_label (stmt, ncases - 1);
2075 if (CASE_HIGH (elt))
2076 maxval = fold_convert (index_type, CASE_HIGH (elt));
2077 else
2078 maxval = fold_convert (index_type, CASE_LOW (elt));
2079
2080 /* Compute span of values. */
2081 range = fold_build2 (MINUS_EXPR, index_type, maxval, minval);
2082
2083 /* Listify the labels queue and gather some numbers to decide
2084 how to expand this switch. */
2085 uniq = 0;
2086 count = 0;
2087 hash_set<tree> seen_labels;
2088 compute_cases_per_edge (stmt);
2089
2090 for (i = ncases - 1; i >= 1; --i)
2091 {
2092 elt = gimple_switch_label (stmt, i);
2093 tree low = CASE_LOW (elt);
2094 gcc_assert (low);
2095 tree high = CASE_HIGH (elt);
2096 gcc_assert (!high || tree_int_cst_lt (low, high));
2097 tree lab = CASE_LABEL (elt);
2098
2099 /* Count the elements.
2100 A range counts double, since it requires two compares. */
2101 count++;
2102 if (high)
2103 count++;
2104
2105 /* If we have not seen this label yet, then increase the
2106 number of unique case node targets seen. */
2107 if (!seen_labels.add (lab))
2108 uniq++;
2109
2110 /* The bounds on the case range, LOW and HIGH, have to be converted
2111 to case's index type TYPE. Note that the original type of the
2112 case index in the source code is usually "lost" during
2113 gimplification due to type promotion, but the case labels retain the
2114 original type. Make sure to drop overflow flags. */
2115 low = fold_convert (index_type, low);
2116 if (TREE_OVERFLOW (low))
2117 low = wide_int_to_tree (index_type, low);
2118
2119 /* The canonical from of a case label in GIMPLE is that a simple case
2120 has an empty CASE_HIGH. For the casesi and tablejump expanders,
2121 the back ends want simple cases to have high == low. */
2122 if (!high)
2123 high = low;
2124 high = fold_convert (index_type, high);
2125 if (TREE_OVERFLOW (high))
2126 high = wide_int_to_tree (index_type, high);
2127
2128 basic_block case_bb = label_to_block_fn (cfun, lab);
2129 edge case_edge = find_edge (bb, case_bb);
2130 case_list = add_case_node (
2131 case_list, low, high, case_bb, lab,
2132 case_edge->probability.apply_scale (1, (intptr_t) (case_edge->aux)),
2133 case_node_pool);
2134
2135 case_bbs.safe_push (case_bb);
2136 }
2137 reset_out_edges_aux (bb);
2138 record_phi_operand_mapping (case_bbs, bb, &phi_mapping);
2139
2140 /* cleanup_tree_cfg removes all SWITCH_EXPR with a single
2141 destination, such as one with a default case only.
2142 It also removes cases that are out of range for the switch
2143 type, so we should never get a zero here. */
2144 gcc_assert (count > 0);
2145
2146 /* Decide how to expand this switch.
2147 The two options at this point are a dispatch table (casesi or
2148 tablejump) or a decision tree. */
2149
2150 if (expand_switch_as_decision_tree_p (range, uniq, count))
2151 {
2152 emit_case_decision_tree (stmt, index_expr, index_type, case_list,
2153 default_bb, default_label, default_prob,
2154 &phi_mapping);
2155 return true;
2156 }
2157
2158 return false;
2159}
2160
2161/* The main function of the pass scans statements for switches and invokes
2162 process_switch on them. */
2163
2164namespace {
2165
2166const pass_data pass_data_lower_switch =
2167{
2168 GIMPLE_PASS, /* type */
2169 "switchlower", /* name */
2170 OPTGROUP_NONE, /* optinfo_flags */
2171 TV_TREE_SWITCH_LOWERING, /* tv_id */
2172 ( PROP_cfg | PROP_ssa ), /* properties_required */
2173 0, /* properties_provided */
2174 0, /* properties_destroyed */
2175 0, /* todo_flags_start */
2176 TODO_update_ssa | TODO_cleanup_cfg, /* todo_flags_finish */
2177};
2178
2179class pass_lower_switch : public gimple_opt_pass
2180{
2181public:
2182 pass_lower_switch (gcc::context *ctxt)
2183 : gimple_opt_pass (pass_data_lower_switch, ctxt)
2184 {}
2185
2186 /* opt_pass methods: */
2187 virtual bool gate (function *) { return true; }
2188 virtual unsigned int execute (function *);
2189
2190}; // class pass_lower_switch
2191
2192unsigned int
2193pass_lower_switch::execute (function *fun)
2194{
2195 basic_block bb;
2196 bool expanded = false;
2197
2198 FOR_EACH_BB_FN (bb, fun)
2199 {
2200 gimple *stmt = last_stmt (bb);
2201 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
2202 {
2203 if (dump_file)
2204 {
2205 expanded_location loc = expand_location (gimple_location (stmt));
2206
2207 fprintf (dump_file, "beginning to process the following "
2208 "SWITCH statement (%s:%d) : ------- \n",
2209 loc.file, loc.line);
2210 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
2211 putc ('\n', dump_file);
2212 }
2213
2214 expanded |= try_switch_expansion (as_a<gswitch *> (stmt));
2215 }
2216 }
2217
2218 if (expanded)
2219 {
2220 free_dominance_info (CDI_DOMINATORS);
2221 free_dominance_info (CDI_POST_DOMINATORS);
2222 mark_virtual_operands_for_renaming (cfun);
2223 }
2224
2225 return 0;
2226}
2227
2228} // anon namespace
2229
2230gimple_opt_pass *
2231make_pass_lower_switch (gcc::context *ctxt)
2232{
2233 return new pass_lower_switch (ctxt);
2234}
2235
2236/* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE.
2237 PROB is the probability of jumping to LABEL. */
2238static basic_block
2239do_jump_if_equal (basic_block bb, tree op0, tree op1, basic_block label_bb,
2240 profile_probability prob, hash_map<tree, tree> *phi_mapping)
2241{
2242 gcond *cond = gimple_build_cond (EQ_EXPR, op0, op1, NULL_TREE, NULL_TREE);
2243 gimple_stmt_iterator gsi = gsi_last_bb (bb);
2244 gsi_insert_before (&gsi, cond, GSI_SAME_STMT);
2245
2246 gcc_assert (single_succ_p (bb));
2247
2248 /* Make a new basic block where false branch will take place. */
2249 edge false_edge = split_block (bb, cond);
2250 false_edge->flags = EDGE_FALSE_VALUE;
2251 false_edge->probability = prob.invert ();
2252
2253 edge true_edge = make_edge (bb, label_bb, EDGE_TRUE_VALUE);
2254 fix_phi_operands_for_edge (true_edge, phi_mapping);
2255 true_edge->probability = prob;
2256
2257 return false_edge->dest;
2258}
2259
2260/* Generate code to compare X with Y so that the condition codes are
2261 set and to jump to LABEL if the condition is true. If X is a
2262 constant and Y is not a constant, then the comparison is swapped to
2263 ensure that the comparison RTL has the canonical form.
2264
2265 UNSIGNEDP nonzero says that X and Y are unsigned; this matters if they
2266 need to be widened. UNSIGNEDP is also used to select the proper
2267 branch condition code.
2268
2269 If X and Y have mode BLKmode, then SIZE specifies the size of both X and Y.
2270
2271 MODE is the mode of the inputs (in case they are const_int).
2272
2273 COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
2274 It will be potentially converted into an unsigned variant based on
2275 UNSIGNEDP to select a proper jump instruction.
2276
2277 PROB is the probability of jumping to LABEL. */
2278
2279static basic_block
2280emit_cmp_and_jump_insns (basic_block bb, tree op0, tree op1,
2281 tree_code comparison, basic_block label_bb,
2282 profile_probability prob,
2283 hash_map<tree, tree> *phi_mapping)
2284{
2285 gcond *cond = gimple_build_cond (comparison, op0, op1, NULL_TREE, NULL_TREE);
2286 gimple_stmt_iterator gsi = gsi_last_bb (bb);
2287 gsi_insert_after (&gsi, cond, GSI_NEW_STMT);
2288
2289 gcc_assert (single_succ_p (bb));
2290
2291 /* Make a new basic block where false branch will take place. */
2292 edge false_edge = split_block (bb, cond);
2293 false_edge->flags = EDGE_FALSE_VALUE;
2294 false_edge->probability = prob.invert ();
2295
2296 edge true_edge = make_edge (bb, label_bb, EDGE_TRUE_VALUE);
2297 fix_phi_operands_for_edge (true_edge, phi_mapping);
2298 true_edge->probability = prob;
2299
2300 return false_edge->dest;
2301}
2302
2303/* Computes the conditional probability of jumping to a target if the branch
2304 instruction is executed.
2305 TARGET_PROB is the estimated probability of jumping to a target relative
2306 to some basic block BB.
2307 BASE_PROB is the probability of reaching the branch instruction relative
2308 to the same basic block BB. */
2309
2310static inline profile_probability
2311conditional_probability (profile_probability target_prob,
2312 profile_probability base_prob)
2313{
2314 return target_prob / base_prob;
2315}
2316
2317/* Emit step-by-step code to select a case for the value of INDEX.
2318 The thus generated decision tree follows the form of the
2319 case-node binary tree NODE, whose nodes represent test conditions.
2320 INDEX_TYPE is the type of the index of the switch.
2321
2322 Care is taken to prune redundant tests from the decision tree
2323 by detecting any boundary conditions already checked by
2324 emitted rtx. (See node_has_high_bound, node_has_low_bound
2325 and node_is_bounded, above.)
2326
2327 Where the test conditions can be shown to be redundant we emit
2328 an unconditional jump to the target code. As a further
2329 optimization, the subordinates of a tree node are examined to
2330 check for bounded nodes. In this case conditional and/or
2331 unconditional jumps as a result of the boundary check for the
2332 current node are arranged to target the subordinates associated
2333 code for out of bound conditions on the current node.
2334
2335 We can assume that when control reaches the code generated here,
2336 the index value has already been compared with the parents
2337 of this node, and determined to be on the same side of each parent
2338 as this node is. Thus, if this node tests for the value 51,
2339 and a parent tested for 52, we don't need to consider
2340 the possibility of a value greater than 51. If another parent
2341 tests for the value 50, then this node need not test anything. */
2342
2343static basic_block
2344emit_case_nodes (basic_block bb, tree index, case_node_ptr node,
2345 basic_block default_bb, tree default_label,
2346 profile_probability default_prob, tree index_type,
2347 hash_map<tree, tree> *phi_mapping)
2348{
2349 /* If INDEX has an unsigned type, we must make unsigned branches. */
2350 profile_probability probability;
2351 profile_probability prob = node->prob, subtree_prob = node->subtree_prob;
2352
2353 /* See if our parents have already tested everything for us.
2354 If they have, emit an unconditional jump for this node. */
2355 if (node_is_bounded (node, index_type))
2356 {
2357 emit_jump (bb, node->case_bb, phi_mapping);
2358 return NULL;
2359 }
2360
2361 else if (tree_int_cst_equal (node->low, node->high))
2362 {
2363 probability = conditional_probability (prob, subtree_prob + default_prob);
2364 /* Node is single valued. First see if the index expression matches
2365 this node and then check our children, if any. */
2366 bb = do_jump_if_equal (bb, index, node->low, node->case_bb, probability,
2367 phi_mapping);
2368 /* Since this case is taken at this point, reduce its weight from
2369 subtree_weight. */
2370 subtree_prob -= prob;
2371 if (node->right != 0 && node->left != 0)
2372 {
2373 /* This node has children on both sides.
2374 Dispatch to one side or the other
2375 by comparing the index value with this node's value.
2376 If one subtree is bounded, check that one first,
2377 so we can avoid real branches in the tree. */
2378
2379 if (node_is_bounded (node->right, index_type))
2380 {
2381 probability
2382 = conditional_probability (node->right->prob,
2383 subtree_prob + default_prob);
2384 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2385 node->right->case_bb, probability,
2386 phi_mapping);
2387 bb = emit_case_nodes (bb, index, node->left, default_bb,
2388 default_label, default_prob, index_type,
2389 phi_mapping);
2390 }
2391
2392 else if (node_is_bounded (node->left, index_type))
2393 {
2394 probability
2395 = conditional_probability (node->left->prob,
2396 subtree_prob + default_prob);
2397 bb = emit_cmp_and_jump_insns (bb, index, node->high, LT_EXPR,
2398 node->left->case_bb, probability,
2399 phi_mapping);
2400 bb = emit_case_nodes (bb, index, node->right, default_bb,
2401 default_label, default_prob, index_type,
2402 phi_mapping);
2403 }
2404
2405 /* If both children are single-valued cases with no
2406 children, finish up all the work. This way, we can save
2407 one ordered comparison. */
2408 else if (tree_int_cst_equal (node->right->low, node->right->high)
2409 && node->right->left == 0 && node->right->right == 0
2410 && tree_int_cst_equal (node->left->low, node->left->high)
2411 && node->left->left == 0 && node->left->right == 0)
2412 {
2413 /* Neither node is bounded. First distinguish the two sides;
2414 then emit the code for one side at a time. */
2415
2416 /* See if the value matches what the right hand side
2417 wants. */
2418 probability
2419 = conditional_probability (node->right->prob,
2420 subtree_prob + default_prob);
2421 bb = do_jump_if_equal (bb, index, node->right->low,
2422 node->right->case_bb, probability,
2423 phi_mapping);
2424
2425 /* See if the value matches what the left hand side
2426 wants. */
2427 probability
2428 = conditional_probability (node->left->prob,
2429 subtree_prob + default_prob);
2430 bb = do_jump_if_equal (bb, index, node->left->low,
2431 node->left->case_bb, probability,
2432 phi_mapping);
2433 }
2434
2435 else
2436 {
2437 /* Neither node is bounded. First distinguish the two sides;
2438 then emit the code for one side at a time. */
2439
2440 basic_block test_bb = split_edge (single_succ_edge (bb));
2441 redirect_edge_succ (single_pred_edge (test_bb),
2442 single_succ_edge (bb)->dest);
2443
2444 /* The default label could be reached either through the right
2445 subtree or the left subtree. Divide the probability
2446 equally. */
2447 probability
2448 = conditional_probability (node->right->subtree_prob
2449 + default_prob.apply_scale (1, 2),
2450 subtree_prob + default_prob);
2451 /* See if the value is on the right. */
2452 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2453 test_bb, probability, phi_mapping);
2454 default_prob = default_prob.apply_scale (1, 2);
2455
2456 /* Value must be on the left.
2457 Handle the left-hand subtree. */
2458 bb = emit_case_nodes (bb, index, node->left, default_bb,
2459 default_label, default_prob, index_type,
2460 phi_mapping);
2461 /* If left-hand subtree does nothing,
2462 go to default. */
2463
2464 if (bb && default_bb)
2465 emit_jump (bb, default_bb, phi_mapping);
2466
2467 /* Code branches here for the right-hand subtree. */
2468 bb = emit_case_nodes (test_bb, index, node->right, default_bb,
2469 default_label, default_prob, index_type,
2470 phi_mapping);
2471 }
2472 }
2473 else if (node->right != 0 && node->left == 0)
2474 {
2475 /* Here we have a right child but no left so we issue a conditional
2476 branch to default and process the right child.
2477
2478 Omit the conditional branch to default if the right child
2479 does not have any children and is single valued; it would
2480 cost too much space to save so little time. */
2481
2482 if (node->right->right || node->right->left
2483 || !tree_int_cst_equal (node->right->low, node->right->high))
2484 {
2485 if (!node_has_low_bound (node, index_type))
2486 {
2487 probability
2488 = conditional_probability (default_prob.apply_scale (1, 2),
2489 subtree_prob + default_prob);
2490 bb = emit_cmp_and_jump_insns (bb, index, node->high, LT_EXPR,
2491 default_bb, probability,
2492 phi_mapping);
2493 default_prob = default_prob.apply_scale (1, 2);
2494 }
2495
2496 bb = emit_case_nodes (bb, index, node->right, default_bb,
2497 default_label, default_prob, index_type,
2498 phi_mapping);
2499 }
2500 else
2501 {
2502 probability
2503 = conditional_probability (node->right->subtree_prob,
2504 subtree_prob + default_prob);
2505 /* We cannot process node->right normally
2506 since we haven't ruled out the numbers less than
2507 this node's value. So handle node->right explicitly. */
2508 bb = do_jump_if_equal (bb, index, node->right->low,
2509 node->right->case_bb, probability,
2510 phi_mapping);
2511 }
2512 }
2513
2514 else if (node->right == 0 && node->left != 0)
2515 {
2516 /* Just one subtree, on the left. */
2517 if (node->left->left || node->left->right
2518 || !tree_int_cst_equal (node->left->low, node->left->high))
2519 {
2520 if (!node_has_high_bound (node, index_type))
2521 {
2522 probability
2523 = conditional_probability (default_prob.apply_scale (1, 2),
2524 subtree_prob + default_prob);
2525 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2526 default_bb, probability,
2527 phi_mapping);
2528 default_prob = default_prob.apply_scale (1, 2);
2529 }
2530
2531 bb = emit_case_nodes (bb, index, node->left, default_bb,
2532 default_label, default_prob, index_type,
2533 phi_mapping);
2534 }
2535 else
2536 {
2537 probability
2538 = conditional_probability (node->left->subtree_prob,
2539 subtree_prob + default_prob);
2540 /* We cannot process node->left normally
2541 since we haven't ruled out the numbers less than
2542 this node's value. So handle node->left explicitly. */
2543 do_jump_if_equal (bb, index, node->left->low, node->left->case_bb,
2544 probability, phi_mapping);
2545 }
2546 }
2547 }
2548 else
2549 {
2550 /* Node is a range. These cases are very similar to those for a single
2551 value, except that we do not start by testing whether this node
2552 is the one to branch to. */
2553
2554 if (node->right != 0 && node->left != 0)
2555 {
2556 /* Node has subtrees on both sides.
2557 If the right-hand subtree is bounded,
2558 test for it first, since we can go straight there.
2559 Otherwise, we need to make a branch in the control structure,
2560 then handle the two subtrees. */
2561 basic_block test_bb = NULL;
2562
2563 if (node_is_bounded (node->right, index_type))
2564 {
2565 /* Right hand node is fully bounded so we can eliminate any
2566 testing and branch directly to the target code. */
2567 probability
2568 = conditional_probability (node->right->subtree_prob,
2569 subtree_prob + default_prob);
2570 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2571 node->right->case_bb, probability,
2572 phi_mapping);
2573 }
2574 else
2575 {
2576 /* Right hand node requires testing.
2577 Branch to a label where we will handle it later. */
2578
2579 test_bb = split_edge (single_succ_edge (bb));
2580 redirect_edge_succ (single_pred_edge (test_bb),
2581 single_succ_edge (bb)->dest);
2582
2583 probability
2584 = conditional_probability (node->right->subtree_prob
2585 + default_prob.apply_scale (1, 2),
2586 subtree_prob + default_prob);
2587 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2588 test_bb, probability, phi_mapping);
2589 default_prob = default_prob.apply_scale (1, 2);
2590 }
2591
2592 /* Value belongs to this node or to the left-hand subtree. */
2593
2594 probability
2595 = conditional_probability (prob, subtree_prob + default_prob);
2596 bb = emit_cmp_and_jump_insns (bb, index, node->low, GE_EXPR,
2597 node->case_bb, probability,
2598 phi_mapping);
2599
2600 /* Handle the left-hand subtree. */
2601 bb = emit_case_nodes (bb, index, node->left, default_bb,
2602 default_label, default_prob, index_type,
2603 phi_mapping);
2604
2605 /* If right node had to be handled later, do that now. */
2606 if (test_bb)
2607 {
2608 /* If the left-hand subtree fell through,
2609 don't let it fall into the right-hand subtree. */
2610 if (bb && default_bb)
2611 emit_jump (bb, default_bb, phi_mapping);
2612
2613 bb = emit_case_nodes (test_bb, index, node->right, default_bb,
2614 default_label, default_prob, index_type,
2615 phi_mapping);
2616 }
2617 }
2618
2619 else if (node->right != 0 && node->left == 0)
2620 {
2621 /* Deal with values to the left of this node,
2622 if they are possible. */
2623 if (!node_has_low_bound (node, index_type))
2624 {
2625 probability
2626 = conditional_probability (default_prob.apply_scale (1, 2),
2627 subtree_prob + default_prob);
2628 bb = emit_cmp_and_jump_insns (bb, index, node->low, LT_EXPR,
2629 default_bb, probability,
2630 phi_mapping);
2631 default_prob = default_prob.apply_scale (1, 2);
2632 }
2633
2634 /* Value belongs to this node or to the right-hand subtree. */
2635
2636 probability
2637 = conditional_probability (prob, subtree_prob + default_prob);
2638 bb = emit_cmp_and_jump_insns (bb, index, node->high, LE_EXPR,
2639 node->case_bb, probability,
2640 phi_mapping);
2641
2642 bb = emit_case_nodes (bb, index, node->right, default_bb,
2643 default_label, default_prob, index_type,
2644 phi_mapping);
2645 }
2646
2647 else if (node->right == 0 && node->left != 0)
2648 {
2649 /* Deal with values to the right of this node,
2650 if they are possible. */
2651 if (!node_has_high_bound (node, index_type))
2652 {
2653 probability
2654 = conditional_probability (default_prob.apply_scale (1, 2),
2655 subtree_prob + default_prob);
2656 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2657 default_bb, probability,
2658 phi_mapping);
2659 default_prob = default_prob.apply_scale (1, 2);
2660 }
2661
2662 /* Value belongs to this node or to the left-hand subtree. */
2663
2664 probability
2665 = conditional_probability (prob, subtree_prob + default_prob);
2666 bb = emit_cmp_and_jump_insns (bb, index, node->low, GE_EXPR,
2667 node->case_bb, probability,
2668 phi_mapping);
2669
2670 bb = emit_case_nodes (bb, index, node->left, default_bb,
2671 default_label, default_prob, index_type,
2672 phi_mapping);
2673 }
2674
2675 else
2676 {
2677 /* Node has no children so we check low and high bounds to remove
2678 redundant tests. Only one of the bounds can exist,
2679 since otherwise this node is bounded--a case tested already. */
2680 bool high_bound = node_has_high_bound (node, index_type);
2681 bool low_bound = node_has_low_bound (node, index_type);
2682
2683 if (!high_bound && low_bound)
2684 {
2685 probability
2686 = conditional_probability (default_prob,
2687 subtree_prob + default_prob);
2688 bb = emit_cmp_and_jump_insns (bb, index, node->high, GT_EXPR,
2689 default_bb, probability,
2690 phi_mapping);
2691 }
2692
2693 else if (!low_bound && high_bound)
2694 {
2695 probability
2696 = conditional_probability (default_prob,
2697 subtree_prob + default_prob);
2698 bb = emit_cmp_and_jump_insns (bb, index, node->low, LT_EXPR,
2699 default_bb, probability,
2700 phi_mapping);
2701 }
2702 else if (!low_bound && !high_bound)
2703 {
2704 tree type = TREE_TYPE (index);
2705 tree utype = unsigned_type_for (type);
2706
2707 tree lhs = make_ssa_name (type);
2708 gassign *sub1
2709 = gimple_build_assign (lhs, MINUS_EXPR, index, node->low);
2710
2711 tree converted = make_ssa_name (utype);
2712 gassign *a = gimple_build_assign (converted, NOP_EXPR, lhs);
2713
2714 tree rhs = fold_build2 (MINUS_EXPR, utype,
2715 fold_convert (type, node->high),
2716 fold_convert (type, node->low));
2717 gimple_stmt_iterator gsi = gsi_last_bb (bb);
2718 gsi_insert_before (&gsi, sub1, GSI_SAME_STMT);
2719 gsi_insert_before (&gsi, a, GSI_SAME_STMT);
2720
2721 probability
2722 = conditional_probability (default_prob,
2723 subtree_prob + default_prob);
2724 bb = emit_cmp_and_jump_insns (bb, converted, rhs, GT_EXPR,
2725 default_bb, probability,
2726 phi_mapping);
2727 }
2728
2729 emit_jump (bb, node->case_bb, phi_mapping);
2730 return NULL;
2731 }
2732 }
2733
2734 return bb;
2735}
2736
2737/* Search the parent sections of the case node tree
2738 to see if a test for the lower bound of NODE would be redundant.
2739 INDEX_TYPE is the type of the index expression.
2740
2741 The instructions to generate the case decision tree are
2742 output in the same order as nodes are processed so it is
2743 known that if a parent node checks the range of the current
2744 node minus one that the current node is bounded at its lower
2745 span. Thus the test would be redundant. */
2746
2747static bool
2748node_has_low_bound (case_node_ptr node, tree index_type)
2749{
2750 tree low_minus_one;
2751 case_node_ptr pnode;
2752
2753 /* If the lower bound of this node is the lowest value in the index type,
2754 we need not test it. */
2755
2756 if (tree_int_cst_equal (node->low, TYPE_MIN_VALUE (index_type)))
2757 return true;
2758
2759 /* If this node has a left branch, the value at the left must be less
2760 than that at this node, so it cannot be bounded at the bottom and
2761 we need not bother testing any further. */
2762
2763 if (node->left)
2764 return false;
2765
2766 low_minus_one = fold_build2 (MINUS_EXPR, TREE_TYPE (node->low), node->low,
2767 build_int_cst (TREE_TYPE (node->low), 1));
2768
2769 /* If the subtraction above overflowed, we can't verify anything.
2770 Otherwise, look for a parent that tests our value - 1. */
2771
2772 if (!tree_int_cst_lt (low_minus_one, node->low))
2773 return false;
2774
2775 for (pnode = node->parent; pnode; pnode = pnode->parent)
2776 if (tree_int_cst_equal (low_minus_one, pnode->high))
2777 return true;
2778
2779 return false;
2780}
2781
2782/* Search the parent sections of the case node tree
2783 to see if a test for the upper bound of NODE would be redundant.
2784 INDEX_TYPE is the type of the index expression.
2785
2786 The instructions to generate the case decision tree are
2787 output in the same order as nodes are processed so it is
2788 known that if a parent node checks the range of the current
2789 node plus one that the current node is bounded at its upper
2790 span. Thus the test would be redundant. */
2791
2792static bool
2793node_has_high_bound (case_node_ptr node, tree index_type)
2794{
2795 tree high_plus_one;
2796 case_node_ptr pnode;
2797
2798 /* If there is no upper bound, obviously no test is needed. */
2799
2800 if (TYPE_MAX_VALUE (index_type) == NULL)
2801 return true;
2802
2803 /* If the upper bound of this node is the highest value in the type
2804 of the index expression, we need not test against it. */
2805
2806 if (tree_int_cst_equal (node->high, TYPE_MAX_VALUE (index_type)))
2807 return true;
2808
2809 /* If this node has a right branch, the value at the right must be greater
2810 than that at this node, so it cannot be bounded at the top and
2811 we need not bother testing any further. */
2812
2813 if (node->right)
2814 return false;
2815
2816 high_plus_one = fold_build2 (PLUS_EXPR, TREE_TYPE (node->high), node->high,
2817 build_int_cst (TREE_TYPE (node->high), 1));
2818
2819 /* If the addition above overflowed, we can't verify anything.
2820 Otherwise, look for a parent that tests our value + 1. */
2821
2822 if (!tree_int_cst_lt (node->high, high_plus_one))
2823 return false;
2824
2825 for (pnode = node->parent; pnode; pnode = pnode->parent)
2826 if (tree_int_cst_equal (high_plus_one, pnode->low))
2827 return true;
2828
2829 return false;
2830}
2831
2832/* Search the parent sections of the
2833 case node tree to see if both tests for the upper and lower
2834 bounds of NODE would be redundant. */
2835
2836static bool
2837node_is_bounded (case_node_ptr node, tree index_type)
2838{
2839 return (node_has_low_bound (node, index_type)
2840 && node_has_high_bound (node, index_type));
2841}