diff options
author | Paul Brook <paul@codesourcery.com> | 2010-05-24 12:24:00 +0000 |
---|---|---|
committer | Paul Brook <pbrook@gcc.gnu.org> | 2010-05-24 12:24:00 +0000 |
commit | b748fbd6b981877caad2c6da42974610cdb53e01 (patch) | |
tree | a28ad2044f7bcf9c49f937d0bae49e03138a02f9 /gcc/expr.c | |
parent | 9888e9cf854267265d6c59e3b01d15fe5cef5a35 (diff) | |
download | gcc-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.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -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 |