https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87871
--- Comment #44 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Well, it requires that the RA looks specially for this kind of pattern and if it ends up being a noop move, nothing simplifies the pattern again back to normal comparison, and as Segher noted, it can negatively affect other optimization passes. Completely untested patch peephole2 patch: --- gcc/config/arm/arm.md.jj 2019-03-19 11:04:49.283170205 +0100 +++ gcc/config/arm/arm.md 2019-04-18 16:21:18.974543408 +0200 @@ -10928,12 +10928,22 @@ [(set (match_operand:SI 0 "arm_general_register_operand" "") (match_operand:SI 1 "arm_general_register_operand" "")) (set (reg:CC CC_REGNUM) - (compare:CC (match_dup 1) (const_int 0)))] + (compare:CC (match_operand:SI 2 "arm_general_register_operand" "") + (const_int 0)))] + "TARGET_ARM + && (rtx_equal_p (operands[2], operands[0]) + || rtx_equal_p (operands[2], operands[1]))" + [(parallel [(set (reg:CC CC_REGNUM) (compare:CC (match_dup 1) (const_int 0))) + (set (match_dup 0) (match_dup 1))])]) + +(define_peephole2 + [(set (reg:CC CC_REGNUM) + (compare:CC (match_operand:SI 1 "arm_general_register_operand" "") + (const_int 0)))] + (set (match_operand:SI 0 "arm_general_register_operand" "") (match_dup 1))] "TARGET_ARM" [(parallel [(set (reg:CC CC_REGNUM) (compare:CC (match_dup 1) (const_int 0))) - (set (match_dup 0) (match_dup 1))])] - "" -) + (set (match_dup 0) (match_dup 1))])]) (define_split [(set (match_operand:SI 0 "s_register_operand" "")