Hi! 0x80000000 (in RTL (const_int 0xffffffff80000000)) is valid the "I" constraint and should be allowed for sbcs, but because HOST_WIDE_INT is 64-bit, UINTVAL (operands[2]) == -UINTVAL (operands[3]) is actually not true for that.
Fixed thusly, bootstrapped/regtested on armv7hl-linux-gnueabi, preapproved in the PR by Kyrill, committed to trunk. Sorry for the breakage. Note, using UINTVAL actually isn't necessary, I used it for the fear that there might be UB in the compiler, but because these values must be valid SImode CONST_INTs and -INTVAL is only UB for 0x8000000000000000 which is not a valid SImode CONST_INT, we don't need to negate in unsigned type. 2019-02-28 Jakub Jelinek <ja...@redhat.com> PR target/89434 * config/arm/arm.md (*subsi3_carryin_compare_const): Use trunc_int_for_mode (-INTVAL (...), SImode), just instead of -UINTVAL (...). --- gcc/config/arm/arm.md.jj 2019-02-25 11:32:02.914684615 +0100 +++ gcc/config/arm/arm.md 2019-02-26 14:41:41.128767480 +0100 @@ -1185,7 +1187,9 @@ (define_insn "*subsi3_carryin_compare_co (minus:SI (plus:SI (match_dup 1) (match_operand:SI 3 "arm_neg_immediate_operand" "L")) (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))] - "TARGET_32BIT && UINTVAL (operands[2]) == -UINTVAL (operands[3])" + "TARGET_32BIT + && (INTVAL (operands[2]) + == trunc_int_for_mode (-INTVAL (operands[3]), SImode))" "sbcs\\t%0, %1, #%n3" [(set_attr "conds" "set") (set_attr "type" "adcs_imm")] Jakub