On Thu, 24 Nov 2016, Pitchumani Sivanupandi wrote:
> GCC inlines small functions if the code size after expansion is not excedded.
> For test case (inline.c, avr-gcc -Os -S inline.c) code size become higher if
> 'func2' is inlined. It happens because the CONVERT_EXPR/ NOP_EXPR are
> considered
> as zero cost expression.
>
> Few conversions will cost additional instructions. For targets like AVR
> it will cost considerably as it's register size is just one byte.
>
> Attached the tentative patch that changes the CONVERT_EXPR/ NOP_EXPR cost
> to 1 if the LHS is bigger than RHS and target's word_mode.
>
> Is this Ok?
>
> Would it be reasonable if cost evaluated as below instead of constant 1?
> if (LHS PRECISION > RHS PRECISION)
> cost = LHS_PRECISION / word_mode - 1
> else
> cost = 0
>
> Built GCC for native with bootstrap enabled. No issues.
I believe a better check would be tree_nop_conversion_p (). Thus
CASE_CONVERT:
return tree_nop_conversion_p (type, TREE_TYPE (op0)) ? 0 : 1;
note that
+ rhs_code = gimple_assign_rhs_code (stmt);
+ if ((rhs_code == NOP_EXPR) || (rhs_code == CONVERT_EXPR))
+ {
+ cost += estimate_operator_cost (rhs_code, weights,
+ gimple_assign_lhs (stmt),
+ gimple_assign_rhs1 (stmt));
+ }
is super-ugly - please simply add the type of the expression as an
additional argument (see gimple_expr_type (), but the type of the
LHS would do as well).
Note that doing this change might require some re-tuning of
inliner params, but otherwise it's totally sensible.
Thanks,
Richard.