https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67438
--- Comment #10 from rguenther at suse dot de <rguenther at suse dot de> --- On Tue, 17 Nov 2015, ysrumyan at gmail dot com wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67438 > > --- Comment #9 from Yuri Rumyantsev <ysrumyan at gmail dot com> --- > It looks like such transformation is profitable if only def statements have a > single use, i.e. it looks reasonable for > if (255 - a) > (255 -b) /* a,b have char type. */ > but it does not look reasonable for attached test-case since after it we > missed > min/max recognition, namely, > > c = 255 - r; /* c has mulitple uses! */ > m = 255 - g; /* likewise. */ > y = 255 - b; /* likewise. */ > if (c < m) > k = MIN (c, y); > else > k = MIN (m, y); > *write++ = c - k; Looks like we are missing the corresponding pattern for MIN/MAX instead. MIN (~X, ~Y) -> ~MAX (X, Y) MAX (~X, ~Y) -> ~MIN (X, Y) (for minmax (min max) maxmin (max min) (simplify (minmax (bit_not @0) (bit_not @1)) (bit_not (maxmin @0 @1)))) maybe that helps. I notice a missed optimization to combine the test with the two MINs on the GIMPLE level anyway.