Commit ddb3773a by Jan Hubicka Committed by Jan Hubicka

re PR ipa/65873 (Failure to inline always_inline memcpy)


	PR ipa/65873
	* ipa-inline.c (can_inline_edge_p): Allow early inlining of always
	inlines across optimization boundary.

From-SVN: r223107
parent fe1814cf
2015-05-12 Jan Hubicka <hubicka@ucw.cz>
PR ipa/65873
* ipa-inline.c (can_inline_edge_p): Allow early inlining of always
inlines across optimization boundary.
2015-05-12 Jason Merrill <jason@redhat.com> 2015-05-12 Jason Merrill <jason@redhat.com>
* config/mmix/mmix.c, config/msp430/msp430.c: Add space between * config/mmix/mmix.c, config/msp430/msp430.c: Add space between
......
...@@ -427,12 +427,20 @@ can_inline_edge_p (struct cgraph_edge *e, bool report, ...@@ -427,12 +427,20 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
&& lookup_attribute ("always_inline", && lookup_attribute ("always_inline",
DECL_ATTRIBUTES (callee->decl))); DECL_ATTRIBUTES (callee->decl)));
/* Until GCC 4.9 we did not check the semantics alterning flags
bellow and inline across optimization boundry.
Enabling checks bellow breaks several packages by refusing
to inline library always_inline functions. See PR65873.
Disable the check for early inlining for now until better solution
is found. */
if (always_inline && early)
;
/* There are some options that change IL semantics which means /* There are some options that change IL semantics which means
we cannot inline in these cases for correctness reason. we cannot inline in these cases for correctness reason.
Not even for always_inline declared functions. */ Not even for always_inline declared functions. */
/* Strictly speaking only when the callee contains signed integer /* Strictly speaking only when the callee contains signed integer
math where overflow is undefined. */ math where overflow is undefined. */
if ((check_maybe_up (flag_strict_overflow) else if ((check_maybe_up (flag_strict_overflow)
/* this flag is set by optimize. Allow inlining across /* this flag is set by optimize. Allow inlining across
optimize boundary. */ optimize boundary. */
&& (!opt_for_fn (caller->decl, optimize) && (!opt_for_fn (caller->decl, optimize)
...@@ -449,9 +457,10 @@ can_inline_edge_p (struct cgraph_edge *e, bool report, ...@@ -449,9 +457,10 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
|| check_maybe_up (flag_signed_zeros) || check_maybe_up (flag_signed_zeros)
|| check_maybe_down (flag_associative_math) || check_maybe_down (flag_associative_math)
|| check_maybe_down (flag_reciprocal_math) || check_maybe_down (flag_reciprocal_math)
/* We do not want to make code compiled with exceptions to be brought /* We do not want to make code compiled with exceptions to be
into a non-EH function unless we know that the callee does not brought into a non-EH function unless we know that the callee
throw. This is tracked by DECL_FUNCTION_PERSONALITY. */ does not throw.
This is tracked by DECL_FUNCTION_PERSONALITY. */
|| (check_match (flag_non_call_exceptions) || (check_match (flag_non_call_exceptions)
/* TODO: We also may allow bringing !flag_non_call_exceptions /* TODO: We also may allow bringing !flag_non_call_exceptions
to flag_non_call_exceptions function, but that may need to flag_non_call_exceptions function, but that may need
...@@ -481,6 +490,17 @@ can_inline_edge_p (struct cgraph_edge *e, bool report, ...@@ -481,6 +490,17 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
e->inline_failed = CIF_OPTIMIZATION_MISMATCH; e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
inlinable = false; inlinable = false;
} }
/* If explicit optimize attribute are not used, the mismatch is caused
by different command line options used to build different units.
Do not care about COMDAT functions - those are intended to be
optimized with the optimization flags of module they are used in.
Also do not care about mixing up size/speed optimization when
DECL_DISREGARD_INLINE_LIMITS is set. */
else if ((callee->merged
&& !lookup_attribute ("optimize",
DECL_ATTRIBUTES (caller->decl)))
|| DECL_DISREGARD_INLINE_LIMITS (callee->decl))
;
/* If mismatch is caused by merging two LTO units with different /* If mismatch is caused by merging two LTO units with different
optimizationflags we want to be bit nicer. However never inline optimizationflags we want to be bit nicer. However never inline
if one of functions is not optimized at all. */ if one of functions is not optimized at all. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment