https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78411
--- Comment #7 from rguenther at suse dot de <rguenther at suse dot de> --- On Mon, 21 Nov 2016, jakub at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78411 > > --- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- > Oh, starting with r242550 this FAILs now everywhere. The question is why it > FAILed for H.J. before r242550. > So shall we just add -ftree-loop-if-convert to dg-options of this test? Not sure. Maybe remove it instead? Why does RTL if-conversion not catch it? Or why does PHI-OPT not catch it: <bb 5>: # s_40 = PHI <s_2(4), 0(2)> # i_35 = PHI <i_3(4), 0(2)> _25 = MEM[base: products_16(D), index: i_35, step: 8, offset: 0B]; if (_25 > 0) goto <bb 7>; else goto <bb 6>; <bb 6>: _17 = -_25; <bb 7>: # iftmp.0_13 = PHI <1(5), -1(6)> # prephitmp_10 = PHI <_25(5), _17(6)> # prephitmp_9 = PHI <-1(5), 1(6)> # prephitmp_33 = PHI <4294967295(5), 1(6)> # prephitmp_32 = PHI <1(5), 4294967295(6)> _31 = (long long unsigned int) prephitmp_10; this should be ABS_EXPR<>. I guess the other PHIs get in the way. Earlier PHI-OPT has too convoluted tests still. The above also shows some excessive PRE of constants (we're inserting more PHIs when dealing with a all-constant-arg PHI): <bb 5>: - # iftmp.0_12 = PHI <1(4), -1(12)> - _4 = _3 * iftmp.0_12; - _5 = (long long unsigned int) _4; + # iftmp.0_12 = PHI <1(3), -1(4)> + # prephitmp_37 = PHI <_3(3), _36(4)> + # prephitmp_38 = PHI <-1(3), 1(4)> + # prephitmp_39 = PHI <4294967295(3), 1(4)> + # prephitmp_41 = PHI <1(3), 4294967295(4)> + _5 = (long long unsigned int) prephitmp_37; I guess I'll (finally) try to do something about that.