aboutsummaryrefslogtreecommitdiff
path: root/gcc/ree.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2012-01-22 14:35:39 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2012-01-22 14:35:39 +0000
commitca10595cf475579d19b0bf6fe5399cdf6f9b89f4 (patch)
tree5e8be93a1ed7e5ab1d8f77ae6ad3c77be61ad195 /gcc/ree.c
parent643e447b3ec25d706e0334290b4f497a6f963eb0 (diff)
downloadgcc-ca10595cf475579d19b0bf6fe5399cdf6f9b89f4.zip
gcc-ca10595cf475579d19b0bf6fe5399cdf6f9b89f4.tar.gz
gcc-ca10595cf475579d19b0bf6fe5399cdf6f9b89f4.tar.bz2
re PR rtl-optimization/51924 (wrong code with -O -free -fno-rename-registers -ftree-vectorize -funroll-loops)
PR rtl-optimization/51924 * ree.c (combine_set_extension): Improve debugging message. (combine_reaching_defs): Likewise. (get_defs): Rename confusingly named variable. (find_and_remove_re): Skip a candidate if the extension expression has been modified. From-SVN: r183390
Diffstat (limited to 'gcc/ree.c')
-rw-r--r--gcc/ree.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/gcc/ree.c b/gcc/ree.c
index 48113a9..4cab20e 100644
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -346,7 +346,8 @@ combine_set_extension (ext_cand *cand, rtx curr_insn, rtx *orig_set)
{
if (dump_file)
{
- fprintf (dump_file, "Merged instruction with extension:\n");
+ fprintf (dump_file,
+ "Tentatively merged extension with definition:\n");
print_rtl_single (dump_file, curr_insn);
}
return true;
@@ -407,21 +408,21 @@ transform_ifelse (ext_cand *cand, rtx def_insn)
static struct df_link *
get_defs (rtx insn, rtx reg, VEC (rtx,heap) **dest)
{
- df_ref reg_info, *defs;
+ df_ref reg_info, *uses;
struct df_link *ref_chain, *ref_link;
reg_info = NULL;
- for (defs = DF_INSN_USES (insn); *defs; defs++)
+ for (uses = DF_INSN_USES (insn); *uses; uses++)
{
- reg_info = *defs;
+ reg_info = *uses;
if (GET_CODE (DF_REF_REG (reg_info)) == SUBREG)
return NULL;
if (REGNO (DF_REF_REG (reg_info)) == REGNO (reg))
break;
}
- gcc_assert (reg_info != NULL && defs != NULL);
+ gcc_assert (reg_info != NULL && uses != NULL);
ref_chain = DF_REF_CHAIN (reg_info);
@@ -686,11 +687,10 @@ combine_reaching_defs (ext_cand *cand, rtx set_pat)
purposes. This extension cannot be deleted. */
if (dump_file)
{
- FOR_EACH_VEC_ELT (rtx, vec, i, def_insn)
- {
- fprintf (dump_file, "Non-mergeable definitions:\n");
- print_rtl_single (dump_file, def_insn);
- }
+ fprintf (dump_file,
+ "Merge cancelled, non-mergeable definitions:\n");
+ FOR_EACH_VEC_ELT (rtx, vec, i, def_insn)
+ print_rtl_single (dump_file, def_insn);
}
}
}
@@ -843,6 +843,12 @@ find_and_remove_re (void)
{
num_re_opportunities++;
+ /* If the candidate insn is itself a definition insn for another
+ candidate, it may have been modified and the UD chain broken.
+ FIXME: the handling of successive extensions can be improved. */
+ if (!reg_mentioned_p (curr_cand->expr, PATTERN (curr_cand->insn)))
+ continue;
+
/* Try to combine the extension with the definition. */
if (dump_file)
{