This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/32492] [4.3 Regression] attribute always_inline -> sorry, unimplemented: recursive inlining
- From: "rguenth at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 26 Jun 2007 20:45:53 -0000
- Subject: [Bug middle-end/32492] [4.3 Regression] attribute always_inline -> sorry, unimplemented: recursive inlining
- References: <bug-32492-8535@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #8 from rguenth at gcc dot gnu dot org 2007-06-26 20:45 -------
So, without touching all the frontends we can try to lower constraints checked
at gimplification time to what is actually needed to avoid the ICE during
inlining. Which is to make sure that the actual parameter is convertible to
the type of the parameter declaration using a NOP_EXPR conversion. Which the
following (nearly) implements:
@@ -2134,15 +2134,17 @@ gimplify_call_expr (tree *expr_p, tree *
/* Verify if the type of the argument matches that of the function
declaration. If we cannot verify this or there is a mismatch,
- mark the call expression so it doesn't get inlined later. */
+ mark the call expression so it doesn't get inlined later.
+ This is needed to make sure we can convert the call expression
+ arguments to the inlined parameter declarations using a NOP_EXPR. */
if (parms)
{
for (i = 0, p = parms; i < nargs; i++, p = TREE_CHAIN (p))
if (!p
|| TREE_VALUE (p) == error_mark_node
|| CALL_EXPR_ARG (*expr_p, i) == error_mark_node
- || !lang_hooks.types_compatible_p
- (TREE_TYPE (CALL_EXPR_ARG (*expr_p, i)), TREE_VALUE (p)))
+ || TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (*expr_p, i)))
+ != TREE_CODE (TREE_VALUE (p)))
{
CALL_CANNOT_INLINE_P (*expr_p) = 1;
break;
@@ -2155,8 +2157,8 @@ gimplify_call_expr (tree *expr_p, tree *
if (!p
|| p == error_mark_node
|| CALL_EXPR_ARG (*expr_p, i) == error_mark_node
- || !lang_hooks.types_compatible_p
- (TREE_TYPE (CALL_EXPR_ARG (*expr_p, i)), TREE_TYPE (p)))
+ || TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (*expr_p, i)))
+ != TREE_CODE (TREE_TYPE (p)))
{
CALL_CANNOT_INLINE_P (*expr_p) = 1;
break;
I'll come up with a predicate to compute this in a more precise way, like
fold_convertible_p. I also know Honza is working on a different approach.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32492