aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-inline.c
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2009-03-03 18:08:01 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2009-03-03 10:08:01 -0800
commit13e4e36e171c7053eb63e848b841b8154eaada40 (patch)
tree07b2104b534faffa886609f1d43a8463761aacb1 /gcc/tree-inline.c
parent6eaf85d0018e29f7fed19301d94f2320bed63af2 (diff)
downloadgcc-13e4e36e171c7053eb63e848b841b8154eaada40.zip
gcc-13e4e36e171c7053eb63e848b841b8154eaada40.tar.gz
gcc-13e4e36e171c7053eb63e848b841b8154eaada40.tar.bz2
re PR tree-optimization/39345 (ICE in copy_tree_body_r, at tree-inline.c:1020)
2009-03-03 H.J. Lu <hongjiu.lu@intel.com> PR middle-end/39345 * tree-inline.c (remapped_type): New. (can_be_nonlocal): Call remapped_type instead of remap_type. From-SVN: r144581
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r--gcc/tree-inline.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 88154bf..63392e2 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -426,6 +426,26 @@ remap_type (tree type, copy_body_data *id)
return tmp;
}
+/* Return previously remapped type of TYPE in ID. Return NULL if TYPE
+ is NULL or TYPE has not been remapped before. */
+
+static tree
+remapped_type (tree type, copy_body_data *id)
+{
+ tree *node;
+
+ if (type == NULL)
+ return type;
+
+ /* See if we have remapped this type. */
+ node = (tree *) pointer_map_contains (id->decl_map, type);
+ if (node)
+ return *node;
+ else
+ return NULL;
+}
+
+ /* The type only needs remapping if it's variably modified. */
/* Decide if DECL can be put into BLOCK_NONLOCAL_VARs. */
static bool
@@ -446,8 +466,10 @@ can_be_nonlocal (tree decl, copy_body_data *id)
if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != PARM_DECL)
return false;
- /* We must use global type. */
- if (TREE_TYPE (decl) != remap_type (TREE_TYPE (decl), id))
+ /* We must use global type. We call remapped_type instead of
+ remap_type since we don't want to remap this type here if it
+ hasn't been remapped before. */
+ if (TREE_TYPE (decl) != remapped_type (TREE_TYPE (decl), id))
return false;
/* Wihtout SSA we can't tell if variable is used. */