aboutsummaryrefslogtreecommitdiff
path: root/gcc/ira.c
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2010-05-24 12:24:00 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2010-05-24 12:24:00 +0000
commitb748fbd6b981877caad2c6da42974610cdb53e01 (patch)
treea28ad2044f7bcf9c49f937d0bae49e03138a02f9 /gcc/ira.c
parent9888e9cf854267265d6c59e3b01d15fe5cef5a35 (diff)
downloadgcc-b748fbd6b981877caad2c6da42974610cdb53e01.zip
gcc-b748fbd6b981877caad2c6da42974610cdb53e01.tar.gz
gcc-b748fbd6b981877caad2c6da42974610cdb53e01.tar.bz2
gengtype-lex.l: Add HARD_REG_SET.
2010-05-25 Paul Brook <paul@codesourcery.com> gcc/ * gengtype-lex.l: Add HARD_REG_SET. * expr.c (expand_expr_real_1): Record writes to hard registers. * function.c (rtl_data): Add asm_clobbers. * ira.c (compute_regs_asm_clobbered): Use crtl->asm_clobbers. (ira_setup_eliminable_regset): Remove regs_asm_clobbered. Use crtl->asm_clobbers. gcc/testsuite/ * gcc.target/arm/frame-pointer-1.c: New test. * gcc.target/i386/pr9771-1.c: Move code out of main to allow frame pointer elimination. From-SVN: r159776
Diffstat (limited to 'gcc/ira.c')
-rw-r--r--gcc/ira.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/gcc/ira.c b/gcc/ira.c
index 574fe07..10be6da 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -1397,14 +1397,12 @@ insn_contains_asm (rtx insn)
return for_each_rtx (&insn, insn_contains_asm_1, NULL);
}
-/* Set up regs_asm_clobbered. */
+/* Add register clobbers from asm statements. */
static void
-compute_regs_asm_clobbered (char *regs_asm_clobbered)
+compute_regs_asm_clobbered (void)
{
basic_block bb;
- memset (regs_asm_clobbered, 0, sizeof (char) * FIRST_PSEUDO_REGISTER);
-
FOR_EACH_BB (bb)
{
rtx insn;
@@ -1425,7 +1423,7 @@ compute_regs_asm_clobbered (char *regs_asm_clobbered)
+ hard_regno_nregs[dregno][mode] - 1;
for (i = dregno; i <= end; ++i)
- regs_asm_clobbered[i] = 1;
+ SET_HARD_REG_BIT(crtl->asm_clobbers, i);
}
}
}
@@ -1437,12 +1435,6 @@ compute_regs_asm_clobbered (char *regs_asm_clobbered)
void
ira_setup_eliminable_regset (void)
{
- /* Like regs_ever_live, but 1 if a reg is set or clobbered from an
- asm. Unlike regs_ever_live, elements of this array corresponding
- to eliminable regs (like the frame pointer) are set if an asm
- sets them. */
- char *regs_asm_clobbered
- = (char *) alloca (FIRST_PSEUDO_REGISTER * sizeof (char));
#ifdef ELIMINABLE_REGS
int i;
static const struct {const int from, to; } eliminables[] = ELIMINABLE_REGS;
@@ -1466,7 +1458,8 @@ ira_setup_eliminable_regset (void)
COPY_HARD_REG_SET (ira_no_alloc_regs, no_unit_alloc_regs);
CLEAR_HARD_REG_SET (eliminable_regset);
- compute_regs_asm_clobbered (regs_asm_clobbered);
+ compute_regs_asm_clobbered ();
+
/* Build the regset of all eliminable registers and show we can't
use those that we already know won't be eliminated. */
#ifdef ELIMINABLE_REGS
@@ -1476,7 +1469,7 @@ ira_setup_eliminable_regset (void)
= (! targetm.can_eliminate (eliminables[i].from, eliminables[i].to)
|| (eliminables[i].to == STACK_POINTER_REGNUM && need_fp));
- if (! regs_asm_clobbered[eliminables[i].from])
+ if (!TEST_HARD_REG_BIT (crtl->asm_clobbers, eliminables[i].from))
{
SET_HARD_REG_BIT (eliminable_regset, eliminables[i].from);
@@ -1490,7 +1483,7 @@ ira_setup_eliminable_regset (void)
df_set_regs_ever_live (eliminables[i].from, true);
}
#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
- if (! regs_asm_clobbered[HARD_FRAME_POINTER_REGNUM])
+ if (!TEST_HARD_REG_BIT (crtl->asm_clobbers, HARD_FRAME_POINTER_REGNUM))
{
SET_HARD_REG_BIT (eliminable_regset, HARD_FRAME_POINTER_REGNUM);
if (need_fp)
@@ -1504,7 +1497,7 @@ ira_setup_eliminable_regset (void)
#endif
#else
- if (! regs_asm_clobbered[FRAME_POINTER_REGNUM])
+ if (!TEST_HARD_REG_BIT (crtl->asm_clobbers, HARD_FRAME_POINTER_REGNUM))
{
SET_HARD_REG_BIT (eliminable_regset, FRAME_POINTER_REGNUM);
if (need_fp)