]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
valtrack: Avoid creating raw SUBREGs with VOIDmode argument [PR104557]
authorJakub Jelinek <jakub@redhat.com>
Thu, 17 Feb 2022 10:14:38 +0000 (11:14 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 10 May 2022 08:14:33 +0000 (10:14 +0200)
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  <jakub@redhat.com>

PR debug/104557
* valtrack.c (debug_lowpart_subreg): Don't call gen_rtx_raw_SUBREG
if expr has VOIDmode.

* gcc.dg/dfp/pr104557.c: New test.

(cherry picked from commit 1c2b44b52364cb5661095b346de794bc7ff02866)

gcc/testsuite/gcc.dg/dfp/pr104557.c [new file with mode: 0644]
gcc/valtrack.c

diff --git a/gcc/testsuite/gcc.dg/dfp/pr104557.c b/gcc/testsuite/gcc.dg/dfp/pr104557.c
new file mode 100644 (file)
index 0000000..a4a1cc6
--- /dev/null
@@ -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;
+}
index 42c5950aca16edd3e3bb395bbe00b7451491c440..fed76076bdc5c377c2a2a8f603cf53c8c874761a 100644 (file)
@@ -559,7 +559,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