On 06/21/2018 11:44 AM, Vladimir Makarov wrote: > > > On 06/13/2018 02:58 PM, Dimitar Dimitrov wrote: >> From: Dimitar Dimitrov <dddimit...@mm-sol.com> >> >> For some targets, Pmode != UNITS_PER_WORD. Take this into account >> when marking hard registers as being used. >> >> I tested C and C++ testsuits for x86_64 with and without this >> patch. There was no regression, i.e. gcc.sum and g++.sum matched >> exactly. >> >> gcc/ChangeLog: >> >> 2018-06-13 Dimitar Dimitrov <dimi...@dinux.eu> >> >> * lra-eliminations.c (set_ptr_hard_reg_bits): New function. >> (update_reg_eliminate): Mark all spanning hw registers. >> >> gcc/testsuite/ChangeLog: >> >> 2018-06-13 Dimitar Dimitrov <dimi...@dinux.eu> >> >> * gcc.target/pru/lra-framepointer-fragmentation-1.c: New test. >> * gcc.target/pru/lra-framepointer-fragmentation-2.c: New test. >> >> Cc: Vladimir Makarov <vmaka...@redhat.com> >> Cc: Peter Bergner <berg...@vnet.ibm.com> >> Cc: Kenneth Zadeck <zad...@naturalbridge.com> >> Cc: Seongbae Park <seongbae.p...@gmail.com> >> Signed-off-by: Dimitar Dimitrov <dddimit...@mm-sol.com> >> --- >> gcc/lra-eliminations.c | 14 ++++- >> .../pru/lra-framepointer-fragmentation-1.c | 33 ++++++++++++ >> .../pru/lra-framepointer-fragmentation-2.c | 61 >> ++++++++++++++++++++++ >> 3 files changed, 106 insertions(+), 2 deletions(-) >> create mode 100644 >> gcc/testsuite/gcc.target/pru/lra-framepointer-fragmentation-1.c >> create mode 100644 >> gcc/testsuite/gcc.target/pru/lra-framepointer-fragmentation-2.c >> >> diff --git a/gcc/lra-eliminations.c b/gcc/lra-eliminations.c >> index 21d8d5f8018..566cc2c8248 100644 >> --- a/gcc/lra-eliminations.c >> +++ b/gcc/lra-eliminations.c >> @@ -1180,6 +1180,16 @@ spill_pseudos (HARD_REG_SET set) >> bitmap_clear (&to_process); >> } >> +static void set_ptr_hard_reg_bits (HARD_REG_SET *hard_reg_set, int r) >> +{ >> + int w; >> + >> + for (w = 0; w < GET_MODE_SIZE (Pmode); w += UNITS_PER_WORD, r++) >> + { >> + SET_HARD_REG_BIT (*hard_reg_set, r); >> + } >> +} >> + > The patch itself is ok but for uniformity I'd use > > for (int i = hard_regno_nregs (r, Pmode) - 1; i >= 0; i--) > SET_HARD_REG_BIT (*hard_reg_set, r + i); I'm a bit surprised we don't already have a utility function to do this. Hmmm
add_to_hard_reg_set (hard_reg_set, Pmode, r) So instead LRA ought to be using that function in the places where calls to set_ptr_hard_reg_bits were introduced. Dimitar, can you verify that change works? Jeff