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 ...