aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2014-04-25 11:21:40 +0000
committerTom de Vries <vries@gcc.gnu.org>2014-04-25 11:21:40 +0000
commit97891c11e32537dfd2e4a4db1ca8d3eb541cf8aa (patch)
treef619c8dfb45013f73d3a208c27aae9880becdeda /gcc
parent3ee634fd7b20399a1470db1a1e18d423ab761cf7 (diff)
downloadgcc-97891c11e32537dfd2e4a4db1ca8d3eb541cf8aa.zip
gcc-97891c11e32537dfd2e4a4db1ca8d3eb541cf8aa.tar.gz
gcc-97891c11e32537dfd2e4a4db1ca8d3eb541cf8aa.tar.bz2
Add clobber_reg
2014-04-25 Tom de Vries <tom@codesourcery.com> * expr.c (clobber_reg_mode): New function. * expr.h (clobber_reg): New function. From-SVN: r209800
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/expr.c12
-rw-r--r--gcc/expr.h8
3 files changed, 25 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 21f9b2f..f0fc311 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2014-04-25 Tom de Vries <tom@codesourcery.com>
+ * expr.c (clobber_reg_mode): New function.
+ * expr.h (clobber_reg): New function.
+
+2014-04-25 Tom de Vries <tom@codesourcery.com>
+
* rtlanal.c (find_all_hard_reg_sets): Note INSN_CALL_FUNCTION_USAGE
clobbers.
diff --git a/gcc/expr.c b/gcc/expr.c
index 825a244..fec6194 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 524da67..1823feb 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);