summaryrefslogtreecommitdiff
path: root/gcc/df-scan.c
diff options
context:
space:
mode:
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-23 04:33:26 +0000
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-23 04:33:26 +0000
commitfbc08f2bc7bc1253b1e6fe0fae74098583288375 (patch)
tree49d0f59121cd9231ba1263f6dd3fab20f35ca5e9 /gcc/df-scan.c
parent0c351ef34620d870403476663691e1c657d87fa0 (diff)
downloadgcc-fbc08f2bc7bc1253b1e6fe0fae74098583288375.tar.gz
gcc/:
2007-10-22 Seongbae Park <seongbae.park@gmail.com> David S. Miller <davem@davemloft.net> * df-scan.c (df_get_call_refs): Mark global registers as both a DF_REF_REG_USE and a non-clobber DF_REF_REG_DEF. gcc/testsuite/: 2007-10-22 David S. Miller <davem@davemloft.net> * gcc.dg/globalreg-1.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129572 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/df-scan.c')
-rw-r--r--gcc/df-scan.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/df-scan.c b/gcc/df-scan.c
index f4ced0d34c9..cc6866b6b78 100644
--- a/gcc/df-scan.c
+++ b/gcc/df-scan.c
@@ -3109,18 +3109,22 @@ df_get_call_refs (struct df_collection_rec * collection_rec,
so they are recorded as used. */
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
if (global_regs[i])
- df_ref_record (collection_rec, regno_reg_rtx[i],
- NULL, bb, insn, DF_REF_REG_USE, flags);
+ {
+ df_ref_record (collection_rec, regno_reg_rtx[i],
+ NULL, bb, insn, DF_REF_REG_USE, flags);
+ df_ref_record (collection_rec, regno_reg_rtx[i],
+ NULL, bb, insn, DF_REF_REG_DEF, flags);
+ }
is_sibling_call = SIBLING_CALL_P (insn);
EXECUTE_IF_SET_IN_BITMAP (df_invalidated_by_call, 0, ui, bi)
{
- if ((!bitmap_bit_p (defs_generated, ui))
+ if (!global_regs[ui]
+ && (!bitmap_bit_p (defs_generated, ui))
&& (!is_sibling_call
|| !bitmap_bit_p (df->exit_block_uses, ui)
|| refers_to_regno_p (ui, ui+1,
current_function_return_rtx, NULL)))
-
df_ref_record (collection_rec, regno_reg_rtx[ui],
NULL, bb, insn, DF_REF_REG_DEF, DF_REF_MAY_CLOBBER | flags);
}