rtl-optimization: Fix uninitialized use of opaque mode variable ICE [PR98872]
authorPeter Bergner <bergner@linux.ibm.com>
Mon, 15 Feb 2021 16:38:33 +0000 (10:38 -0600)
committerPeter Bergner <bergner@linux.ibm.com>
Mon, 15 Feb 2021 16:39:24 +0000 (10:39 -0600)
The initialize_uninitialized_regs function emits (set (reg:) (CONST0_RTX))
for all uninitialized pseudo uses.  However, some modes (eg, opaque modes)
may not have a CONST0_RTX defined, leading to an ICE when we try and create
the initialization insn.  The fix is to skip emitting the initialization
if there is no CONST0_RTX defined for the mode.

2021-02-15  Peter Bergner  <bergner@linux.ibm.com>

gcc/
PR rtl-optimization/98872
* init-regs.c (initialize_uninitialized_regs): Skip initialization
if CONST0_RTX is NULL.

gcc/testsuite/
PR rtl-optimization/98872
* gcc.target/powerpc/pr98872.c: New test.

gcc/init-regs.c
gcc/testsuite/gcc.target/powerpc/pr98872.c [new file with mode: 0644]

index 903c654..72e898f 100644 (file)
@@ -105,7 +105,10 @@ initialize_uninitialized_regs (void)
 
                  start_sequence ();
                  emit_clobber (reg);
-                 emit_move_insn (reg, CONST0_RTX (GET_MODE (reg)));
+                 /* PR98872: Only emit an initialization if MODE has a
+                    CONST0_RTX defined.  */
+                 if (CONST0_RTX (GET_MODE (reg)))
+                   emit_move_insn (reg, CONST0_RTX (GET_MODE (reg)));
                  move_insn = get_insns ();
                  end_sequence ();
                  emit_insn_before (move_insn, insn);
diff --git a/gcc/testsuite/gcc.target/powerpc/pr98872.c b/gcc/testsuite/gcc.target/powerpc/pr98872.c
new file mode 100644 (file)
index 0000000..f33ad9b
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR target/98872 */
+/* { dg-require-effective-target power10_ok } */
+/* { dg-options "-O2 -mdejagnu-cpu=power10" } */
+
+/* Verify we do not ICE on the following tests.  */
+
+void
+foo (__vector_quad *dst)
+{
+  __vector_quad acc;
+  *dst = acc;
+}
+
+void
+bar (__vector_pair *dst)
+{
+  __vector_pair pair;
+  *dst = pair;
+}