@verbatim
Conditional Dead Call Elimination pass for the GNU compiler. Copyright (C) 2008-2013 Free Software Foundation, Inc. Contributed by Xinliang David Li david.nosp@m.xl@g.nosp@m.oogle.nosp@m..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.