From: Jakub Jelinek Date: Thu, 17 Feb 2022 10:14:38 +0000 (+0100) Subject: valtrack: Avoid creating raw SUBREGs with VOIDmode argument [PR104557] X-Git-Tag: upstream/12.2.0~1422 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1c2b44b52364cb5661095b346de794bc7ff02866;p=platform%2Fupstream%2Fgcc.git valtrack: Avoid creating raw SUBREGs with VOIDmode argument [PR104557] 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. 2022-02-17 Jakub Jelinek 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. --- diff --git a/gcc/testsuite/gcc.dg/dfp/pr104557.c b/gcc/testsuite/gcc.dg/dfp/pr104557.c new file mode 100644 index 0000000..a4a1cc6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/pr104557.c @@ -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; +} diff --git a/gcc/valtrack.cc b/gcc/valtrack.cc index 2bbd211..27c98b6 100644 --- a/gcc/valtrack.cc +++ b/gcc/valtrack.cc @@ -558,7 +558,9 @@ debug_lowpart_subreg (machine_mode outer_mode, rtx expr, 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