rtlanal.c (subreg_get_info): Exit early for simple and common cases.
[gcc.git] / gcc / tree-call-cdce.c
1 /* Conditional Dead Call Elimination pass for the GNU compiler.
2 Copyright (C) 2008-2015 Free Software Foundation, Inc.
3 Contributed by Xinliang David Li <davidxl@google.com>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3, or (at your option) any
10 later version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "predict.h"
26 #include "vec.h"
27 #include "hashtab.h"
28 #include "hash-set.h"
29 #include "machmode.h"
30 #include "hard-reg-set.h"
31 #include "input.h"
32 #include "function.h"
33 #include "dominance.h"
34 #include "cfg.h"
35 #include "basic-block.h"
36 #include "symtab.h"
37 #include "alias.h"
38 #include "double-int.h"
39 #include "wide-int.h"
40 #include "inchash.h"
41 #include "real.h"
42 #include "tree.h"
43 #include "fold-const.h"
44 #include "stor-layout.h"
45 #include "gimple-pretty-print.h"
46 #include "tree-ssa-alias.h"
47 #include "internal-fn.h"
48 #include "gimple-expr.h"
49 #include "is-a.h"
50 #include "gimple.h"
51 #include "gimple-iterator.h"
52 #include "gimple-ssa.h"
53 #include "tree-cfg.h"
54 #include "stringpool.h"
55 #include "tree-ssanames.h"
56 #include "tree-into-ssa.h"
57 #include "tree-pass.h"
58 #include "flags.h"
59 \f
60
61 /* Conditional dead call elimination
62
63 Some builtin functions can set errno on error conditions, but they
64 are otherwise pure. If the result of a call to such a function is
65 not used, the compiler can still not eliminate the call without
66 powerful interprocedural analysis to prove that the errno is not
67 checked. However, if the conditions under which the error occurs
68 are known, the compiler can conditionally dead code eliminate the
69 calls by shrink-wrapping the semi-dead calls into the error condition:
70
71 built_in_call (args)
72 ==>
73 if (error_cond (args))
74 built_in_call (args)
75
76 An actual simple example is :
77 log (x); // Mostly dead call
78 ==>
79 if (x < 0)
80 log (x);
81 With this change, call to log (x) is effectively eliminated, as
82 in majority of the cases, log won't be called with x out of
83 range. The branch is totally predictable, so the branch cost
84 is low.
85
86 Note that library functions are not supposed to clear errno to zero without
87 error. See IEEE Std 1003.1, section 2.3 Error Numbers, and section 7.5:3 of
88 ISO/IEC 9899 (C99).
89
90 The condition wrapping the builtin call is conservatively set to avoid too
91 aggressive (wrong) shrink wrapping. The optimization is called conditional
92 dead call elimination because the call is eliminated under the condition
93 that the input arguments would not lead to domain or range error (for
94 instance when x <= 0 for a log (x) call), however the chances that the error
95 condition is hit is very low (those builtin calls which are conditionally
96 dead are usually part of the C++ abstraction penalty exposed after
97 inlining). */
98
99
100 /* A structure for representing input domain of
101 a function argument in integer. If the lower
102 bound is -inf, has_lb is set to false. If the
103 upper bound is +inf, has_ub is false.
104 is_lb_inclusive and is_ub_inclusive are flags
105 to indicate if lb and ub value are inclusive
106 respectively. */
107
108 typedef struct input_domain
109 {
110 int lb;
111 int ub;
112 bool has_lb;
113 bool has_ub;
114 bool is_lb_inclusive;
115 bool is_ub_inclusive;
116 } inp_domain;
117
118 /* A helper function to construct and return an input
119 domain object. LB is the lower bound, HAS_LB is
120 a boolean flag indicating if the lower bound exists,
121 and LB_INCLUSIVE is a boolean flag indicating if the
122 lower bound is inclusive or not. UB, HAS_UB, and
123 UB_INCLUSIVE have the same meaning, but for upper
124 bound of the domain. */
125
126 static inp_domain
127 get_domain (int lb, bool has_lb, bool lb_inclusive,
128 int ub, bool has_ub, bool ub_inclusive)
129 {
130 inp_domain domain;
131 domain.lb = lb;
132 domain.has_lb = has_lb;
133 domain.is_lb_inclusive = lb_inclusive;
134 domain.ub = ub;
135 domain.has_ub = has_ub;
136 domain.is_ub_inclusive = ub_inclusive;
137 return domain;
138 }
139
140 /* A helper function to check the target format for the
141 argument type. In this implementation, only IEEE formats
142 are supported. ARG is the call argument to be checked.
143 Returns true if the format is supported. To support other
144 target formats, function get_no_error_domain needs to be
145 enhanced to have range bounds properly computed. Since
146 the check is cheap (very small number of candidates
147 to be checked), the result is not cached for each float type. */
148
149 static bool
150 check_target_format (tree arg)
151 {
152 tree type;
153 machine_mode mode;
154 const struct real_format *rfmt;
155
156 type = TREE_TYPE (arg);
157 mode = TYPE_MODE (type);
158 rfmt = REAL_MODE_FORMAT (mode);
159 if ((mode == SFmode
160 && (rfmt == &ieee_single_format || rfmt == &mips_single_format
161 || rfmt == &motorola_single_format))
162 || (mode == DFmode
163 && (rfmt == &ieee_double_format || rfmt == &mips_double_format
164 || rfmt == &motorola_double_format))
165 /* For long double, we can not really check XFmode
166 which is only defined on intel platforms.
167 Candidate pre-selection using builtin function
168 code guarantees that we are checking formats
169 for long double modes: double, quad, and extended. */
170 || (mode != SFmode && mode != DFmode
171 && (rfmt == &ieee_quad_format
172 || rfmt == &mips_quad_format
173 || rfmt == &ieee_extended_motorola_format
174 || rfmt == &ieee_extended_intel_96_format
175 || rfmt == &ieee_extended_intel_128_format
176 || rfmt == &ieee_extended_intel_96_round_53_format)))
177 return true;
178
179 return false;
180 }
181
182 \f
183 /* A helper function to help select calls to pow that are suitable for
184 conditional DCE transformation. It looks for pow calls that can be
185 guided with simple conditions. Such calls either have constant base
186 values or base values converted from integers. Returns true if
187 the pow call POW_CALL is a candidate. */
188
189 /* The maximum integer bit size for base argument of a pow call
190 that is suitable for shrink-wrapping transformation. */
191 #define MAX_BASE_INT_BIT_SIZE 32
192
193 static bool
194 check_pow (gcall *pow_call)
195 {
196 tree base, expn;
197 enum tree_code bc, ec;
198
199 if (gimple_call_num_args (pow_call) != 2)
200 return false;
201
202 base = gimple_call_arg (pow_call, 0);
203 expn = gimple_call_arg (pow_call, 1);
204
205 if (!check_target_format (expn))
206 return false;
207
208 bc = TREE_CODE (base);
209 ec = TREE_CODE (expn);
210
211 /* Folding candidates are not interesting.
212 Can actually assert that it is already folded. */
213 if (ec == REAL_CST && bc == REAL_CST)
214 return false;
215
216 if (bc == REAL_CST)
217 {
218 /* Only handle a fixed range of constant. */
219 REAL_VALUE_TYPE mv;
220 REAL_VALUE_TYPE bcv = TREE_REAL_CST (base);
221 if (REAL_VALUES_EQUAL (bcv, dconst1))
222 return false;
223 if (REAL_VALUES_LESS (bcv, dconst1))
224 return false;
225 real_from_integer (&mv, TYPE_MODE (TREE_TYPE (base)), 256, UNSIGNED);
226 if (REAL_VALUES_LESS (mv, bcv))
227 return false;
228 return true;
229 }
230 else if (bc == SSA_NAME)
231 {
232 tree base_val0, type;
233 gimple base_def;
234 int bit_sz;
235
236 /* Only handles cases where base value is converted
237 from integer values. */
238 base_def = SSA_NAME_DEF_STMT (base);
239 if (gimple_code (base_def) != GIMPLE_ASSIGN)
240 return false;
241
242 if (gimple_assign_rhs_code (base_def) != FLOAT_EXPR)
243 return false;
244 base_val0 = gimple_assign_rhs1 (base_def);
245
246 type = TREE_TYPE (base_val0);
247 if (TREE_CODE (type) != INTEGER_TYPE)
248 return false;
249 bit_sz = TYPE_PRECISION (type);
250 /* If the type of the base is too wide,
251 the resulting shrink wrapping condition
252 will be too conservative. */
253 if (bit_sz > MAX_BASE_INT_BIT_SIZE)
254 return false;
255
256 return true;
257 }
258 else
259 return false;
260 }
261
262 /* A helper function to help select candidate function calls that are
263 suitable for conditional DCE. Candidate functions must have single
264 valid input domain in this implementation except for pow (see check_pow).
265 Returns true if the function call is a candidate. */
266
267 static bool
268 check_builtin_call (gcall *bcall)
269 {
270 tree arg;
271
272 arg = gimple_call_arg (bcall, 0);
273 return check_target_format (arg);
274 }
275
276 /* A helper function to determine if a builtin function call is a
277 candidate for conditional DCE. Returns true if the builtin call
278 is a candidate. */
279
280 static bool
281 is_call_dce_candidate (gcall *call)
282 {
283 tree fn;
284 enum built_in_function fnc;
285
286 /* Only potentially dead calls are considered. */
287 if (gimple_call_lhs (call))
288 return false;
289
290 fn = gimple_call_fndecl (call);
291 if (!fn
292 || !DECL_BUILT_IN (fn)
293 || (DECL_BUILT_IN_CLASS (fn) != BUILT_IN_NORMAL))
294 return false;
295
296 fnc = DECL_FUNCTION_CODE (fn);
297 switch (fnc)
298 {
299 /* Trig functions. */
300 CASE_FLT_FN (BUILT_IN_ACOS):
301 CASE_FLT_FN (BUILT_IN_ASIN):
302 /* Hyperbolic functions. */
303 CASE_FLT_FN (BUILT_IN_ACOSH):
304 CASE_FLT_FN (BUILT_IN_ATANH):
305 CASE_FLT_FN (BUILT_IN_COSH):
306 CASE_FLT_FN (BUILT_IN_SINH):
307 /* Log functions. */
308 CASE_FLT_FN (BUILT_IN_LOG):
309 CASE_FLT_FN (BUILT_IN_LOG2):
310 CASE_FLT_FN (BUILT_IN_LOG10):
311 CASE_FLT_FN (BUILT_IN_LOG1P):
312 /* Exp functions. */
313 CASE_FLT_FN (BUILT_IN_EXP):
314 CASE_FLT_FN (BUILT_IN_EXP2):
315 CASE_FLT_FN (BUILT_IN_EXP10):
316 CASE_FLT_FN (BUILT_IN_EXPM1):
317 CASE_FLT_FN (BUILT_IN_POW10):
318 /* Sqrt. */
319 CASE_FLT_FN (BUILT_IN_SQRT):
320 return check_builtin_call (call);
321 /* Special one: two argument pow. */
322 case BUILT_IN_POW:
323 return check_pow (call);
324 default:
325 break;
326 }
327
328 return false;
329 }
330
331 \f
332 /* A helper function to generate gimple statements for
333 one bound comparison. ARG is the call argument to
334 be compared with the bound, LBUB is the bound value
335 in integer, TCODE is the tree_code of the comparison,
336 TEMP_NAME1/TEMP_NAME2 are names of the temporaries,
337 CONDS is a vector holding the produced GIMPLE statements,
338 and NCONDS points to the variable holding the number
339 of logical comparisons. CONDS is either empty or
340 a list ended with a null tree. */
341
342 static void
343 gen_one_condition (tree arg, int lbub,
344 enum tree_code tcode,
345 const char *temp_name1,
346 const char *temp_name2,
347 vec<gimple> conds,
348 unsigned *nconds)
349 {
350 tree lbub_real_cst, lbub_cst, float_type;
351 tree temp, tempn, tempc, tempcn;
352 gassign *stmt1;
353 gassign *stmt2;
354 gcond *stmt3;
355
356 float_type = TREE_TYPE (arg);
357 lbub_cst = build_int_cst (integer_type_node, lbub);
358 lbub_real_cst = build_real_from_int_cst (float_type, lbub_cst);
359
360 temp = create_tmp_var (float_type, temp_name1);
361 stmt1 = gimple_build_assign (temp, arg);
362 tempn = make_ssa_name (temp, stmt1);
363 gimple_assign_set_lhs (stmt1, tempn);
364
365 tempc = create_tmp_var (boolean_type_node, temp_name2);
366 stmt2 = gimple_build_assign (tempc,
367 fold_build2 (tcode,
368 boolean_type_node,
369 tempn, lbub_real_cst));
370 tempcn = make_ssa_name (tempc, stmt2);
371 gimple_assign_set_lhs (stmt2, tempcn);
372
373 stmt3 = gimple_build_cond_from_tree (tempcn, NULL_TREE, NULL_TREE);
374 conds.quick_push (stmt1);
375 conds.quick_push (stmt2);
376 conds.quick_push (stmt3);
377 (*nconds)++;
378 }
379
380 /* A helper function to generate GIMPLE statements for
381 out of input domain check. ARG is the call argument
382 to be runtime checked, DOMAIN holds the valid domain
383 for the given function, CONDS points to the vector
384 holding the result GIMPLE statements. *NCONDS is
385 the number of logical comparisons. This function
386 produces no more than two logical comparisons, one
387 for lower bound check, one for upper bound check. */
388
389 static void
390 gen_conditions_for_domain (tree arg, inp_domain domain,
391 vec<gimple> conds,
392 unsigned *nconds)
393 {
394 if (domain.has_lb)
395 gen_one_condition (arg, domain.lb,
396 (domain.is_lb_inclusive
397 ? LT_EXPR : LE_EXPR),
398 "DCE_COND_LB", "DCE_COND_LB_TEST",
399 conds, nconds);
400
401 if (domain.has_ub)
402 {
403 /* Now push a separator. */
404 if (domain.has_lb)
405 conds.quick_push (NULL);
406
407 gen_one_condition (arg, domain.ub,
408 (domain.is_ub_inclusive
409 ? GT_EXPR : GE_EXPR),
410 "DCE_COND_UB", "DCE_COND_UB_TEST",
411 conds, nconds);
412 }
413 }
414
415
416 /* A helper function to generate condition
417 code for the y argument in call pow (some_const, y).
418 See candidate selection in check_pow. Since the
419 candidates' base values have a limited range,
420 the guarded code generated for y are simple:
421 if (y > max_y)
422 pow (const, y);
423 Note max_y can be computed separately for each
424 const base, but in this implementation, we
425 choose to compute it using the max base
426 in the allowed range for the purpose of
427 simplicity. BASE is the constant base value,
428 EXPN is the expression for the exponent argument,
429 *CONDS is the vector to hold resulting statements,
430 and *NCONDS is the number of logical conditions. */
431
432 static void
433 gen_conditions_for_pow_cst_base (tree base, tree expn,
434 vec<gimple> conds,
435 unsigned *nconds)
436 {
437 inp_domain exp_domain;
438 /* Validate the range of the base constant to make
439 sure it is consistent with check_pow. */
440 REAL_VALUE_TYPE mv;
441 REAL_VALUE_TYPE bcv = TREE_REAL_CST (base);
442 gcc_assert (!REAL_VALUES_EQUAL (bcv, dconst1)
443 && !REAL_VALUES_LESS (bcv, dconst1));
444 real_from_integer (&mv, TYPE_MODE (TREE_TYPE (base)), 256, UNSIGNED);
445 gcc_assert (!REAL_VALUES_LESS (mv, bcv));
446
447 exp_domain = get_domain (0, false, false,
448 127, true, false);
449
450 gen_conditions_for_domain (expn, exp_domain,
451 conds, nconds);
452 }
453
454 /* Generate error condition code for pow calls with
455 non constant base values. The candidates selected
456 have their base argument value converted from
457 integer (see check_pow) value (1, 2, 4 bytes), and
458 the max exp value is computed based on the size
459 of the integer type (i.e. max possible base value).
460 The resulting input domain for exp argument is thus
461 conservative (smaller than the max value allowed by
462 the runtime value of the base). BASE is the integer
463 base value, EXPN is the expression for the exponent
464 argument, *CONDS is the vector to hold resulting
465 statements, and *NCONDS is the number of logical
466 conditions. */
467
468 static void
469 gen_conditions_for_pow_int_base (tree base, tree expn,
470 vec<gimple> conds,
471 unsigned *nconds)
472 {
473 gimple base_def;
474 tree base_val0;
475 tree int_type;
476 tree temp, tempn;
477 tree cst0;
478 gimple stmt1, stmt2;
479 int bit_sz, max_exp;
480 inp_domain exp_domain;
481
482 base_def = SSA_NAME_DEF_STMT (base);
483 base_val0 = gimple_assign_rhs1 (base_def);
484 int_type = TREE_TYPE (base_val0);
485 bit_sz = TYPE_PRECISION (int_type);
486 gcc_assert (bit_sz > 0
487 && bit_sz <= MAX_BASE_INT_BIT_SIZE);
488
489 /* Determine the max exp argument value according to
490 the size of the base integer. The max exp value
491 is conservatively estimated assuming IEEE754 double
492 precision format. */
493 if (bit_sz == 8)
494 max_exp = 128;
495 else if (bit_sz == 16)
496 max_exp = 64;
497 else
498 {
499 gcc_assert (bit_sz == MAX_BASE_INT_BIT_SIZE);
500 max_exp = 32;
501 }
502
503 /* For pow ((double)x, y), generate the following conditions:
504 cond 1:
505 temp1 = x;
506 if (temp1 <= 0)
507
508 cond 2:
509 temp2 = y;
510 if (temp2 > max_exp_real_cst) */
511
512 /* Generate condition in reverse order -- first
513 the condition for the exp argument. */
514
515 exp_domain = get_domain (0, false, false,
516 max_exp, true, true);
517
518 gen_conditions_for_domain (expn, exp_domain,
519 conds, nconds);
520
521 /* Now generate condition for the base argument.
522 Note it does not use the helper function
523 gen_conditions_for_domain because the base
524 type is integer. */
525
526 /* Push a separator. */
527 conds.quick_push (NULL);
528
529 temp = create_tmp_var (int_type, "DCE_COND1");
530 cst0 = build_int_cst (int_type, 0);
531 stmt1 = gimple_build_assign (temp, base_val0);
532 tempn = make_ssa_name (temp, stmt1);
533 gimple_assign_set_lhs (stmt1, tempn);
534 stmt2 = gimple_build_cond (LE_EXPR, tempn, cst0, NULL_TREE, NULL_TREE);
535
536 conds.quick_push (stmt1);
537 conds.quick_push (stmt2);
538 (*nconds)++;
539 }
540
541 /* Method to generate conditional statements for guarding conditionally
542 dead calls to pow. One or more statements can be generated for
543 each logical condition. Statement groups of different conditions
544 are separated by a NULL tree and they are stored in the vec
545 conds. The number of logical conditions are stored in *nconds.
546
547 See C99 standard, 7.12.7.4:2, for description of pow (x, y).
548 The precise condition for domain errors are complex. In this
549 implementation, a simplified (but conservative) valid domain
550 for x and y are used: x is positive to avoid dom errors, while
551 y is smaller than a upper bound (depending on x) to avoid range
552 errors. Runtime code is generated to check x (if not constant)
553 and y against the valid domain. If it is out, jump to the call,
554 otherwise the call is bypassed. POW_CALL is the call statement,
555 *CONDS is a vector holding the resulting condition statements,
556 and *NCONDS is the number of logical conditions. */
557
558 static void
559 gen_conditions_for_pow (gcall *pow_call, vec<gimple> conds,
560 unsigned *nconds)
561 {
562 tree base, expn;
563 enum tree_code bc;
564
565 gcc_checking_assert (check_pow (pow_call));
566
567 *nconds = 0;
568
569 base = gimple_call_arg (pow_call, 0);
570 expn = gimple_call_arg (pow_call, 1);
571
572 bc = TREE_CODE (base);
573
574 if (bc == REAL_CST)
575 gen_conditions_for_pow_cst_base (base, expn, conds, nconds);
576 else if (bc == SSA_NAME)
577 gen_conditions_for_pow_int_base (base, expn, conds, nconds);
578 else
579 gcc_unreachable ();
580 }
581
582 /* A helper routine to help computing the valid input domain
583 for a builtin function. See C99 7.12.7 for details. In this
584 implementation, we only handle single region domain. The
585 resulting region can be conservative (smaller) than the actual
586 one and rounded to integers. Some of the bounds are documented
587 in the standard, while other limit constants are computed
588 assuming IEEE floating point format (for SF and DF modes).
589 Since IEEE only sets minimum requirements for long double format,
590 different long double formats exist under different implementations
591 (e.g, 64 bit double precision (DF), 80 bit double-extended
592 precision (XF), and 128 bit quad precision (QF) ). For simplicity,
593 in this implementation, the computed bounds for long double assume
594 64 bit format (DF), and are therefore conservative. Another
595 assumption is that single precision float type is always SF mode,
596 and double type is DF mode. This function is quite
597 implementation specific, so it may not be suitable to be part of
598 builtins.c. This needs to be revisited later to see if it can
599 be leveraged in x87 assembly expansion. */
600
601 static inp_domain
602 get_no_error_domain (enum built_in_function fnc)
603 {
604 switch (fnc)
605 {
606 /* Trig functions: return [-1, +1] */
607 CASE_FLT_FN (BUILT_IN_ACOS):
608 CASE_FLT_FN (BUILT_IN_ASIN):
609 return get_domain (-1, true, true,
610 1, true, true);
611 /* Hyperbolic functions. */
612 CASE_FLT_FN (BUILT_IN_ACOSH):
613 /* acosh: [1, +inf) */
614 return get_domain (1, true, true,
615 1, false, false);
616 CASE_FLT_FN (BUILT_IN_ATANH):
617 /* atanh: (-1, +1) */
618 return get_domain (-1, true, false,
619 1, true, false);
620 case BUILT_IN_COSHF:
621 case BUILT_IN_SINHF:
622 /* coshf: (-89, +89) */
623 return get_domain (-89, true, false,
624 89, true, false);
625 case BUILT_IN_COSH:
626 case BUILT_IN_SINH:
627 case BUILT_IN_COSHL:
628 case BUILT_IN_SINHL:
629 /* cosh: (-710, +710) */
630 return get_domain (-710, true, false,
631 710, true, false);
632 /* Log functions: (0, +inf) */
633 CASE_FLT_FN (BUILT_IN_LOG):
634 CASE_FLT_FN (BUILT_IN_LOG2):
635 CASE_FLT_FN (BUILT_IN_LOG10):
636 return get_domain (0, true, false,
637 0, false, false);
638 CASE_FLT_FN (BUILT_IN_LOG1P):
639 return get_domain (-1, true, false,
640 0, false, false);
641 /* Exp functions. */
642 case BUILT_IN_EXPF:
643 case BUILT_IN_EXPM1F:
644 /* expf: (-inf, 88) */
645 return get_domain (-1, false, false,
646 88, true, false);
647 case BUILT_IN_EXP:
648 case BUILT_IN_EXPM1:
649 case BUILT_IN_EXPL:
650 case BUILT_IN_EXPM1L:
651 /* exp: (-inf, 709) */
652 return get_domain (-1, false, false,
653 709, true, false);
654 case BUILT_IN_EXP2F:
655 /* exp2f: (-inf, 128) */
656 return get_domain (-1, false, false,
657 128, true, false);
658 case BUILT_IN_EXP2:
659 case BUILT_IN_EXP2L:
660 /* exp2: (-inf, 1024) */
661 return get_domain (-1, false, false,
662 1024, true, false);
663 case BUILT_IN_EXP10F:
664 case BUILT_IN_POW10F:
665 /* exp10f: (-inf, 38) */
666 return get_domain (-1, false, false,
667 38, true, false);
668 case BUILT_IN_EXP10:
669 case BUILT_IN_POW10:
670 case BUILT_IN_EXP10L:
671 case BUILT_IN_POW10L:
672 /* exp10: (-inf, 308) */
673 return get_domain (-1, false, false,
674 308, true, false);
675 /* sqrt: [0, +inf) */
676 CASE_FLT_FN (BUILT_IN_SQRT):
677 return get_domain (0, true, true,
678 0, false, false);
679 default:
680 gcc_unreachable ();
681 }
682
683 gcc_unreachable ();
684 }
685
686 /* The function to generate shrink wrap conditions for a partially
687 dead builtin call whose return value is not used anywhere,
688 but has to be kept live due to potential error condition.
689 BI_CALL is the builtin call, CONDS is the vector of statements
690 for condition code, NCODES is the pointer to the number of
691 logical conditions. Statements belonging to different logical
692 condition are separated by NULL tree in the vector. */
693
694 static void
695 gen_shrink_wrap_conditions (gcall *bi_call, vec<gimple> conds,
696 unsigned int *nconds)
697 {
698 gcall *call;
699 tree fn;
700 enum built_in_function fnc;
701
702 gcc_assert (nconds && conds.exists ());
703 gcc_assert (conds.length () == 0);
704 gcc_assert (is_gimple_call (bi_call));
705
706 call = bi_call;
707 fn = gimple_call_fndecl (call);
708 gcc_assert (fn && DECL_BUILT_IN (fn));
709 fnc = DECL_FUNCTION_CODE (fn);
710 *nconds = 0;
711
712 if (fnc == BUILT_IN_POW)
713 gen_conditions_for_pow (call, conds, nconds);
714 else
715 {
716 tree arg;
717 inp_domain domain = get_no_error_domain (fnc);
718 *nconds = 0;
719 arg = gimple_call_arg (bi_call, 0);
720 gen_conditions_for_domain (arg, domain, conds, nconds);
721 }
722
723 return;
724 }
725
726
727 /* Probability of the branch (to the call) is taken. */
728 #define ERR_PROB 0.01
729
730 /* The function to shrink wrap a partially dead builtin call
731 whose return value is not used anywhere, but has to be kept
732 live due to potential error condition. Returns true if the
733 transformation actually happens. */
734
735 static bool
736 shrink_wrap_one_built_in_call (gcall *bi_call)
737 {
738 gimple_stmt_iterator bi_call_bsi;
739 basic_block bi_call_bb, join_tgt_bb, guard_bb, guard_bb0;
740 edge join_tgt_in_edge_from_call, join_tgt_in_edge_fall_thru;
741 edge bi_call_in_edge0, guard_bb_in_edge;
742 unsigned tn_cond_stmts, nconds;
743 unsigned ci;
744 gimple cond_expr = NULL;
745 gimple cond_expr_start;
746 tree bi_call_label_decl;
747 gimple bi_call_label;
748
749 auto_vec<gimple, 12> conds;
750 gen_shrink_wrap_conditions (bi_call, conds, &nconds);
751
752 /* This can happen if the condition generator decides
753 it is not beneficial to do the transformation. Just
754 return false and do not do any transformation for
755 the call. */
756 if (nconds == 0)
757 return false;
758
759 bi_call_bb = gimple_bb (bi_call);
760
761 /* Now find the join target bb -- split bi_call_bb if needed. */
762 if (stmt_ends_bb_p (bi_call))
763 {
764 /* If the call must be the last in the bb, don't split the block,
765 it could e.g. have EH edges. */
766 join_tgt_in_edge_from_call = find_fallthru_edge (bi_call_bb->succs);
767 if (join_tgt_in_edge_from_call == NULL)
768 return false;
769 }
770 else
771 join_tgt_in_edge_from_call = split_block (bi_call_bb, bi_call);
772
773 bi_call_bsi = gsi_for_stmt (bi_call);
774
775 join_tgt_bb = join_tgt_in_edge_from_call->dest;
776
777 /* Now it is time to insert the first conditional expression
778 into bi_call_bb and split this bb so that bi_call is
779 shrink-wrapped. */
780 tn_cond_stmts = conds.length ();
781 cond_expr = NULL;
782 cond_expr_start = conds[0];
783 for (ci = 0; ci < tn_cond_stmts; ci++)
784 {
785 gimple c = conds[ci];
786 gcc_assert (c || ci != 0);
787 if (!c)
788 break;
789 gsi_insert_before (&bi_call_bsi, c, GSI_SAME_STMT);
790 cond_expr = c;
791 }
792 nconds--;
793 ci++;
794 gcc_assert (cond_expr && gimple_code (cond_expr) == GIMPLE_COND);
795
796 /* Now the label. */
797 bi_call_label_decl = create_artificial_label (gimple_location (bi_call));
798 bi_call_label = gimple_build_label (bi_call_label_decl);
799 gsi_insert_before (&bi_call_bsi, bi_call_label, GSI_SAME_STMT);
800
801 bi_call_in_edge0 = split_block (bi_call_bb, cond_expr);
802 bi_call_in_edge0->flags &= ~EDGE_FALLTHRU;
803 bi_call_in_edge0->flags |= EDGE_TRUE_VALUE;
804 guard_bb0 = bi_call_bb;
805 bi_call_bb = bi_call_in_edge0->dest;
806 join_tgt_in_edge_fall_thru = make_edge (guard_bb0, join_tgt_bb,
807 EDGE_FALSE_VALUE);
808
809 bi_call_in_edge0->probability = REG_BR_PROB_BASE * ERR_PROB;
810 bi_call_in_edge0->count =
811 apply_probability (guard_bb0->count,
812 bi_call_in_edge0->probability);
813 join_tgt_in_edge_fall_thru->probability =
814 inverse_probability (bi_call_in_edge0->probability);
815 join_tgt_in_edge_fall_thru->count =
816 guard_bb0->count - bi_call_in_edge0->count;
817
818 /* Code generation for the rest of the conditions */
819 guard_bb = guard_bb0;
820 while (nconds > 0)
821 {
822 unsigned ci0;
823 edge bi_call_in_edge;
824 gimple_stmt_iterator guard_bsi = gsi_for_stmt (cond_expr_start);
825 ci0 = ci;
826 cond_expr_start = conds[ci0];
827 for (; ci < tn_cond_stmts; ci++)
828 {
829 gimple c = conds[ci];
830 gcc_assert (c || ci != ci0);
831 if (!c)
832 break;
833 gsi_insert_before (&guard_bsi, c, GSI_SAME_STMT);
834 cond_expr = c;
835 }
836 nconds--;
837 ci++;
838 gcc_assert (cond_expr && gimple_code (cond_expr) == GIMPLE_COND);
839 guard_bb_in_edge = split_block (guard_bb, cond_expr);
840 guard_bb_in_edge->flags &= ~EDGE_FALLTHRU;
841 guard_bb_in_edge->flags |= EDGE_FALSE_VALUE;
842
843 bi_call_in_edge = make_edge (guard_bb, bi_call_bb, EDGE_TRUE_VALUE);
844
845 bi_call_in_edge->probability = REG_BR_PROB_BASE * ERR_PROB;
846 bi_call_in_edge->count =
847 apply_probability (guard_bb->count,
848 bi_call_in_edge->probability);
849 guard_bb_in_edge->probability =
850 inverse_probability (bi_call_in_edge->probability);
851 guard_bb_in_edge->count = guard_bb->count - bi_call_in_edge->count;
852 }
853
854 if (dump_file && (dump_flags & TDF_DETAILS))
855 {
856 location_t loc;
857 loc = gimple_location (bi_call);
858 fprintf (dump_file,
859 "%s:%d: note: function call is shrink-wrapped"
860 " into error conditions.\n",
861 LOCATION_FILE (loc), LOCATION_LINE (loc));
862 }
863
864 return true;
865 }
866
867 /* The top level function for conditional dead code shrink
868 wrapping transformation. */
869
870 static bool
871 shrink_wrap_conditional_dead_built_in_calls (vec<gcall *> calls)
872 {
873 bool changed = false;
874 unsigned i = 0;
875
876 unsigned n = calls.length ();
877 if (n == 0)
878 return false;
879
880 for (; i < n ; i++)
881 {
882 gcall *bi_call = calls[i];
883 changed |= shrink_wrap_one_built_in_call (bi_call);
884 }
885
886 return changed;
887 }
888
889 namespace {
890
891 const pass_data pass_data_call_cdce =
892 {
893 GIMPLE_PASS, /* type */
894 "cdce", /* name */
895 OPTGROUP_NONE, /* optinfo_flags */
896 TV_TREE_CALL_CDCE, /* tv_id */
897 ( PROP_cfg | PROP_ssa ), /* properties_required */
898 0, /* properties_provided */
899 0, /* properties_destroyed */
900 0, /* todo_flags_start */
901 0, /* todo_flags_finish */
902 };
903
904 class pass_call_cdce : public gimple_opt_pass
905 {
906 public:
907 pass_call_cdce (gcc::context *ctxt)
908 : gimple_opt_pass (pass_data_call_cdce, ctxt)
909 {}
910
911 /* opt_pass methods: */
912 virtual bool gate (function *fun)
913 {
914 /* The limit constants used in the implementation
915 assume IEEE floating point format. Other formats
916 can be supported in the future if needed. */
917 return flag_tree_builtin_call_dce != 0
918 && optimize_function_for_speed_p (fun);
919 }
920
921 virtual unsigned int execute (function *);
922
923 }; // class pass_call_cdce
924
925 unsigned int
926 pass_call_cdce::execute (function *fun)
927 {
928 basic_block bb;
929 gimple_stmt_iterator i;
930 bool something_changed = false;
931 auto_vec<gcall *> cond_dead_built_in_calls;
932 FOR_EACH_BB_FN (bb, fun)
933 {
934 /* Collect dead call candidates. */
935 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
936 {
937 gcall *stmt = dyn_cast <gcall *> (gsi_stmt (i));
938 if (stmt && is_call_dce_candidate (stmt))
939 {
940 if (dump_file && (dump_flags & TDF_DETAILS))
941 {
942 fprintf (dump_file, "Found conditional dead call: ");
943 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
944 fprintf (dump_file, "\n");
945 }
946 if (!cond_dead_built_in_calls.exists ())
947 cond_dead_built_in_calls.create (64);
948 cond_dead_built_in_calls.safe_push (stmt);
949 }
950 }
951 }
952
953 if (!cond_dead_built_in_calls.exists ())
954 return 0;
955
956 something_changed
957 = shrink_wrap_conditional_dead_built_in_calls (cond_dead_built_in_calls);
958
959 if (something_changed)
960 {
961 free_dominance_info (CDI_DOMINATORS);
962 free_dominance_info (CDI_POST_DOMINATORS);
963 /* As we introduced new control-flow we need to insert PHI-nodes
964 for the call-clobbers of the remaining call. */
965 mark_virtual_operands_for_renaming (fun);
966 return TODO_update_ssa;
967 }
968
969 return 0;
970 }
971
972 } // anon namespace
973
974 gimple_opt_pass *
975 make_pass_call_cdce (gcc::context *ctxt)
976 {
977 return new pass_call_cdce (ctxt);
978 }