diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2015-08-24 17:58:42 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2015-08-24 17:58:42 +0000 |
commit | 762613be3e563106eec05795785bd08d33466d7e (patch) | |
tree | a23962d66c1645b2a65d7e45e0c2955a5caf10b1 /gcc/df-scan.c | |
parent | 50b43b866a3d99d9d3c140caf68f7d7bb2d63c21 (diff) | |
download | gcc-762613be3e563106eec05795785bd08d33466d7e.tar.gz |
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
Diffstat (limited to 'gcc/df-scan.c')
-rw-r--r-- | gcc/df-scan.c | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/gcc/df-scan.c b/gcc/df-scan.c index 93c2eae3e02..259c9591307 100644 --- a/gcc/df-scan.c +++ b/gcc/df-scan.c @@ -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 |