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

James Greenhalgh <jgreenhalgh at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|                            |2016-11-24
           Assignee|unassigned at gcc dot gnu.org      |jgreenhalgh at gcc dot 
gnu.org
     Ever confirmed|0                           |1

--- Comment #4 from James Greenhalgh <jgreenhalgh at gcc dot gnu.org> ---
Well, certainly this comment and assert in tree.c:

  /* The target should not ask for unpredictable float evaluation (though
     it might advertise that implicitly the evaluation is unpredictable,
     but we don't care about that here, it will have been reported
     elsewhere).  If it does ask for unpredictable evaluation, we have
     nothing to do here.  */
  gcc_assert (target_flt_eval_method != FLT_EVAL_METHOD_UNPREDICTABLE);

Suggest that the implementation I've put in for TARGET_C_EXCESS_PRECISION on
i386 is wrong (or the assert needs to be weakened).

  static enum flt_eval_method
  ix86_excess_precision (enum excess_precision_type type)
  {
    switch (type)
      {
        case EXCESS_PRECISION_TYPE_FAST:
          /* The fastest type to promote to will always be the native type,
             whether that occurs with implicit excess precision or
             otherwise.  */
          return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT;
        case EXCESS_PRECISION_TYPE_STANDARD:
        case EXCESS_PRECISION_TYPE_IMPLICIT:
          /* Otherwise, the excess precision we want when we are
             in a standards compliant mode, and the implicit precision we
             provide can be identical.  */
          if (!TARGET_80387)
            return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT;
          else if (TARGET_MIX_SSE_I387)
            return FLT_EVAL_METHOD_UNPREDICTABLE;
          else if (!TARGET_SSE_MATH)
            return FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE;
          else if (TARGET_SSE2)
            return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT;
          else
            return FLT_EVAL_METHOD_UNPREDICTABLE;
        default:
          gcc_unreachable ();
      }

    return FLT_EVAL_METHOD_UNPREDICTABLE;
  }

I think the right fix is probably to return FLT_METHOD_PROMOTE_TO_FLOAT for
EXCESS_PRECISION_TYPE_STANDARD, but I'll need to think about that.

Sorry again for the break, by inspection it is obvious how you hit that assert.

Reply via email to