aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2014-06-15 07:33:04 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2014-06-15 07:33:04 +0000
commit74e59b6c24b6770010a76247c1c44abdf2fe92bf (patch)
treeade4c61474f0cf78ce51f16f74ba9dd522d0d440 /gcc
parentfc8e9f583cf683a397fef637af4b170fda429021 (diff)
downloadgcc-74e59b6c24b6770010a76247c1c44abdf2fe92bf.zip
gcc-74e59b6c24b6770010a76247c1c44abdf2fe92bf.tar.gz
gcc-74e59b6c24b6770010a76247c1c44abdf2fe92bf.tar.bz2
df.h (df_single_def, [...]): New functions.
gcc/ * df.h (df_single_def, df_single_use): New functions. * ira.c (find_moveable_pseudos): Use them. From-SVN: r211681
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/df.h19
-rw-r--r--gcc/ira.c23
3 files changed, 35 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2fcde0c..89ea2b6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2014-06-15 Richard Sandiford <rdsandiford@googlemail.com>
+ * df.h (df_single_def, df_single_use): New functions.
+ * ira.c (find_moveable_pseudos): Use them.
+
+2014-06-15 Richard Sandiford <rdsandiford@googlemail.com>
+
* df.h (FOR_EACH_INSN_INFO_MW): New macro.
* df-problems.c (df_note_bb_compute): Use it.
* regstat.c (regstat_bb_compute_ri): Likewise.
diff --git a/gcc/df.h b/gcc/df.h
index 9ec8ae1..73c0972 100644
--- a/gcc/df.h
+++ b/gcc/df.h
@@ -1165,6 +1165,25 @@ df_get_artificial_uses (unsigned int bb_index)
return df_scan_get_bb_info (bb_index)->artificial_uses;
}
+/* If INSN defines exactly one register, return the associated reference,
+ otherwise return null. */
+
+static inline df_ref
+df_single_def (const df_insn_info *info)
+{
+ df_ref *defs = DF_INSN_INFO_DEFS (info);
+ return defs[0] && !defs[1] ? defs[0] : NULL;
+}
+
+/* If INSN uses exactly one register, return the associated reference,
+ otherwise return null. */
+
+static inline df_ref
+df_single_use (const df_insn_info *info)
+{
+ df_ref *uses = DF_INSN_INFO_USES (info);
+ return uses[0] && !uses[1] ? uses[0] : NULL;
+}
/* web */
diff --git a/gcc/ira.c b/gcc/ira.c
index bbb2056..41988fd 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -4437,20 +4437,19 @@ find_moveable_pseudos (void)
if (NONDEBUG_INSN_P (insn))
{
df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
- df_ref *u_rec, *d_rec;
df_ref def, use;
uid_luid[INSN_UID (insn)] = i++;
- u_rec = DF_INSN_INFO_USES (insn_info);
- d_rec = DF_INSN_INFO_DEFS (insn_info);
- if (d_rec[0] != NULL && d_rec[1] == NULL
- && u_rec[0] != NULL && u_rec[1] == NULL
- && DF_REF_REGNO (*u_rec) == DF_REF_REGNO (*d_rec)
- && !bitmap_bit_p (&set, DF_REF_REGNO (*u_rec))
+ def = df_single_def (insn_info);
+ use = df_single_use (insn_info);
+ if (use
+ && def
+ && DF_REF_REGNO (use) == DF_REF_REGNO (def)
+ && !bitmap_bit_p (&set, DF_REF_REGNO (use))
&& rtx_moveable_p (&PATTERN (insn), OP_IN))
{
- unsigned regno = DF_REF_REGNO (*u_rec);
+ unsigned regno = DF_REF_REGNO (use);
bitmap_set_bit (moveable, regno);
bitmap_set_bit (&set, regno);
bitmap_set_bit (&used, regno);
@@ -4487,16 +4486,16 @@ find_moveable_pseudos (void)
FOR_BB_INSNS (bb, insn)
if (NONDEBUG_INSN_P (insn))
{
+ df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
rtx def_insn, closest_use, note;
- df_ref *def_rec, def, use;
+ df_ref def, use;
unsigned regno;
bool all_dominated, all_local;
enum machine_mode mode;
- def_rec = DF_INSN_DEFS (insn);
+ def = df_single_def (insn_info);
/* There must be exactly one def in this insn. */
- def = *def_rec;
- if (!def || def_rec[1] || !single_set (insn))
+ if (!def || !single_set (insn))
continue;
/* This must be the only definition of the reg. We also limit
which modes we deal with so that we can assume we can generate