GCC Middle and Back End API Reference
|
Data Fields | |
int | lb |
int | ub |
bool | has_lb |
bool | has_ub |
bool | is_lb_inclusive |
bool | is_ub_inclusive |
@verbatim Conditional Dead Call Elimination pass for the GNU compiler.
Copyright (C) 2008-2013 Free Software Foundation, Inc. Contributed by Xinliang David Li david xl@g oogle .com
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see http://www.gnu.org/licenses/.
Conditional dead call elimination Some builtin functions can set errno on error conditions, but they are otherwise pure. If the result of a call to such a function is not used, the compiler can still not eliminate the call without powerful interprocedural analysis to prove that the errno is not checked. However, if the conditions under which the error occurs are known, the compiler can conditionally dead code eliminate the calls by shrink-wrapping the semi-dead calls into the error condition: built_in_call (args) ==> if (error_cond (args)) built_in_call (args) An actual simple example is : log (x); // Mostly dead call ==> if (x < 0) log (x); With this change, call to log (x) is effectively eliminated, as in majority of the cases, log won't be called with x out of range. The branch is totally predictable, so the branch cost is low. Note that library functions are not supposed to clear errno to zero without error. See IEEE Std 1003.1, section 2.3 Error Numbers, and section 7.5:3 of ISO/IEC 9899 (C99). The condition wrapping the builtin call is conservatively set to avoid too aggressive (wrong) shrink wrapping. The optimization is called conditional dead call elimination because the call is eliminated under the condition that the input arguments would not lead to domain or range error (for instance when x <= 0 for a log (x) call), however the chances that the error condition is hit is very low (those builtin calls which are conditionally dead are usually part of the C++ abstraction penalty exposed after inlining).
A structure for representing input domain of a function argument in integer. If the lower bound is -inf, has_lb is set to false. If the upper bound is +inf, has_ub is false. is_lb_inclusive and is_ub_inclusive are flags to indicate if lb and ub value are inclusive respectively.
bool input_domain::has_lb |
Referenced by gen_conditions_for_domain(), and get_domain().
bool input_domain::has_ub |
Referenced by gen_conditions_for_domain(), and get_domain().
bool input_domain::is_lb_inclusive |
Referenced by gen_conditions_for_domain(), and get_domain().
bool input_domain::is_ub_inclusive |
Referenced by gen_conditions_for_domain(), and get_domain().
int input_domain::lb |
Referenced by gen_conditions_for_domain(), and get_domain().
int input_domain::ub |
Referenced by gen_conditions_for_domain(), and get_domain().