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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2020-04-30
             Status|UNCONFIRMED                 |NEW

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Likely because we expand from

  u_4 = *p_3(D);
  _8 = .ADD_OVERFLOW (u_4, x_5(D));
  _1 = REALPART_EXPR <_8>;
  _9 = IMAGPART_EXPR <_8>;
  *p_3(D) = _1;
  _7 = _9 != 0;
  return _7;

and add-overflow expansion does not know how to use the TERed u_4.  The
pattern is the following and allows memory:

(define_insn "*add<mode>3_cc_overflow_1"
  [(set (reg:CCC FLAGS_REG)
        (compare:CCC
            (plus:SWI
                (match_operand:SWI 1 "nonimmediate_operand" "%0,0")
                (match_operand:SWI 2 "<general_operand>" "<r><i>,m"))
            (match_dup 1)))
   (set (match_operand:SWI 0 "nonimmediate_operand" "=<r>m,<r>")
        (plus:SWI (match_dup 1) (match_dup 2)))]
  "ix86_binary_operator_ok (PLUS, <MODE>mode, operands)"
  "add{<imodesuffix>}\t{%2, %0|%0, %2}"
  [(set_attr "type" "alu")
   (set_attr "mode" "<MODE>")])

but maybe the alternatives are mixed up here in the different insn parts
of the parallel ...

Reply via email to