rtl-optimization: Fix uninitialized use of opaque mode variable ICE [PR98872]

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.
This commit is contained in:
Peter Bergner 2021-02-15 10:38:33 -06:00
parent cc9a0a3d79
commit a33927c9ab
2 changed files with 23 additions and 1 deletions

View 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);

View File

@ -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;
}