aboutsummaryrefslogtreecommitdiff
path: root/gcc/postreload-gcse.c
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2008-02-02 15:00:57 +0000
committerMichael Matz <matz@gcc.gnu.org>2008-02-02 15:00:57 +0000
commit6994f254d5a429d1eecfb998f859e34582e2885a (patch)
treeb73cc38ec06002dccdc72be72d79e7b0f64ff53e /gcc/postreload-gcse.c
parentee440dd05de292dde12376f8a977d2a4bf22c2c3 (diff)
downloadgcc-6994f254d5a429d1eecfb998f859e34582e2885a.zip
gcc-6994f254d5a429d1eecfb998f859e34582e2885a.tar.gz
gcc-6994f254d5a429d1eecfb998f859e34582e2885a.tar.bz2
re PR target/35045 (gcc-4.3 generates wrong code on i386 with -O3)
PR target/35045 * postreload-gcse.c (record_last_reg_set_info_regno): Renamed from record_last_reg_set_info. (record_last_reg_set_info): Take an RTX argument, iterate over all constituent hardregs. (record_last_set_info, record_opr_changes): Change calls to new signature or to record_last_reg_set_info_regno. * gcc.dg/pr35045.c: New test. From-SVN: r132071
Diffstat (limited to 'gcc/postreload-gcse.c')
-rw-r--r--gcc/postreload-gcse.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c
index 5f3192f..805608d 100644
--- a/gcc/postreload-gcse.c
+++ b/gcc/postreload-gcse.c
@@ -175,7 +175,8 @@ static void free_mem (void);
/* Support for hash table construction and transformations. */
static bool oprs_unchanged_p (rtx, rtx, bool);
-static void record_last_reg_set_info (rtx, int);
+static void record_last_reg_set_info (rtx, rtx);
+static void record_last_reg_set_info_regno (rtx, int);
static void record_last_mem_set_info (rtx);
static void record_last_set_info (rtx, const_rtx, void *);
static void record_opr_changes (rtx);
@@ -645,7 +646,19 @@ load_killed_in_block_p (int uid_limit, rtx x, bool after_insn)
/* Record register first/last/block set information for REGNO in INSN. */
static inline void
-record_last_reg_set_info (rtx insn, int regno)
+record_last_reg_set_info (rtx insn, rtx reg)
+{
+ unsigned int regno, end_regno;
+
+ regno = REGNO (reg);
+ end_regno = END_HARD_REGNO (reg);
+ do
+ reg_avail_info[regno] = INSN_CUID (insn);
+ while (++regno < end_regno);
+}
+
+static inline void
+record_last_reg_set_info_regno (rtx insn, int regno)
{
reg_avail_info[regno] = INSN_CUID (insn);
}
@@ -680,7 +693,7 @@ record_last_set_info (rtx dest, const_rtx setter ATTRIBUTE_UNUSED, void *data)
dest = SUBREG_REG (dest);
if (REG_P (dest))
- record_last_reg_set_info (last_set_insn, REGNO (dest));
+ record_last_reg_set_info (last_set_insn, dest);
else if (MEM_P (dest))
{
/* Ignore pushes, they don't clobber memory. They may still
@@ -691,7 +704,7 @@ record_last_set_info (rtx dest, const_rtx setter ATTRIBUTE_UNUSED, void *data)
if (! push_operand (dest, GET_MODE (dest)))
record_last_mem_set_info (last_set_insn);
else
- record_last_reg_set_info (last_set_insn, STACK_POINTER_REGNUM);
+ record_last_reg_set_info_regno (last_set_insn, STACK_POINTER_REGNUM);
}
}
@@ -722,17 +735,17 @@ record_opr_changes (rtx insn)
/* Also record autoincremented REGs for this insn as changed. */
for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
if (REG_NOTE_KIND (note) == REG_INC)
- record_last_reg_set_info (insn, REGNO (XEXP (note, 0)));
+ record_last_reg_set_info (insn, XEXP (note, 0));
/* Finally, if this is a call, record all call clobbers. */
if (CALL_P (insn))
{
- unsigned int regno, end_regno;
+ unsigned int regno;
rtx link, x;
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
if (TEST_HARD_REG_BIT (regs_invalidated_by_call, regno))
- record_last_reg_set_info (insn, regno);
+ record_last_reg_set_info_regno (insn, regno);
for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
if (GET_CODE (XEXP (link, 0)) == CLOBBER)
@@ -741,11 +754,7 @@ record_opr_changes (rtx insn)
if (REG_P (x))
{
gcc_assert (HARD_REGISTER_P (x));
- regno = REGNO (x);
- end_regno = END_HARD_REGNO (x);
- do
- record_last_reg_set_info (insn, regno);
- while (++regno < end_regno);
+ record_last_reg_set_info (insn, x);
}
}