case GIMPLE_CALL:
{
tree decl = gimple_call_fndecl (stmt);
- tree addr = gimple_call_fn (stmt);
- tree funtype = TREE_TYPE (addr);
- bool stdarg = false;
-
- if (POINTER_TYPE_P (funtype))
- funtype = TREE_TYPE (funtype);
/* Do not special case builtins where we see the body.
This just confuse inliner. */
}
cost = weights->call_cost;
- if (decl)
- funtype = TREE_TYPE (decl);
-
- if (!VOID_TYPE_P (TREE_TYPE (funtype))
- && gimple_call_lhs (stmt))
- cost += estimate_move_cost (TREE_TYPE (funtype));
-
- if (funtype)
- stdarg = stdarg_p (funtype);
-
- /* Our cost must be kept in sync with
- cgraph_estimate_size_after_inlining that does use function
- declaration to figure out the arguments.
-
- For functions taking variable list of arguments we must
- look into call statement intself. This is safe because
- we will get only higher costs and in most cases we will
- not inline these anyway. */
- if (decl && DECL_ARGUMENTS (decl) && !stdarg)
- {
- tree arg;
- for (arg = DECL_ARGUMENTS (decl); arg; arg = DECL_CHAIN (arg))
- if (!VOID_TYPE_P (TREE_TYPE (arg)))
- cost += estimate_move_cost (TREE_TYPE (arg));
- }
- else if (funtype && prototype_p (funtype) && !stdarg)
- {
- tree t;
- for (t = TYPE_ARG_TYPES (funtype); t && t != void_list_node;
- t = TREE_CHAIN (t))
- if (!VOID_TYPE_P (TREE_VALUE (t)))
- cost += estimate_move_cost (TREE_VALUE (t));
- }
- else
+ if (gimple_call_lhs (stmt))
+ cost += estimate_move_cost (TREE_TYPE (gimple_call_lhs (stmt)));
+ for (i = 0; i < gimple_call_num_args (stmt); i++)
{
- for (i = 0; i < gimple_call_num_args (stmt); i++)
- {
- tree arg = gimple_call_arg (stmt, i);
- if (!VOID_TYPE_P (TREE_TYPE (arg)))
- cost += estimate_move_cost (TREE_TYPE (arg));
- }
+ tree arg = gimple_call_arg (stmt, i);
+ cost += estimate_move_cost (TREE_TYPE (arg));
}
-
break;
}