- if (!flag_no_inline
- && fndecl != current_function_decl
- && DECL_INLINE (fndecl)
- && DECL_SAVED_INSNS (fndecl)
- && DECL_SAVED_INSNS (fndecl)->inlinable)
- is_integrable = 1;
- else if (! TREE_ADDRESSABLE (fndecl))
- {
- /* In case this function later becomes inlinable,
- record that there was already a non-inline call to it.
-
- Use abstraction instead of setting TREE_ADDRESSABLE
- directly. */
- if (DECL_INLINE (fndecl) && warn_inline && !flag_no_inline
- && optimize > 0)
- {
- warning_with_decl (fndecl, "can't inline call to `%s'");
- warning ("called from here");
- }
- mark_addressable (fndecl);
- }
-
- if (TREE_READONLY (fndecl) && ! TREE_THIS_VOLATILE (fndecl)
- && TYPE_MODE (TREE_TYPE (exp)) != VOIDmode)
- is_const = 1;
-
- if (TREE_THIS_VOLATILE (fndecl))
- is_volatile = 1;
- }
- }
-
- /* If we don't have specific function to call, see if we have a
- constant or `noreturn' function from the type. */
- if (fndecl == 0)
- {
- is_const = TREE_READONLY (TREE_TYPE (TREE_TYPE (p)));
- is_volatile = TREE_THIS_VOLATILE (TREE_TYPE (TREE_TYPE (p)));
- }
-
-#ifdef REG_PARM_STACK_SPACE
-#ifdef MAYBE_REG_PARM_STACK_SPACE
- reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
-#else
- reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
-#endif
-#endif
-
-#if defined(PUSH_ROUNDING) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
- if (reg_parm_stack_space > 0)
- must_preallocate = 1;
-#endif
-
- /* Warn if this value is an aggregate type,
- regardless of which calling convention we are using for it. */
- if (warn_aggregate_return && AGGREGATE_TYPE_P (TREE_TYPE (exp)))
- warning ("function call has aggregate value");
-
- /* Set up a place to return a structure. */
-
- /* Cater to broken compilers. */
- if (aggregate_value_p (exp))
- {
- /* This call returns a big structure. */
- is_const = 0;
-
-#ifdef PCC_STATIC_STRUCT_RETURN
- {
- pcc_struct_value = 1;
- /* Easier than making that case work right. */
- if (is_integrable)
- {
- /* In case this is a static function, note that it has been
- used. */
- if (! TREE_ADDRESSABLE (fndecl))
- mark_addressable (fndecl);
- is_integrable = 0;
- }
- }
-#else /* not PCC_STATIC_STRUCT_RETURN */
- {
- struct_value_size = int_size_in_bytes (TREE_TYPE (exp));
-
- if (target && GET_CODE (target) == MEM)
- structure_value_addr = XEXP (target, 0);
- else
- {
- /* Assign a temporary to hold the value. */
- tree d;
-
- /* For variable-sized objects, we must be called with a target
- specified. If we were to allocate space on the stack here,
- we would have no way of knowing when to free it. */
-
- if (struct_value_size < 0)
- abort ();
-
- /* This DECL is just something to feed to mark_addressable;
- it doesn't get pushed. */
- d = build_decl (VAR_DECL, NULL_TREE, TREE_TYPE (exp));
- DECL_RTL (d) = assign_temp (TREE_TYPE (exp), 1, 0, 1);
- mark_addressable (d);
- mark_temp_addr_taken (DECL_RTL (d));
- structure_value_addr = XEXP (DECL_RTL (d), 0);
- TREE_USED (d) = 1;
- target = 0;
- }
- }
-#endif /* not PCC_STATIC_STRUCT_RETURN */
- }
-
- /* If called function is inline, try to integrate it. */
-
- if (is_integrable)
- {
- rtx temp;
-
-#ifdef ACCUMULATE_OUTGOING_ARGS
- before_call = get_last_insn ();
-#endif
-
- temp = expand_inline_function (fndecl, actparms, target,
- ignore, TREE_TYPE (exp),
- structure_value_addr);
-
- /* If inlining succeeded, return. */
- if (temp != (rtx) (HOST_WIDE_INT) -1)
- {
-#ifdef ACCUMULATE_OUTGOING_ARGS