This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Question on fixup_abnormal_edges


Michael Matz wrote:
> > ;; End of basic block 175, registers live:
> >  29 [$29] 30 [$30] 31 [AP] 63 [FP]
> 
> Ok, no $22 here.  So either the caller-save code should take the current
> liveness into account before emitting loads/stores around calls (which I'm
> not sure it is able to, considering non-optimizing compilation) or not
> emit loads after non-return calls at all (and stores are probably useless
> to, except maybe for unwinding the stack).

 Actually, this list is always there, and is sometimes augmented by a couple
 of pseudos.

 In the case eventually causing trouble, a pseudo is live throughout the block
 with the noreturn abnormal call and this pseudo is assigned hard reg 22. 

 I tried a patch inhibiting the emission of the restore insns after a noreturn
 call in save_call_clobbered_regs, and it seems to work fine. At least, it
 fixes the SEGV we've been observing and does not trigger any regression
 against our testsuite for GNAT.

 It is very simple, and I can post it here if you think it could be useful.
 I would also test/submit it more formally through gcc-patches if you think
 appropriate.

 Besides, Jan, you mentioned a potential problem with liveness computation
 elsewhere. I'd be happy to investigate this further if you think need be.
 As I am not very familiar with this code in GCC, some clues as to where/how
 noreturn calls are supposed to impact the computation would be very welcome.

 Thanks for your help,

 Kind Regards,

 Olivier



 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]