aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.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/expr.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/expr.c')
-rw-r--r--gcc/expr.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 50a2035..82c0371 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -8423,6 +8423,19 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
expand_decl_rtl:
gcc_assert (decl_rtl);
decl_rtl = copy_rtx (decl_rtl);
+ /* Record writes to register variables. */
+ if (modifier == EXPAND_WRITE && REG_P (decl_rtl)
+ && REGNO (decl_rtl) < FIRST_PSEUDO_REGISTER)
+ {
+ int i = REGNO (decl_rtl);
+ int nregs = hard_regno_nregs[i][GET_MODE (decl_rtl)];
+ while (nregs)
+ {
+ SET_HARD_REG_BIT (crtl->asm_clobbers, i);
+ i++;
+ nregs--;
+ }
+ }
/* Ensure variable marked as used even if it doesn't go through
a parser. If it hasn't be used yet, write out an external