From e11ab33b76c14a58124dbd71991c0adeea736d9b Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Mon, 6 Dec 2004 20:14:40 -0500 Subject: reload.c (find_valid_class): Fix logic to test inner mode as well. * reload.c (find_valid_class): Fix logic to test inner mode as well. (push_reload): Pass inner mode. From-SVN: r91802 --- gcc/ChangeLog | 5 +++++ gcc/reload.c | 41 ++++++++++++++++++++++++++--------------- 2 files changed, 31 insertions(+), 15 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2562640..ebc7bae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-12-06 DJ Delorie + + * reload.c (find_valid_class): Fix logic to test inner mode as well. + (push_reload): Pass inner mode. + 2004-12-06 Eric Christopher * doc/tm.texi (TARGET_VALID_POINTER_MODE): Document. diff --git a/gcc/reload.c b/gcc/reload.c index 9e219a0..eec1b0fc 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -240,7 +240,8 @@ static int push_secondary_reload (int, rtx, int, int, enum reg_class, enum machine_mode, enum reload_type, enum insn_code *); #endif -static enum reg_class find_valid_class (enum machine_mode, int, unsigned int); +static enum reg_class find_valid_class (enum machine_mode, enum machine_mode, + int, unsigned int); static int reload_inner_reg_of_subreg (rtx, enum machine_mode, int); static void push_replacement (rtx *, int, enum machine_mode); static void dup_replacements (rtx *, rtx *); @@ -659,12 +660,15 @@ clear_secondary_mem (void) } #endif /* SECONDARY_MEMORY_NEEDED */ -/* Find the largest class for which every register number plus N is valid in - M1 (if in range) and is cheap to move into REGNO. - Abort if no such class exists. */ + +/* Find the largest class which has at least one register valid in + mode INNER, and which for every such register, that register number + plus N is also valid in OUTER (if in range) and is cheap to move + into REGNO. Abort if no such class exists. */ static enum reg_class -find_valid_class (enum machine_mode m1 ATTRIBUTE_UNUSED, int n, +find_valid_class (enum machine_mode outer ATTRIBUTE_UNUSED, + enum machine_mode inner ATTRIBUTE_UNUSED, int n, unsigned int dest_regno ATTRIBUTE_UNUSED) { int best_cost = -1; @@ -678,15 +682,22 @@ find_valid_class (enum machine_mode m1 ATTRIBUTE_UNUSED, int n, for (class = 1; class < N_REG_CLASSES; class++) { int bad = 0; - for (regno = 0; regno < FIRST_PSEUDO_REGISTER && ! bad; regno++) - if (TEST_HARD_REG_BIT (reg_class_contents[class], regno) - && TEST_HARD_REG_BIT (reg_class_contents[class], regno + n) - && ! HARD_REGNO_MODE_OK (regno + n, m1)) - bad = 1; + int good = 0; + for (regno = 0; regno < FIRST_PSEUDO_REGISTER - n && ! bad; regno++) + if (TEST_HARD_REG_BIT (reg_class_contents[class], regno)) + { + if (HARD_REGNO_MODE_OK (regno, inner)) + { + good = 1; + if (! TEST_HARD_REG_BIT (reg_class_contents[class], regno + n) + || ! HARD_REGNO_MODE_OK (regno + n, outer)) + bad = 1; + } + } - if (bad) + if (bad || !good) continue; - cost = REGISTER_MOVE_COST (m1, class, dest_class); + cost = REGISTER_MOVE_COST (outer, class, dest_class); if ((reg_class_size[class] > best_size && (best_cost < 0 || best_cost >= cost)) @@ -694,7 +705,7 @@ find_valid_class (enum machine_mode m1 ATTRIBUTE_UNUSED, int n, { best_class = class; best_size = reg_class_size[class]; - best_cost = REGISTER_MOVE_COST (m1, class, dest_class); + best_cost = REGISTER_MOVE_COST (outer, class, dest_class); } } @@ -1083,7 +1094,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, if (REG_P (SUBREG_REG (in))) in_class - = find_valid_class (inmode, + = find_valid_class (inmode, GET_MODE (SUBREG_REG (in)), subreg_regno_offset (REGNO (SUBREG_REG (in)), GET_MODE (SUBREG_REG (in)), SUBREG_BYTE (in), @@ -1180,7 +1191,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, dont_remove_subreg = 1; push_reload (SUBREG_REG (out), SUBREG_REG (out), &SUBREG_REG (out), &SUBREG_REG (out), - find_valid_class (outmode, + find_valid_class (outmode, GET_MODE (SUBREG_REG (out)), subreg_regno_offset (REGNO (SUBREG_REG (out)), GET_MODE (SUBREG_REG (out)), SUBREG_BYTE (out), -- cgit v1.1