OSDN Git Service
(root)
/
pf3gnuchains
/
gcc-fork.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* gcc.pot: Regenerate.
[pf3gnuchains/gcc-fork.git]
/
gcc
/
fwprop.c
diff --git
a/gcc/fwprop.c
b/gcc/fwprop.c
index
32264cd
..
6e65093
100644
(file)
--- a/
gcc/fwprop.c
+++ b/
gcc/fwprop.c
@@
-1,5
+1,6
@@
/* RTL-based forward propagation pass for GNU compiler.
/* RTL-based forward propagation pass for GNU compiler.
- Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+ Free Software Foundation, Inc.
Contributed by Paolo Bonzini and Steven Bosscher.
This file is part of GCC.
Contributed by Paolo Bonzini and Steven Bosscher.
This file is part of GCC.
@@
-227,7
+228,10
@@
single_def_use_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
process_uses (df_get_artificial_uses (bb_index), DF_REF_AT_TOP);
process_defs (df_get_artificial_defs (bb_index), DF_REF_AT_TOP);
process_uses (df_get_artificial_uses (bb_index), DF_REF_AT_TOP);
process_defs (df_get_artificial_defs (bb_index), DF_REF_AT_TOP);
- df_simulate_initialize_forwards (bb, local_lr);
+
+ /* We don't call df_simulate_initialize_forwards, as it may overestimate
+ the live registers if there are unused artificial defs. We prefer
+ liveness to be underestimated. */
FOR_BB_INSNS (bb, insn)
if (INSN_P (insn))
FOR_BB_INSNS (bb, insn)
if (INSN_P (insn))
@@
-818,17
+822,23
@@
all_uses_available_at (rtx def_insn, rtx target_insn)
}
else
{
}
else
{
+ rtx def_reg = REG_P (SET_DEST (def_set)) ? SET_DEST (def_set) : NULL_RTX;
+
/* Look at all the uses of DEF_INSN, and see if they are not
killed between DEF_INSN and TARGET_INSN. */
for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
{
df_ref use = *use_rec;
/* Look at all the uses of DEF_INSN, and see if they are not
killed between DEF_INSN and TARGET_INSN. */
for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
{
df_ref use = *use_rec;
+ if (def_reg && rtx_equal_p (DF_REF_REG (use), def_reg))
+ return false;
if (use_killed_between (use, def_insn, target_insn))
return false;
}
for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
{
df_ref use = *use_rec;
if (use_killed_between (use, def_insn, target_insn))
return false;
}
for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
{
df_ref use = *use_rec;
+ if (def_reg && rtx_equal_p (DF_REF_REG (use), def_reg))
+ return false;
if (use_killed_between (use, def_insn, target_insn))
return false;
}
if (use_killed_between (use, def_insn, target_insn))
return false;
}
@@
-1039,7
+1049,7
@@
free_load_extend (rtx src, rtx insn)
{
rtx reg;
df_ref *use_vec;
{
rtx reg;
df_ref *use_vec;
- df_ref use, def;
+ df_ref use
= 0
, def;
reg = XEXP (src, 0);
#ifdef LOAD_EXTEND_OP
reg = XEXP (src, 0);
#ifdef LOAD_EXTEND_OP