This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR 30140, inliner produces invalid gimple
- From: Andrew Pinski <pinskia at gmail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 14 Dec 2006 23:41:22 -0800
- Subject: [PATCH] Fix PR 30140, inliner produces invalid gimple
Hi,
In some cases the inliner can produce invalid gimple. It produces
non_gimple_var = (char) int_gimple_var;
This happens when we have a promoted argument and the argument has its
address taken. This patch fixes the problem by using saying we want to
gimplify the statement if the variable is not a gimple register.
This is the first in a series of patches for invalid gimple produced by
the difference passes. We don't have a check for this invalid gimple
right now but I have a patch to add it. The reason why I have not
submitted it yet because of there are passes which produces invalid
gimple.
OK? Bootstrapped and tested on i686-linux-gnu with no regressions.
Thanks,
Andrew Pinski
ChangeLog:
* tree-inline.c (setup_one_parameter): Gimplify the statement if
the variable is not a gimple register variable.
Index: tree-inline.c
===================================================================
--- tree-inline.c (revision 119876)
+++ tree-inline.c (working copy)
@@ -1106,9 +1106,10 @@ setup_one_parameter (copy_body_data *id,
at the end. Note that is_gimple_cast only checks the outer
tree code, not its operand. Thus the explicit check that its
operand is a gimple value. */
- if (!is_gimple_val (rhs)
+ if ((!is_gimple_val (rhs)
&& (!is_gimple_cast (rhs)
|| !is_gimple_val (TREE_OPERAND (rhs, 0))))
+ || !is_gimple_reg (var))
gimplify_stmt (&init_stmt);
/* If VAR represents a zero-sized variable, it's possible that the