https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93073

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Slightly cleaned up testcase:

void bar (void);

void
foo (long double x, double y, double z)
{
  for (;;)
    {
      double a = x == 0.0 ? y : z;
      if (a == 0.0)
        bar ();
    }
}

While the exact ICE could be fixed say by:
@@ -14981,9 +14981,9 @@ rs6000_emit_cmove (rtx dest, rtx op, rtx
   /* Reduce the comparison to a comparison against zero.  */
   if (! is_against_zero)
     {
-      temp = gen_reg_rtx (compare_mode);
-      emit_insn (gen_rtx_SET (temp, gen_rtx_MINUS (compare_mode, op0, op1)));
-      op0 = temp;
+      temp = expand_simple_binop (compare_mode, MINUS, op0, op1,
+                                 NULL_RTX, 0, OPTAB_LIB);
+      op0 = force_reg (compare_mode, temp);
       op1 = CONST0_RTX (compare_mode);
     }

the problem is that all the other operations in the rs6000_emit_cmove routine
would need similar treatment, but more importantly, the routine relies on
the *fsel<SFDF:mode><SFDF2:mode>4 instruction and that is not really available
for anything but SF/DFmode.

Reply via email to