From 90f2b7e220df8ce298b2cd8f853a02aaecdbff0b Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Fri, 13 Oct 2017 09:32:29 +0000 Subject: [PATCH] Make more use of byte_lowpart_offset This patch uses byte_lowpart_offset in places that open-coded the calculation. 2017-10-13 Richard Sandiford Alan Hayward David Sherwood gcc/ * caller-save.c (replace_reg_with_saved_mem): Use byte_lowpart_offset. * combine.c (gen_lowpart_for_combine): Likewise. * dwarf2out.c (rtl_for_decl_location): Likewise. * final.c (alter_subreg): Likewise. * rtlhooks.c (gen_lowpart_general): Likewise. (gen_lowpart_if_possible): Likewise. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r253714 --- gcc/ChangeLog | 11 +++++++++++ gcc/caller-save.c | 12 +----------- gcc/combine.c | 11 +---------- gcc/dwarf2out.c | 12 +++++------- gcc/final.c | 9 +-------- gcc/rtlhooks.c | 28 +++------------------------- 6 files changed, 22 insertions(+), 61 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc2d911e2c5..bdb6bccdb5c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2017-10-13 Richard Sandiford + Alan Hayward + David Sherwood + + * caller-save.c (replace_reg_with_saved_mem): Use byte_lowpart_offset. + * combine.c (gen_lowpart_for_combine): Likewise. + * dwarf2out.c (rtl_for_decl_location): Likewise. + * final.c (alter_subreg): Likewise. + * rtlhooks.c (gen_lowpart_general): Likewise. + (gen_lowpart_if_possible): Likewise. + 2017-10-13 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/caller-save.c b/gcc/caller-save.c index 3ea8e29a09d..7c787f75163 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -1132,17 +1132,7 @@ replace_reg_with_saved_mem (rtx *loc, { /* This is gen_lowpart_if_possible(), but without validating the newly-formed address. */ - int offset = 0; - - if (WORDS_BIG_ENDIAN) - offset = (MAX (GET_MODE_SIZE (GET_MODE (mem)), UNITS_PER_WORD) - - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD)); - if (BYTES_BIG_ENDIAN) - /* Adjust the address so that the address-after-the-data is - unchanged. */ - offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)) - - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (mem)))); - + HOST_WIDE_INT offset = byte_lowpart_offset (mode, GET_MODE (mem)); mem = adjust_address_nv (mem, mode, offset); } } diff --git a/gcc/combine.c b/gcc/combine.c index b89ee6da345..4d2f79b3d71 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -11618,8 +11618,6 @@ gen_lowpart_for_combine (machine_mode omode, rtx x) if (MEM_P (x)) { - int offset = 0; - /* Refuse to work on a volatile memory ref or one with a mode-dependent address. */ if (MEM_VOLATILE_P (x) @@ -11632,14 +11630,7 @@ gen_lowpart_for_combine (machine_mode omode, rtx x) if (paradoxical_subreg_p (omode, imode)) return gen_rtx_SUBREG (omode, x, 0); - if (WORDS_BIG_ENDIAN) - offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD); - - /* Adjust the address so that the address-after-the-data is - unchanged. */ - if (BYTES_BIG_ENDIAN) - offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize); - + HOST_WIDE_INT offset = byte_lowpart_offset (omode, imode); return adjust_address_nv (x, omode, offset); } diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 528c1852e5d..beab5e4ce8e 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -19077,12 +19077,11 @@ rtl_for_decl_location (tree decl) else if (VAR_P (decl) && rtl && MEM_P (rtl) - && GET_MODE (rtl) != TYPE_MODE (TREE_TYPE (decl)) - && BYTES_BIG_ENDIAN) + && GET_MODE (rtl) != TYPE_MODE (TREE_TYPE (decl))) { machine_mode addr_mode = get_address_mode (rtl); - int rsize = GET_MODE_SIZE (GET_MODE (rtl)); - int dsize = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl))); + HOST_WIDE_INT offset = byte_lowpart_offset (TYPE_MODE (TREE_TYPE (decl)), + GET_MODE (rtl)); /* If a variable is declared "register" yet is smaller than a register, then if we store the variable to memory, it @@ -19090,10 +19089,9 @@ rtl_for_decl_location (tree decl) fact we are not. We need to adjust the offset of the storage location to reflect the actual value's bytes, else gdb will not be able to display it. */ - if (rsize > dsize) + if (offset != 0) rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)), - plus_constant (addr_mode, XEXP (rtl, 0), - rsize - dsize)); + plus_constant (addr_mode, XEXP (rtl, 0), offset)); } /* A variable with no DECL_RTL but a DECL_INITIAL is a compile-time constant, diff --git a/gcc/final.c b/gcc/final.c index eff2ee6c496..0ddf7793209 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -3199,14 +3199,7 @@ alter_subreg (rtx *xp, bool final_p) /* For paradoxical subregs on big-endian machines, SUBREG_BYTE contains 0 instead of the proper offset. See simplify_subreg. */ if (paradoxical_subreg_p (x)) - { - int difference = GET_MODE_SIZE (GET_MODE (y)) - - GET_MODE_SIZE (GET_MODE (x)); - if (WORDS_BIG_ENDIAN) - offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD; - if (BYTES_BIG_ENDIAN) - offset += difference % UNITS_PER_WORD; - } + offset = byte_lowpart_offset (GET_MODE (x), GET_MODE (y)); if (final_p) *xp = adjust_address (y, GET_MODE (x), offset); diff --git a/gcc/rtlhooks.c b/gcc/rtlhooks.c index 4d04ebd0c47..d20815e255b 100644 --- a/gcc/rtlhooks.c +++ b/gcc/rtlhooks.c @@ -59,8 +59,6 @@ gen_lowpart_general (machine_mode mode, rtx x) } else { - int offset = 0; - /* The only additional case we can do is MEM. */ gcc_assert (MEM_P (x)); @@ -72,16 +70,7 @@ gen_lowpart_general (machine_mode mode, rtx x) && !reload_completed) return gen_lowpart_general (mode, force_reg (xmode, x)); - if (WORDS_BIG_ENDIAN) - offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD) - - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD)); - - if (BYTES_BIG_ENDIAN) - /* Adjust the address so that the address-after-the-data - is unchanged. */ - offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)) - - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))); - + HOST_WIDE_INT offset = byte_lowpart_offset (mode, GET_MODE (x)); return adjust_address (x, mode, offset); } } @@ -126,19 +115,8 @@ gen_lowpart_if_possible (machine_mode mode, rtx x) else if (MEM_P (x)) { /* This is the only other case we handle. */ - int offset = 0; - rtx new_rtx; - - if (WORDS_BIG_ENDIAN) - offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD) - - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD)); - if (BYTES_BIG_ENDIAN) - /* Adjust the address so that the address-after-the-data is - unchanged. */ - offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)) - - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))); - - new_rtx = adjust_address_nv (x, mode, offset); + HOST_WIDE_INT offset = byte_lowpart_offset (mode, GET_MODE (x)); + rtx new_rtx = adjust_address_nv (x, mode, offset); if (! memory_address_addr_space_p (mode, XEXP (new_rtx, 0), MEM_ADDR_SPACE (x))) return 0; -- 2.30.2