https://gcc.gnu.org/bugzilla/show_bug.cgi?id=15473
H.J. Lu <hjl.tools at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |hjl.tools at gmail dot com Version|4.0.0 |6.0 --- Comment #5 from H.J. Lu <hjl.tools at gmail dot com> --- Some libcalls are expanded in static rtx expand_builtin_unop (machine_mode target_mode, tree exp, rtx target, rtx subtarget, optab op_optab) { rtx op0; if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE)) return NULL_RTX; /* Compute the argument. */ op0 = expand_expr (CALL_EXPR_ARG (exp, 0), (subtarget && (TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 0))) == GET_MODE (subtarget))) ? subtarget : NULL_RTX, VOIDmode, EXPAND_NORMAL); /* Compute op, into TARGET if possible. Set TARGET to wherever the result comes back. */ target = expand_unop (TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 0))), op_optab, op0, target, op_optab != clrsb_optab); gcc_assert (target); return convert_to_mode (target_mode, target, 0); } which doesn't go through expand_call.