https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92651
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization CC|rguenther at suse dot de |rguenth at gcc dot gnu.org Target Milestone|--- |10.0 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Hmm, we expand from _1 = (int) a_4(D); _2 = (int) b_5(D); _3 = _1 - _2; isum_6 = ABS_EXPR <_3>; return isum_6; where ABS_EXPR expansion seems to like using smax (and if not smax then conditional move). (insn 11 10 12 (parallel [ (set (reg:SI 93) (minus:SI (reg:SI 91) (reg:SI 92))) (clobber (reg:CC 17 flags)) ]) "t3.c":3:30 -1 (nil)) (insn 12 11 13 (parallel [ (set (reg:SI 94) (neg:SI (reg:SI 93))) (clobber (reg:CC 17 flags)) ]) "t3.c":3:9 -1 (nil)) (insn 13 12 14 (parallel [ (set (reg:SI 90 [ isum ]) (smax:SI (reg:SI 93) (reg:SI 94))) (clobber (reg:CC 17 flags)) ]) "t3.c":3:9 -1 (nil)) expand_abs_nojump first looks for an abs pattern (which we have none - but STV to the rescue!) and then uses MAX(x, -x) if we have a max pattern which we now have, thanks to r277481. That would turn into a cmov sequence later in case STV finds the transform not worthwhile. For corei7: Computing gain for chain #1... Instruction gain 8 for 13: {r90:SI=smax(r93:SI,r94:SI);clobber flags:CC;} REG_DEAD r94:SI REG_DEAD r93:SI REG_UNUSED flags:CC Instruction conversion gain: 8 Registers conversion cost: 6 Total gain: 2 while the rev. wasn't intended to cover abs() it was intended to cover cmov because cmov exhibits weird performance characteristics and the lack of min/max (and here abs) instructions on the GPR side is quite bad.