From: Tom de Vries Date: Fri, 25 Apr 2014 11:21:40 +0000 (+0000) Subject: Add clobber_reg X-Git-Tag: releases/gcc-5.1.0~7914 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=97891c11e32537dfd2e4a4db1ca8d3eb541cf8aa;p=thirdparty%2Fgcc.git Add clobber_reg 2014-04-25 Tom de Vries * expr.c (clobber_reg_mode): New function. * expr.h (clobber_reg): New function. From-SVN: r209800 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 21f9b2f2a997..f0fc311dbc03 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-04-25 Tom de Vries + + * expr.c (clobber_reg_mode): New function. + * expr.h (clobber_reg): New function. + 2014-04-25 Tom de Vries * rtlanal.c (find_all_hard_reg_sets): Note INSN_CALL_FUNCTION_USAGE diff --git a/gcc/expr.c b/gcc/expr.c index 825a244b09af..fec6194af1ff 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -2396,6 +2396,18 @@ use_reg_mode (rtx *call_fusage, rtx reg, enum machine_mode mode) = gen_rtx_EXPR_LIST (mode, gen_rtx_USE (VOIDmode, reg), *call_fusage); } +/* Add a CLOBBER expression for REG to the (possibly empty) list pointed + to by CALL_FUSAGE. REG must denote a hard register. */ + +void +clobber_reg_mode (rtx *call_fusage, rtx reg, enum machine_mode mode) +{ + gcc_assert (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER); + + *call_fusage + = gen_rtx_EXPR_LIST (mode, gen_rtx_CLOBBER (VOIDmode, reg), *call_fusage); +} + /* Add USE expressions to *CALL_FUSAGE for each of NREGS consecutive regs, starting at REGNO. All of these registers must be hard registers. */ diff --git a/gcc/expr.h b/gcc/expr.h index 524da6731a97..1823febac265 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -346,6 +346,7 @@ extern void copy_blkmode_from_reg (rtx, rtx, tree); /* Mark REG as holding a parameter for the next CALL_INSN. Mode is TYPE_MODE of the non-promoted parameter, or VOIDmode. */ extern void use_reg_mode (rtx *, rtx, enum machine_mode); +extern void clobber_reg_mode (rtx *, rtx, enum machine_mode); extern rtx copy_blkmode_to_reg (enum machine_mode, tree); @@ -356,6 +357,13 @@ use_reg (rtx *fusage, rtx reg) use_reg_mode (fusage, reg, VOIDmode); } +/* Mark REG as clobbered by the call with FUSAGE as CALL_INSN_FUNCTION_USAGE. */ +static inline void +clobber_reg (rtx *fusage, rtx reg) +{ + clobber_reg_mode (fusage, reg, VOIDmode); +} + /* Mark NREGS consecutive regs, starting at REGNO, as holding parameters for the next CALL_INSN. */ extern void use_regs (rtx *, int, int);