https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108038
--- Comment #1 from Raphael M Zinsly <rzinsly at ventanamicro dot com> --- (In reply to Jeffrey A. Law from comment #0) > testGT: > sgt a0,a0,a1 # 25 [c=4 l=4] *sgt_didi > xori a0,a0,1 # 27 [c=4 l=4] xordi3/1 > addi a0,a0,2 # 16 [c=4 l=4] adddi3/1 > ret # 35 [c=0 l=4] simple_return > > > But ISTM we could generate this instead: > > testGT: > sgt a0,a1,a0 # 24 [c=4 l=4] *riscv.md:2535 > addi a0,a0,2 # 16 [c=4 l=4] adddi3/1 > ret # 32 [c=0 l=4] simple_return Unless I'm missing something this seems wrong: 'sgt a0,a0,a1' with 'xori a0,a0,1' would be equivalent to 'sge a0,a1,a0' or to 'sle a0,a0,a1' and not to 'sgt a0,a1,a0'. For x == y the result would be 2 with your asm. > We can invert the condition and swap the operands with something like this: > > (define_insn "" > [(set (match_operand:GPR 0 "register_operand" "=r") > (any_le:GPR (match_operand:X 1 "register_operand" " r") > (match_operand:X 2 "register_operand" "r")))] > "" > "sgt<u>\t%0,%2,%1" > [(set_attr "type" "slt") > (set_attr "mode" "<X:MODE>")]) This works as you intended. However, I think the right patter should be: (define_insn "*sge<u>_<X:mode><GPR:mode>_inv" [(set (match_operand:GPR 0 "register_operand" "=r") (any_le:GPR (match_operand:X 1 "register_operand" " r") (match_operand:X 2 "register_operand" "r")))] "" "sge<u>\t%0,%2,%1" [(set_attr "type" "slt") (set_attr "mode" "<X:MODE>")]) It produces the output: testGT: sge a0,a1,a0 # 24 [c=4 l=4] *sge_didi_inv addi a0,a0,2 # 16 [c=4 l=4] adddi3/1 ret # 32 [c=0 l=4] simple_return