On Thu, 17 Feb 2022, Jakub Jelinek wrote: > Hi! > > After the recent r12-7240 simplify_immed_subreg changes, we bail on more > simplify_subreg calls than before, e.g. apparently for decimal modes > in the NaN representations we almost never preserve anything except the > canonical {q,s}NaNs. > simplify_gen_subreg will punt in such cases because a SUBREG with VOIDmode > is not valid, but debug_lowpart_subreg wants to attempt even harder, even > if e.g. target indicates certain mode combinations aren't valid for the > backend, dwarf2out can still handle them. But a SUBREG from a VOIDmode > operand is just too much, the inner mode is lost there. We'd need some > new rtx that would be able to represent those cases. > For now, just punt in those cases. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Richard. > 2022-02-17 Jakub Jelinek <ja...@redhat.com> > > PR debug/104557 > * valtrack.cc (debug_lowpart_subreg): Don't call gen_rtx_raw_SUBREG > if expr has VOIDmode. > > * gcc.dg/dfp/pr104557.c: New test. > > --- gcc/valtrack.cc.jj 2022-01-18 11:59:00.252972485 +0100 > +++ gcc/valtrack.cc 2022-02-16 11:29:28.234826860 +0100 > @@ -558,7 +558,9 @@ debug_lowpart_subreg (machine_mode outer > rtx ret = simplify_gen_subreg (outer_mode, expr, inner_mode, offset); > if (ret) > return ret; > - return gen_rtx_raw_SUBREG (outer_mode, expr, offset); > + if (GET_MODE (expr) != VOIDmode) > + return gen_rtx_raw_SUBREG (outer_mode, expr, offset); > + return NULL_RTX; > } > > /* If UREGNO is referenced by any entry in DEBUG, emit a debug insn > --- gcc/testsuite/gcc.dg/dfp/pr104557.c.jj 2022-02-16 11:36:03.733329235 > +0100 > +++ gcc/testsuite/gcc.dg/dfp/pr104557.c 2022-02-16 11:35:27.599831513 > +0100 > @@ -0,0 +1,22 @@ > +/* PR debug/104557 */ > +/* { dg-do compile } */ > +/* { dg-options "-O -g -Wno-psabi" } */ > + > +typedef int __attribute__((__vector_size__ (32))) U; > +typedef double __attribute__((__vector_size__ (32))) F; > +typedef _Decimal64 __attribute__((__vector_size__ (32))) D; > + > +F > +bar (void) > +{ > + F f = __builtin_convertvector ((D) (-10.d < (D) ((D) (U) { 0, 0, 0, 0, 0, > 0, 0, -0xe0 } > + >= (D) { 80000000 })), F); > + return f; > +} > + > +F > +foo () > +{ > + F x = bar (); > + return x; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)