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

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Of course it is latent before/after.
In const_ok_for_output_1 we have
  /* FIXME: Refer to PR60655. It is possible for simplification
     of rtl expressions in var tracking to produce such expressions.
     We should really identify / validate expressions
     enclosed in CONST that can be handled by assemblers on various
     targets and only handle legitimate cases here.  */
  switch (GET_CODE (rtl))
    {
    case SYMBOL_REF:
      break;
    case NOT:
    case NEG:
      return false;
    default:
      return true;
    }
that catches some problematic cases, but in this case the simplification
created (const (minus (const_int -2) (unspec ...)))
and that makes the unspec negated too.  So, we could e.g. add a case to the
above switch that case MINUS: if there are any UNSPECs in subexpressions of the
second operand, punt.  Of course, if we want to try harder, we could try to
negate the expression and see if it is valid that way etc.

Reply via email to