On Thu, 2023-10-05 at 15:33 -0400, Vladimir Makarov wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the > content is safe > > On 9/7/23 07:21, senthilkumar.selva...@microchip.com wrote: > > Hi, > > > > One more execution failure for the avr target, this time from > > gcc.c-torture/execute/bitfld-3.c. > > > > Steps to reproduce > > > > Enable LRA in avr.cc by removing TARGET_LRA_P hook, build with > > > > $ make all-host && make install-host > > > > and then > > > > $ avr-gcc gcc/testsuite/gcc.c-torture/execute/bitfld-3.c -S -Os -mmcu=avr51 > > -fdump-rtl-all > > > > When lra_update_fp2sp_elimination runs and pseudos assigned to the > > FP have to be spilled to stack slots, they sometimes end up in a > > slot that already has a reg with an overlapping live range. This is > > because lra_reg_info[regno].live_ranges is NULL for such spilled > > pseudos, and therefore when assign_stack_slot_num_and_sort_pseduos > > checks if lra_intersected_live_ranges_p, it always returns false. > > > > In the below reload dump, all the pseudos assigned to FP get > > allocated to slot 0. The live ranges for some of them (r1241 for > > e.g.) conflicts with r603 that was originally assigned to slot 0, > > but they still end up in the same slot, causing the execution failure. > > > Sorry for the delay with the answer, Senthil. Avr is unusual target and > needs some changes in LRA but the changes improves LRA portability. So > thank you for your work on porting LRA to AVR. > > The patch is ok for me. The only comment is that making calculation of > the set only once would be nice. Live range calculation in LRA can take > a lot of time, code of update_pseudo_point is hot and the worst the set > will be really used rarely but it is calculated every time. > > You can commit the current patch and I'll do it by myself or, if you > want, you can modify the patch by yourself and submit it for review and > I'll review as soon as possible. Either way works for me.
Apologies for the extreme delay in responding - had to sort out some medical issues. Is it ok if I commit the patch now? I have one more patch in ira.cc, after which I'm hoping the regression results would be good enough to switch the avr target to LRA. Regards Senthil > > > diff --git a/gcc/lra-lives.cc b/gcc/lra-lives.cc > > index f60e564da82..e4289f13979 100644 > > --- a/gcc/lra-lives.cc > > +++ b/gcc/lra-lives.cc > > @@ -250,7 +250,17 @@ update_pseudo_point (int regno, int point, enum > > point_type type) > > if (HARD_REGISTER_NUM_P (regno)) > > return; > > > > - if (complete_info_p || lra_get_regno_hard_regno (regno) < 0) > > + /* Pseudos assigned to the FP register could potentially get spilled > > + to stack slots when lra_update_fp2sp_elimination runs, so keep > > + their live range info up to date, even if they aren't in memory > > + right now. */ > > + int hard_regno = lra_get_regno_hard_regno (regno); > > + HARD_REG_SET set; > > + CLEAR_HARD_REG_SET(set); > > + add_to_hard_reg_set (&set, Pmode, HARD_FRAME_POINTER_REGNUM); > > + > > + if (complete_info_p || hard_regno < 0 > > + || overlaps_hard_reg_set_p (set, PSEUDO_REGNO_MODE (regno), > > hard_regno)) > > { > > if (type == DEF_POINT) > > { > > > >