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>
5 This file is part of GCC.
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
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
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/>. */
23 #include "coretypes.h"
28 #include "tree-pass.h"
30 #include "gimple-pretty-print.h"
31 #include "fold-const.h"
32 #include "stor-layout.h"
33 #include "gimple-iterator.h"
35 #include "tree-into-ssa.h"
37 #include "internal-fn.h"
40 /* This pass serves two closely-related purposes:
42 1. It conditionally executes calls that set errno if (a) the result of
43 the call is unused and (b) a simple range check on the arguments can
44 detect most cases where errno does not need to be set.
46 This is the "conditional dead-code elimination" that gave the pass
47 its original name, since the call is dead for most argument values.
48 The calls for which it helps are usually part of the C++ abstraction
49 penalty exposed after inlining.
51 2. It looks for calls to built-in functions that set errno and whose
52 result is used. It checks whether there is an associated internal
53 function that doesn't set errno and whether the target supports
54 that internal function. If so, the pass uses the internal function
55 to compute the result of the built-in function but still arranges
56 for errno to be set when necessary. There are two ways of setting
59 a. by protecting the original call with the same argument checks as (1)
61 b. by protecting the original call with a check that the result
62 of the internal function is not equal to itself (i.e. is NaN).
64 (b) requires that NaNs are the only erroneous results. It is not
65 appropriate for functions like log, which returns ERANGE for zero
66 arguments. (b) is also likely to perform worse than (a) because it
67 requires the result to be calculated first. The pass therefore uses
68 (a) when it can and uses (b) as a fallback.
70 For (b) the pass can replace the original call with a call to
71 IFN_SET_EDOM, if the target supports direct assignments to errno.
73 In both cases, arguments that require errno to be set should occur
74 rarely in practice. Checks of the errno result should also be rare,
75 but the compiler would need powerful interprocedural analysis to
76 prove that errno is not checked. It's much easier to add argument
77 checks or result checks instead.
81 log (x); // Mostly dead call
83 if (__builtin_islessequal (x, 0))
86 With this change, call to log (x) is effectively eliminated, as
87 in the majority of the cases, log won't be called with x out of
88 range. The branch is totally predictable, so the branch cost
96 if (__builtin_isless (x, 0))
99 In the vast majority of cases we should then never need to call sqrt.
101 Note that library functions are not supposed to clear errno to zero without
102 error. See IEEE Std 1003.1, section 2.3 Error Numbers, and section 7.5:3 of
105 The condition wrapping the builtin call is conservatively set to avoid too
106 aggressive (wrong) shrink wrapping. */
109 /* A structure for representing input domain of
110 a function argument in integer. If the lower
111 bound is -inf, has_lb is set to false. If the
112 upper bound is +inf, has_ub is false.
113 is_lb_inclusive and is_ub_inclusive are flags
114 to indicate if lb and ub value are inclusive
123 bool is_lb_inclusive
;
124 bool is_ub_inclusive
;
127 /* A helper function to construct and return an input
128 domain object. LB is the lower bound, HAS_LB is
129 a boolean flag indicating if the lower bound exists,
130 and LB_INCLUSIVE is a boolean flag indicating if the
131 lower bound is inclusive or not. UB, HAS_UB, and
132 UB_INCLUSIVE have the same meaning, but for upper
133 bound of the domain. */
136 get_domain (int lb
, bool has_lb
, bool lb_inclusive
,
137 int ub
, bool has_ub
, bool ub_inclusive
)
141 domain
.has_lb
= has_lb
;
142 domain
.is_lb_inclusive
= lb_inclusive
;
144 domain
.has_ub
= has_ub
;
145 domain
.is_ub_inclusive
= ub_inclusive
;
149 /* A helper function to check the target format for the
150 argument type. In this implementation, only IEEE formats
151 are supported. ARG is the call argument to be checked.
152 Returns true if the format is supported. To support other
153 target formats, function get_no_error_domain needs to be
154 enhanced to have range bounds properly computed. Since
155 the check is cheap (very small number of candidates
156 to be checked), the result is not cached for each float type. */
159 check_target_format (tree arg
)
163 const struct real_format
*rfmt
;
165 type
= TREE_TYPE (arg
);
166 mode
= TYPE_MODE (type
);
167 rfmt
= REAL_MODE_FORMAT (mode
);
169 && (rfmt
== &ieee_single_format
|| rfmt
== &mips_single_format
170 || rfmt
== &motorola_single_format
))
172 && (rfmt
== &ieee_double_format
|| rfmt
== &mips_double_format
173 || rfmt
== &motorola_double_format
))
174 /* For long double, we can not really check XFmode
175 which is only defined on intel platforms.
176 Candidate pre-selection using builtin function
177 code guarantees that we are checking formats
178 for long double modes: double, quad, and extended. */
179 || (mode
!= SFmode
&& mode
!= DFmode
180 && (rfmt
== &ieee_quad_format
181 || rfmt
== &mips_quad_format
182 || rfmt
== &ieee_extended_motorola_format
183 || rfmt
== &ieee_extended_intel_96_format
184 || rfmt
== &ieee_extended_intel_128_format
185 || rfmt
== &ieee_extended_intel_96_round_53_format
)))
192 /* A helper function to help select calls to pow that are suitable for
193 conditional DCE transformation. It looks for pow calls that can be
194 guided with simple conditions. Such calls either have constant base
195 values or base values converted from integers. Returns true if
196 the pow call POW_CALL is a candidate. */
198 /* The maximum integer bit size for base argument of a pow call
199 that is suitable for shrink-wrapping transformation. */
200 #define MAX_BASE_INT_BIT_SIZE 32
203 check_pow (gcall
*pow_call
)
206 enum tree_code bc
, ec
;
208 if (gimple_call_num_args (pow_call
) != 2)
211 base
= gimple_call_arg (pow_call
, 0);
212 expn
= gimple_call_arg (pow_call
, 1);
214 if (!check_target_format (expn
))
217 bc
= TREE_CODE (base
);
218 ec
= TREE_CODE (expn
);
220 /* Folding candidates are not interesting.
221 Can actually assert that it is already folded. */
222 if (ec
== REAL_CST
&& bc
== REAL_CST
)
227 /* Only handle a fixed range of constant. */
229 REAL_VALUE_TYPE bcv
= TREE_REAL_CST (base
);
230 if (real_equal (&bcv
, &dconst1
))
232 if (real_less (&bcv
, &dconst1
))
234 real_from_integer (&mv
, TYPE_MODE (TREE_TYPE (base
)), 256, UNSIGNED
);
235 if (real_less (&mv
, &bcv
))
239 else if (bc
== SSA_NAME
)
241 tree base_val0
, type
;
245 /* Only handles cases where base value is converted
246 from integer values. */
247 base_def
= SSA_NAME_DEF_STMT (base
);
248 if (gimple_code (base_def
) != GIMPLE_ASSIGN
)
251 if (gimple_assign_rhs_code (base_def
) != FLOAT_EXPR
)
253 base_val0
= gimple_assign_rhs1 (base_def
);
255 type
= TREE_TYPE (base_val0
);
256 if (TREE_CODE (type
) != INTEGER_TYPE
)
258 bit_sz
= TYPE_PRECISION (type
);
259 /* If the type of the base is too wide,
260 the resulting shrink wrapping condition
261 will be too conservative. */
262 if (bit_sz
> MAX_BASE_INT_BIT_SIZE
)
271 /* A helper function to help select candidate function calls that are
272 suitable for conditional DCE. Candidate functions must have single
273 valid input domain in this implementation except for pow (see check_pow).
274 Returns true if the function call is a candidate. */
277 check_builtin_call (gcall
*bcall
)
281 arg
= gimple_call_arg (bcall
, 0);
282 return check_target_format (arg
);
285 /* Return true if built-in function call CALL calls a math function
286 and if we know how to test the range of its arguments to detect _most_
287 situations in which errno is not set. The test must err on the side
288 of treating non-erroneous values as potentially erroneous. */
291 can_test_argument_range (gcall
*call
)
293 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call
)))
295 /* Trig functions. */
296 CASE_FLT_FN (BUILT_IN_ACOS
):
297 CASE_FLT_FN (BUILT_IN_ASIN
):
298 /* Hyperbolic functions. */
299 CASE_FLT_FN (BUILT_IN_ACOSH
):
300 CASE_FLT_FN (BUILT_IN_ATANH
):
301 CASE_FLT_FN (BUILT_IN_COSH
):
302 CASE_FLT_FN (BUILT_IN_SINH
):
304 CASE_FLT_FN (BUILT_IN_LOG
):
305 CASE_FLT_FN (BUILT_IN_LOG2
):
306 CASE_FLT_FN (BUILT_IN_LOG10
):
307 CASE_FLT_FN (BUILT_IN_LOG1P
):
309 CASE_FLT_FN (BUILT_IN_EXP
):
310 CASE_FLT_FN (BUILT_IN_EXP2
):
311 CASE_FLT_FN (BUILT_IN_EXP10
):
312 CASE_FLT_FN (BUILT_IN_EXPM1
):
313 CASE_FLT_FN (BUILT_IN_POW10
):
315 CASE_FLT_FN (BUILT_IN_SQRT
):
316 return check_builtin_call (call
);
317 /* Special one: two argument pow. */
319 return check_pow (call
);
327 /* Return true if CALL can produce a domain error (EDOM) but can never
328 produce a pole, range overflow or range underflow error (all ERANGE).
329 This means that we can tell whether a function would have set errno
330 by testing whether the result is a NaN. */
333 edom_only_function (gcall
*call
)
335 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call
)))
337 CASE_FLT_FN (BUILT_IN_ACOS
):
338 CASE_FLT_FN (BUILT_IN_ASIN
):
339 CASE_FLT_FN (BUILT_IN_ATAN
):
340 CASE_FLT_FN (BUILT_IN_COS
):
341 CASE_FLT_FN (BUILT_IN_SIGNIFICAND
):
342 CASE_FLT_FN (BUILT_IN_SIN
):
343 CASE_FLT_FN (BUILT_IN_SQRT
):
344 CASE_FLT_FN (BUILT_IN_FMOD
):
345 CASE_FLT_FN (BUILT_IN_REMAINDER
):
353 /* A helper function to generate gimple statements for one bound
354 comparison, so that the built-in function is called whenever
355 TCODE <ARG, LBUB> is *false*. TEMP_NAME1/TEMP_NAME2 are names
356 of the temporaries, CONDS is a vector holding the produced GIMPLE
357 statements, and NCONDS points to the variable holding the number of
358 logical comparisons. CONDS is either empty or a list ended with a
362 gen_one_condition (tree arg
, int lbub
,
363 enum tree_code tcode
,
364 const char *temp_name1
,
365 const char *temp_name2
,
369 tree lbub_real_cst
, lbub_cst
, float_type
;
370 tree temp
, tempn
, tempc
, tempcn
;
375 float_type
= TREE_TYPE (arg
);
376 lbub_cst
= build_int_cst (integer_type_node
, lbub
);
377 lbub_real_cst
= build_real_from_int_cst (float_type
, lbub_cst
);
379 temp
= create_tmp_var (float_type
, temp_name1
);
380 stmt1
= gimple_build_assign (temp
, arg
);
381 tempn
= make_ssa_name (temp
, stmt1
);
382 gimple_assign_set_lhs (stmt1
, tempn
);
384 tempc
= create_tmp_var (boolean_type_node
, temp_name2
);
385 stmt2
= gimple_build_assign (tempc
,
388 tempn
, lbub_real_cst
));
389 tempcn
= make_ssa_name (tempc
, stmt2
);
390 gimple_assign_set_lhs (stmt2
, tempcn
);
392 stmt3
= gimple_build_cond_from_tree (tempcn
, NULL_TREE
, NULL_TREE
);
393 conds
.quick_push (stmt1
);
394 conds
.quick_push (stmt2
);
395 conds
.quick_push (stmt3
);
399 /* A helper function to generate GIMPLE statements for
400 out of input domain check. ARG is the call argument
401 to be runtime checked, DOMAIN holds the valid domain
402 for the given function, CONDS points to the vector
403 holding the result GIMPLE statements. *NCONDS is
404 the number of logical comparisons. This function
405 produces no more than two logical comparisons, one
406 for lower bound check, one for upper bound check. */
409 gen_conditions_for_domain (tree arg
, inp_domain domain
,
414 gen_one_condition (arg
, domain
.lb
,
415 (domain
.is_lb_inclusive
416 ? UNGE_EXPR
: UNGT_EXPR
),
417 "DCE_COND_LB", "DCE_COND_LB_TEST",
422 /* Now push a separator. */
424 conds
.quick_push (NULL
);
426 gen_one_condition (arg
, domain
.ub
,
427 (domain
.is_ub_inclusive
428 ? UNLE_EXPR
: UNLT_EXPR
),
429 "DCE_COND_UB", "DCE_COND_UB_TEST",
435 /* A helper function to generate condition
436 code for the y argument in call pow (some_const, y).
437 See candidate selection in check_pow. Since the
438 candidates' base values have a limited range,
439 the guarded code generated for y are simple:
440 if (__builtin_isgreater (y, max_y))
442 Note max_y can be computed separately for each
443 const base, but in this implementation, we
444 choose to compute it using the max base
445 in the allowed range for the purpose of
446 simplicity. BASE is the constant base value,
447 EXPN is the expression for the exponent argument,
448 *CONDS is the vector to hold resulting statements,
449 and *NCONDS is the number of logical conditions. */
452 gen_conditions_for_pow_cst_base (tree base
, tree expn
,
456 inp_domain exp_domain
;
457 /* Validate the range of the base constant to make
458 sure it is consistent with check_pow. */
460 REAL_VALUE_TYPE bcv
= TREE_REAL_CST (base
);
461 gcc_assert (!real_equal (&bcv
, &dconst1
)
462 && !real_less (&bcv
, &dconst1
));
463 real_from_integer (&mv
, TYPE_MODE (TREE_TYPE (base
)), 256, UNSIGNED
);
464 gcc_assert (!real_less (&mv
, &bcv
));
466 exp_domain
= get_domain (0, false, false,
469 gen_conditions_for_domain (expn
, exp_domain
,
473 /* Generate error condition code for pow calls with
474 non constant base values. The candidates selected
475 have their base argument value converted from
476 integer (see check_pow) value (1, 2, 4 bytes), and
477 the max exp value is computed based on the size
478 of the integer type (i.e. max possible base value).
479 The resulting input domain for exp argument is thus
480 conservative (smaller than the max value allowed by
481 the runtime value of the base). BASE is the integer
482 base value, EXPN is the expression for the exponent
483 argument, *CONDS is the vector to hold resulting
484 statements, and *NCONDS is the number of logical
488 gen_conditions_for_pow_int_base (tree base
, tree expn
,
497 gimple
*stmt1
, *stmt2
;
499 inp_domain exp_domain
;
501 base_def
= SSA_NAME_DEF_STMT (base
);
502 base_val0
= gimple_assign_rhs1 (base_def
);
503 int_type
= TREE_TYPE (base_val0
);
504 bit_sz
= TYPE_PRECISION (int_type
);
505 gcc_assert (bit_sz
> 0
506 && bit_sz
<= MAX_BASE_INT_BIT_SIZE
);
508 /* Determine the max exp argument value according to
509 the size of the base integer. The max exp value
510 is conservatively estimated assuming IEEE754 double
514 else if (bit_sz
== 16)
518 gcc_assert (bit_sz
== MAX_BASE_INT_BIT_SIZE
);
522 /* For pow ((double)x, y), generate the following conditions:
525 if (__builtin_islessequal (temp1, 0))
529 if (__builtin_isgreater (temp2, max_exp_real_cst)) */
531 /* Generate condition in reverse order -- first
532 the condition for the exp argument. */
534 exp_domain
= get_domain (0, false, false,
535 max_exp
, true, true);
537 gen_conditions_for_domain (expn
, exp_domain
,
540 /* Now generate condition for the base argument.
541 Note it does not use the helper function
542 gen_conditions_for_domain because the base
545 /* Push a separator. */
546 conds
.quick_push (NULL
);
548 temp
= create_tmp_var (int_type
, "DCE_COND1");
549 cst0
= build_int_cst (int_type
, 0);
550 stmt1
= gimple_build_assign (temp
, base_val0
);
551 tempn
= make_ssa_name (temp
, stmt1
);
552 gimple_assign_set_lhs (stmt1
, tempn
);
553 stmt2
= gimple_build_cond (GT_EXPR
, tempn
, cst0
, NULL_TREE
, NULL_TREE
);
555 conds
.quick_push (stmt1
);
556 conds
.quick_push (stmt2
);
560 /* Method to generate conditional statements for guarding conditionally
561 dead calls to pow. One or more statements can be generated for
562 each logical condition. Statement groups of different conditions
563 are separated by a NULL tree and they are stored in the vec
564 conds. The number of logical conditions are stored in *nconds.
566 See C99 standard, 7.12.7.4:2, for description of pow (x, y).
567 The precise condition for domain errors are complex. In this
568 implementation, a simplified (but conservative) valid domain
569 for x and y are used: x is positive to avoid dom errors, while
570 y is smaller than a upper bound (depending on x) to avoid range
571 errors. Runtime code is generated to check x (if not constant)
572 and y against the valid domain. If it is out, jump to the call,
573 otherwise the call is bypassed. POW_CALL is the call statement,
574 *CONDS is a vector holding the resulting condition statements,
575 and *NCONDS is the number of logical conditions. */
578 gen_conditions_for_pow (gcall
*pow_call
, vec
<gimple
*> conds
,
584 gcc_checking_assert (check_pow (pow_call
));
588 base
= gimple_call_arg (pow_call
, 0);
589 expn
= gimple_call_arg (pow_call
, 1);
591 bc
= TREE_CODE (base
);
594 gen_conditions_for_pow_cst_base (base
, expn
, conds
, nconds
);
595 else if (bc
== SSA_NAME
)
596 gen_conditions_for_pow_int_base (base
, expn
, conds
, nconds
);
601 /* A helper routine to help computing the valid input domain
602 for a builtin function. See C99 7.12.7 for details. In this
603 implementation, we only handle single region domain. The
604 resulting region can be conservative (smaller) than the actual
605 one and rounded to integers. Some of the bounds are documented
606 in the standard, while other limit constants are computed
607 assuming IEEE floating point format (for SF and DF modes).
608 Since IEEE only sets minimum requirements for long double format,
609 different long double formats exist under different implementations
610 (e.g, 64 bit double precision (DF), 80 bit double-extended
611 precision (XF), and 128 bit quad precision (QF) ). For simplicity,
612 in this implementation, the computed bounds for long double assume
613 64 bit format (DF), and are therefore conservative. Another
614 assumption is that single precision float type is always SF mode,
615 and double type is DF mode. This function is quite
616 implementation specific, so it may not be suitable to be part of
617 builtins.c. This needs to be revisited later to see if it can
618 be leveraged in x87 assembly expansion. */
621 get_no_error_domain (enum built_in_function fnc
)
625 /* Trig functions: return [-1, +1] */
626 CASE_FLT_FN (BUILT_IN_ACOS
):
627 CASE_FLT_FN (BUILT_IN_ASIN
):
628 return get_domain (-1, true, true,
630 /* Hyperbolic functions. */
631 CASE_FLT_FN (BUILT_IN_ACOSH
):
632 /* acosh: [1, +inf) */
633 return get_domain (1, true, true,
635 CASE_FLT_FN (BUILT_IN_ATANH
):
636 /* atanh: (-1, +1) */
637 return get_domain (-1, true, false,
641 /* coshf: (-89, +89) */
642 return get_domain (-89, true, false,
648 /* cosh: (-710, +710) */
649 return get_domain (-710, true, false,
651 /* Log functions: (0, +inf) */
652 CASE_FLT_FN (BUILT_IN_LOG
):
653 CASE_FLT_FN (BUILT_IN_LOG2
):
654 CASE_FLT_FN (BUILT_IN_LOG10
):
655 return get_domain (0, true, false,
657 CASE_FLT_FN (BUILT_IN_LOG1P
):
658 return get_domain (-1, true, false,
662 case BUILT_IN_EXPM1F
:
663 /* expf: (-inf, 88) */
664 return get_domain (-1, false, false,
669 case BUILT_IN_EXPM1L
:
670 /* exp: (-inf, 709) */
671 return get_domain (-1, false, false,
674 /* exp2f: (-inf, 128) */
675 return get_domain (-1, false, false,
679 /* exp2: (-inf, 1024) */
680 return get_domain (-1, false, false,
682 case BUILT_IN_EXP10F
:
683 case BUILT_IN_POW10F
:
684 /* exp10f: (-inf, 38) */
685 return get_domain (-1, false, false,
689 case BUILT_IN_EXP10L
:
690 case BUILT_IN_POW10L
:
691 /* exp10: (-inf, 308) */
692 return get_domain (-1, false, false,
694 /* sqrt: [0, +inf) */
695 CASE_FLT_FN (BUILT_IN_SQRT
):
696 return get_domain (0, true, true,
705 /* The function to generate shrink wrap conditions for a partially
706 dead builtin call whose return value is not used anywhere,
707 but has to be kept live due to potential error condition.
708 BI_CALL is the builtin call, CONDS is the vector of statements
709 for condition code, NCODES is the pointer to the number of
710 logical conditions. Statements belonging to different logical
711 condition are separated by NULL tree in the vector. */
714 gen_shrink_wrap_conditions (gcall
*bi_call
, vec
<gimple
*> conds
,
715 unsigned int *nconds
)
719 enum built_in_function fnc
;
721 gcc_assert (nconds
&& conds
.exists ());
722 gcc_assert (conds
.length () == 0);
723 gcc_assert (is_gimple_call (bi_call
));
726 fn
= gimple_call_fndecl (call
);
727 gcc_assert (fn
&& DECL_BUILT_IN (fn
));
728 fnc
= DECL_FUNCTION_CODE (fn
);
731 if (fnc
== BUILT_IN_POW
)
732 gen_conditions_for_pow (call
, conds
, nconds
);
736 inp_domain domain
= get_no_error_domain (fnc
);
738 arg
= gimple_call_arg (bi_call
, 0);
739 gen_conditions_for_domain (arg
, domain
, conds
, nconds
);
746 /* Probability of the branch (to the call) is taken. */
747 #define ERR_PROB 0.01
749 /* Shrink-wrap BI_CALL so that it is only called when one of the NCONDS
750 conditions in CONDS is false.
752 Return true on success, in which case the cfg will have been updated. */
755 shrink_wrap_one_built_in_call_with_conds (gcall
*bi_call
, vec
<gimple
*> conds
,
758 gimple_stmt_iterator bi_call_bsi
;
759 basic_block bi_call_bb
, join_tgt_bb
, guard_bb
;
760 edge join_tgt_in_edge_from_call
, join_tgt_in_edge_fall_thru
;
761 edge bi_call_in_edge0
, guard_bb_in_edge
;
762 unsigned tn_cond_stmts
;
764 gimple
*cond_expr
= NULL
;
765 gimple
*cond_expr_start
;
767 /* The cfg we want to create looks like this:
769 [guard n-1] <- guard_bb (old block)
776 [ call ] | <- bi_call_bb }
779 | [ join ] <- join_tgt_bb (old iff call must end bb)
781 possible EH edges (only if [join] is old)
783 When [join] is new, the immediate dominators for these blocks are:
785 1. [guard n-1]: unchanged
786 2. [call]: [guard n-1]
787 3. [guard m]: [guard m+1] for 0 <= m <= n-2
788 4. [join]: [guard n-1]
790 We punt for the more complex case case of [join] being old and
791 simply free the dominance info. We also punt on postdominators,
792 which aren't expected to be available at this point anyway. */
793 bi_call_bb
= gimple_bb (bi_call
);
795 /* Now find the join target bb -- split bi_call_bb if needed. */
796 if (stmt_ends_bb_p (bi_call
))
798 /* If the call must be the last in the bb, don't split the block,
799 it could e.g. have EH edges. */
800 join_tgt_in_edge_from_call
= find_fallthru_edge (bi_call_bb
->succs
);
801 if (join_tgt_in_edge_from_call
== NULL
)
803 free_dominance_info (CDI_DOMINATORS
);
806 join_tgt_in_edge_from_call
= split_block (bi_call_bb
, bi_call
);
808 bi_call_bsi
= gsi_for_stmt (bi_call
);
810 join_tgt_bb
= join_tgt_in_edge_from_call
->dest
;
812 /* Now it is time to insert the first conditional expression
813 into bi_call_bb and split this bb so that bi_call is
815 tn_cond_stmts
= conds
.length ();
817 cond_expr_start
= conds
[0];
818 for (ci
= 0; ci
< tn_cond_stmts
; ci
++)
820 gimple
*c
= conds
[ci
];
821 gcc_assert (c
|| ci
!= 0);
824 gsi_insert_before (&bi_call_bsi
, c
, GSI_SAME_STMT
);
829 gcc_assert (cond_expr
&& gimple_code (cond_expr
) == GIMPLE_COND
);
831 bi_call_in_edge0
= split_block (bi_call_bb
, cond_expr
);
832 bi_call_in_edge0
->flags
&= ~EDGE_FALLTHRU
;
833 bi_call_in_edge0
->flags
|= EDGE_FALSE_VALUE
;
834 guard_bb
= bi_call_bb
;
835 bi_call_bb
= bi_call_in_edge0
->dest
;
836 join_tgt_in_edge_fall_thru
= make_edge (guard_bb
, join_tgt_bb
,
839 bi_call_in_edge0
->probability
= REG_BR_PROB_BASE
* ERR_PROB
;
840 bi_call_in_edge0
->count
=
841 apply_probability (guard_bb
->count
,
842 bi_call_in_edge0
->probability
);
843 join_tgt_in_edge_fall_thru
->probability
=
844 inverse_probability (bi_call_in_edge0
->probability
);
845 join_tgt_in_edge_fall_thru
->count
=
846 guard_bb
->count
- bi_call_in_edge0
->count
;
848 /* Code generation for the rest of the conditions */
852 edge bi_call_in_edge
;
853 gimple_stmt_iterator guard_bsi
= gsi_for_stmt (cond_expr_start
);
855 cond_expr_start
= conds
[ci0
];
856 for (; ci
< tn_cond_stmts
; ci
++)
858 gimple
*c
= conds
[ci
];
859 gcc_assert (c
|| ci
!= ci0
);
862 gsi_insert_before (&guard_bsi
, c
, GSI_SAME_STMT
);
867 gcc_assert (cond_expr
&& gimple_code (cond_expr
) == GIMPLE_COND
);
868 guard_bb_in_edge
= split_block (guard_bb
, cond_expr
);
869 guard_bb_in_edge
->flags
&= ~EDGE_FALLTHRU
;
870 guard_bb_in_edge
->flags
|= EDGE_TRUE_VALUE
;
872 bi_call_in_edge
= make_edge (guard_bb
, bi_call_bb
, EDGE_FALSE_VALUE
);
874 bi_call_in_edge
->probability
= REG_BR_PROB_BASE
* ERR_PROB
;
875 bi_call_in_edge
->count
=
876 apply_probability (guard_bb
->count
,
877 bi_call_in_edge
->probability
);
878 guard_bb_in_edge
->probability
=
879 inverse_probability (bi_call_in_edge
->probability
);
880 guard_bb_in_edge
->count
= guard_bb
->count
- bi_call_in_edge
->count
;
883 if (dom_info_available_p (CDI_DOMINATORS
))
885 /* The split_blocks leave [guard 0] as the immediate dominator
886 of [call] and [call] as the immediate dominator of [join].
888 set_immediate_dominator (CDI_DOMINATORS
, bi_call_bb
, guard_bb
);
889 set_immediate_dominator (CDI_DOMINATORS
, join_tgt_bb
, guard_bb
);
892 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
895 loc
= gimple_location (bi_call
);
897 "%s:%d: note: function call is shrink-wrapped"
898 " into error conditions.\n",
899 LOCATION_FILE (loc
), LOCATION_LINE (loc
));
905 /* Shrink-wrap BI_CALL so that it is only called when it might set errno
906 (but is always called if it would set errno).
908 Return true on success, in which case the cfg will have been updated. */
911 shrink_wrap_one_built_in_call (gcall
*bi_call
)
914 auto_vec
<gimple
*, 12> conds
;
915 gen_shrink_wrap_conditions (bi_call
, conds
, &nconds
);
916 /* This can happen if the condition generator decides
917 it is not beneficial to do the transformation. Just
918 return false and do not do any transformation for
922 return shrink_wrap_one_built_in_call_with_conds (bi_call
, conds
, nconds
);
925 /* Return true if built-in function call CALL could be implemented using
926 a combination of an internal function to compute the result and a
927 separate call to set errno. */
930 can_use_internal_fn (gcall
*call
)
932 /* Only replace calls that set errno. */
933 if (!gimple_vdef (call
))
936 /* Punt if we can't conditionalize the call. */
937 basic_block bb
= gimple_bb (call
);
938 if (stmt_ends_bb_p (call
) && !find_fallthru_edge (bb
->succs
))
941 /* See whether there is an internal function for this built-in. */
942 if (replacement_internal_fn (call
) == IFN_LAST
)
945 /* See whether we can catch all cases where errno would be set,
946 while still avoiding the call in most cases. */
947 if (!can_test_argument_range (call
)
948 && !edom_only_function (call
))
954 /* Implement built-in function call CALL using an internal function.
955 Return true on success, in which case the cfg will have changed. */
958 use_internal_fn (gcall
*call
)
961 auto_vec
<gimple
*, 12> conds
;
962 gen_shrink_wrap_conditions (call
, conds
, &nconds
);
963 if (nconds
== 0 && !edom_only_function (call
))
966 internal_fn ifn
= replacement_internal_fn (call
);
967 gcc_assert (ifn
!= IFN_LAST
);
969 /* Construct the new call, with the same arguments as the original one. */
970 auto_vec
<tree
, 16> args
;
971 unsigned int nargs
= gimple_call_num_args (call
);
972 for (unsigned int i
= 0; i
< nargs
; ++i
)
973 args
.safe_push (gimple_call_arg (call
, i
));
974 gcall
*new_call
= gimple_build_call_internal_vec (ifn
, args
);
975 gimple_set_location (new_call
, gimple_location (call
));
977 /* Transfer the LHS to the new call. */
978 tree lhs
= gimple_call_lhs (call
);
979 gimple_call_set_lhs (new_call
, lhs
);
980 gimple_call_set_lhs (call
, NULL_TREE
);
981 SSA_NAME_DEF_STMT (lhs
) = new_call
;
983 /* Insert the new call. */
984 gimple_stmt_iterator gsi
= gsi_for_stmt (call
);
985 gsi_insert_before (&gsi
, new_call
, GSI_SAME_STMT
);
989 /* Skip the call if LHS == LHS. If we reach here, EDOM is the only
990 valid errno value and it is used iff the result is NaN. */
991 conds
.quick_push (gimple_build_cond (EQ_EXPR
, lhs
, lhs
,
992 NULL_TREE
, NULL_TREE
));
995 /* Try replacing the original call with a direct assignment to
996 errno, via an internal function. */
997 if (set_edom_supported_p () && !stmt_ends_bb_p (call
))
999 gimple_stmt_iterator gsi
= gsi_for_stmt (call
);
1000 gcall
*new_call
= gimple_build_call_internal (IFN_SET_EDOM
, 0);
1001 gimple_set_vuse (new_call
, gimple_vuse (call
));
1002 gimple_set_vdef (new_call
, gimple_vdef (call
));
1003 SSA_NAME_DEF_STMT (gimple_vdef (new_call
)) = new_call
;
1004 gimple_set_location (new_call
, gimple_location (call
));
1005 gsi_replace (&gsi
, new_call
, false);
1010 if (!shrink_wrap_one_built_in_call_with_conds (call
, conds
, nconds
))
1011 /* It's too late to back out now. */
1016 /* The top level function for conditional dead code shrink
1017 wrapping transformation. */
1020 shrink_wrap_conditional_dead_built_in_calls (vec
<gcall
*> calls
)
1022 bool changed
= false;
1025 unsigned n
= calls
.length ();
1031 gcall
*bi_call
= calls
[i
];
1032 if (gimple_call_lhs (bi_call
))
1033 changed
|= use_internal_fn (bi_call
);
1035 changed
|= shrink_wrap_one_built_in_call (bi_call
);
1043 const pass_data pass_data_call_cdce
=
1045 GIMPLE_PASS
, /* type */
1047 OPTGROUP_NONE
, /* optinfo_flags */
1048 TV_TREE_CALL_CDCE
, /* tv_id */
1049 ( PROP_cfg
| PROP_ssa
), /* properties_required */
1050 0, /* properties_provided */
1051 0, /* properties_destroyed */
1052 0, /* todo_flags_start */
1053 0, /* todo_flags_finish */
1056 class pass_call_cdce
: public gimple_opt_pass
1059 pass_call_cdce (gcc::context
*ctxt
)
1060 : gimple_opt_pass (pass_data_call_cdce
, ctxt
)
1063 /* opt_pass methods: */
1064 virtual bool gate (function
*)
1066 /* The limit constants used in the implementation
1067 assume IEEE floating point format. Other formats
1068 can be supported in the future if needed. */
1069 return flag_tree_builtin_call_dce
!= 0;
1072 virtual unsigned int execute (function
*);
1074 }; // class pass_call_cdce
1077 pass_call_cdce::execute (function
*fun
)
1080 gimple_stmt_iterator i
;
1081 bool something_changed
= false;
1082 auto_vec
<gcall
*> cond_dead_built_in_calls
;
1083 FOR_EACH_BB_FN (bb
, fun
)
1085 /* Skip blocks that are being optimized for size, since our
1086 transformation always increases code size. */
1087 if (optimize_bb_for_size_p (bb
))
1090 /* Collect dead call candidates. */
1091 for (i
= gsi_start_bb (bb
); !gsi_end_p (i
); gsi_next (&i
))
1093 gcall
*stmt
= dyn_cast
<gcall
*> (gsi_stmt (i
));
1095 && gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
)
1096 && (gimple_call_lhs (stmt
)
1097 ? can_use_internal_fn (stmt
)
1098 : can_test_argument_range (stmt
)))
1100 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1102 fprintf (dump_file
, "Found conditional dead call: ");
1103 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1104 fprintf (dump_file
, "\n");
1106 if (!cond_dead_built_in_calls
.exists ())
1107 cond_dead_built_in_calls
.create (64);
1108 cond_dead_built_in_calls
.safe_push (stmt
);
1113 if (!cond_dead_built_in_calls
.exists ())
1117 = shrink_wrap_conditional_dead_built_in_calls (cond_dead_built_in_calls
);
1119 if (something_changed
)
1121 free_dominance_info (CDI_POST_DOMINATORS
);
1122 /* As we introduced new control-flow we need to insert PHI-nodes
1123 for the call-clobbers of the remaining call. */
1124 mark_virtual_operands_for_renaming (fun
);
1125 return TODO_update_ssa
;
1134 make_pass_call_cdce (gcc::context
*ctxt
)
1136 return new pass_call_cdce (ctxt
);