On Wed, 2020-04-22 at 12:26 -0600, Jeff Law wrote:
> On Fri, 2020-04-10 at 16:40 -0500, will schmidt via Gcc-patches
> wrote:
> > [RFC][PR target/90000] Compile time hog w/impossible asm constraint
> > lra loop
> >     
> > Hi,
> >   RFC for a bandaid/patch to partially address target PR/90000.
> > 
> > This adds an escape condition from the forever loop where 
> > LRA gets stuck while attempting to handle constraints from an 
> > instruction that has previously suffered an impossible constraint
> > error.
> > 
> > This is somewhat inspired by MAX_RELOAD_INSNS_NUMBER as
> > seen in lra-constraints.c lra_constraints().   This utilizes the
> > existing counter variable lra_constraint_iter.
> > 
> > More needs to be done here, as this does replace a spin-forever
> > situation with an ICE.
> > 
> > Thanks
> > -Will
> > 
> > 
> > gcc/
> > 2020-04-10  Will Schmidt  <will_schm...@vnet.ibm.com>
> > 
> >     * lra.c: Add include of rtl-error.h.
> >         (MAX_LRA_CONSTRAINT_PASSES): New define.
> >         (lra): Add check of lra_constraint_iter value.
> 
> Doesn't this argue that there's some other datastructure that needs
> to be updated
> when we removed the impossible asm?

Yes, i think so.   I'm just not sure exactly what or where.
The submitted patch is minimally allowing for manageable-in-size reload
dumps for my continued debug.  :-)

There is an old patch that addressed what looks like a similar issue,
but i wasn't able to directly apply that to this situation without
failing in other places. 

>commit e86c0101ae59b32c3f10edcca78398cbf8848eaa
>Author: Steven Bosscher <ste...@gcc.gnu.org>
>Date:   Thu Jan 24 10:30:26 2013 +0000
>    re PR inline-asm/55934 (LRA inline asm error recovery)

Which does a bit more, but at it's core is this:

+                     PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
+                     lra_set_insn_deleted (insn);


I suspect this particular scenario with the testcase is a dependency across
several 'insns', so marking just one as deleted is not enough.
(but i'm not sure,..

void foo (void)
{
  register float __attribute__ ((mode(SD))) r31 __asm__ ("r31");
  register float __attribute__ ((mode(SD))) fr1 __asm__ ("fr1");

  __asm__ ("#" : "=d" (fr1));
  r31 = fr1;
  __asm__ ("#" : : "r" (r31));
}

thanks
-Will

> 
> Jeff
> > 
> 
> 

Reply via email to