df-scan.c (df_insn_info_init_fields): New function, split out from...

gcc/
	* df-scan.c (df_insn_info_init_fields): New function, split out
	from...
	(df_insn_create_insn_record): ...here.
	(df_insn_info_free_fields): New function, split out from...
	(df_insn_info_delete): ...here.
	(df_insn_rescan): Use the new functions instead of freeing and
	reallocating the df_insn_info.

From-SVN: r227139
This commit is contained in:
Richard Sandiford 2015-08-24 17:58:42 +00:00 committed by Richard Sandiford
parent 50b43b866a
commit 762613be3e
2 changed files with 45 additions and 22 deletions

View File

@ -1,3 +1,13 @@
2015-08-24 Richard Sandiford <richard.sandiford@arm.com>
* df-scan.c (df_insn_info_init_fields): New function, split out
from...
(df_insn_create_insn_record): ...here.
(df_insn_info_free_fields): New function, split out from...
(df_insn_info_delete): ...here.
(df_insn_rescan): Use the new functions instead of freeing and
reallocating the df_insn_info.
2015-08-24 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* doc/install.texi (Binaries): Remove links no longer valid.

View File

@ -809,6 +809,14 @@ df_reg_chain_unlink (df_ref ref)
df_free_ref (ref);
}
/* Initialize INSN_INFO to describe INSN. */
static void
df_insn_info_init_fields (df_insn_info *insn_info, rtx_insn *insn)
{
memset (insn_info, 0, sizeof (struct df_insn_info));
insn_info->insn = insn;
}
/* Create the insn record for INSN. If there was one there, zero it
out. */
@ -827,8 +835,7 @@ df_insn_create_insn_record (rtx_insn *insn)
insn_rec = problem_data->insn_pool->allocate ();
DF_INSN_INFO_SET (insn, insn_rec);
}
memset (insn_rec, 0, sizeof (struct df_insn_info));
insn_rec->insn = insn;
df_insn_info_init_fields (insn_rec, insn);
return insn_rec;
}
@ -876,6 +883,29 @@ df_mw_hardreg_chain_delete (struct df_mw_hardreg *hardregs)
}
}
/* Remove the contents of INSN_INFO (but don't free INSN_INFO itself). */
static void
df_insn_info_free_fields (df_insn_info *insn_info)
{
/* In general, notes do not have the insn_info fields
initialized. However, combine deletes insns by changing them
to notes. How clever. So we cannot just check if it is a
valid insn before short circuiting this code, we need to see
if we actually initialized it. */
df_mw_hardreg_chain_delete (insn_info->mw_hardregs);
if (df_chain)
{
df_ref_chain_delete_du_chain (insn_info->defs);
df_ref_chain_delete_du_chain (insn_info->uses);
df_ref_chain_delete_du_chain (insn_info->eq_uses);
}
df_ref_chain_delete (insn_info->defs);
df_ref_chain_delete (insn_info->uses);
df_ref_chain_delete (insn_info->eq_uses);
}
/* Delete all of the refs information from the insn with UID.
Internal helper for df_insn_delete, df_insn_rescan, and other
@ -895,24 +925,7 @@ df_insn_info_delete (unsigned int uid)
struct df_scan_problem_data *problem_data
= (struct df_scan_problem_data *) df_scan->problem_data;
/* In general, notes do not have the insn_info fields
initialized. However, combine deletes insns by changing them
to notes. How clever. So we cannot just check if it is a
valid insn before short circuiting this code, we need to see
if we actually initialized it. */
df_mw_hardreg_chain_delete (insn_info->mw_hardregs);
if (df_chain)
{
df_ref_chain_delete_du_chain (insn_info->defs);
df_ref_chain_delete_du_chain (insn_info->uses);
df_ref_chain_delete_du_chain (insn_info->eq_uses);
}
df_ref_chain_delete (insn_info->defs);
df_ref_chain_delete (insn_info->uses);
df_ref_chain_delete (insn_info->eq_uses);
df_insn_info_free_fields (insn_info);
problem_data->insn_pool->remove (insn_info);
DF_INSN_UID_SET (uid, NULL);
}
@ -1075,8 +1088,8 @@ df_insn_rescan (rtx_insn *insn)
/* There's change - we need to delete the existing info.
Since the insn isn't moved, we can salvage its LUID. */
luid = DF_INSN_LUID (insn);
df_insn_info_delete (uid);
df_insn_create_insn_record (insn);
df_insn_info_free_fields (insn_info);
df_insn_info_init_fields (insn_info, insn);
DF_INSN_LUID (insn) = luid;
}
else