Richard Biener <rguent...@suse.de> writes: > On Fri, 5 May 2017, Georg-Johann Lay wrote: >> On 05.05.2017 13:04, Richard Biener wrote: >> > On Fri, 5 May 2017, Georg-Johann Lay wrote: >> > >> > > Applied this addendum to r247495 which removed flag_strict_overflow. >> > > There >> > > were remains of the flag in avr.md which broke the avr build. >> > > >> > > Committed as r247632. >> > >> > Whoops - sorry for not grepping besides .[ch] files... >> > >> > But... these patterns very much look like premature optimization >> > and/or bugs. combine is supposed to handle this via simplify_rtx. >> >> Well, for now the patch just restores avr BE to be able to be build. > > Sure. > >> > Also note that on RTL we generally assume overflow wraps as we lose >> > signedness of operands. Not sure what 'compare' in your patterns >> > will end up with. >> > >> > The only flag_wrapv checks in RTL otherwise are in simplify-rtx.c >> > for ABS which seems to be a singed RTL op. >> >> Which is a bug, IMO. Letting undefined overflow propagate to RTL >> renders some RTL as if it has undefined behaviour. Consequence is >> that testing the MSB must no more use signed comparisons on >> less-zero resp. greater-or-equal-to-zero. >> >> Cf. https://gcc.gnu.org/PR75964 for an example: >> >> >> typedef __UINT8_TYPE__ uint8_t; >> >> uint8_t abs8 (uint8_t x) >> { >> if (x & 0x80) >> x = -x; >> >> if (x & 0x80) >> x = 0x7f; >> >> return x; >> } >> >> The first comparison is performed by a signed test against 0 (which >> is reasonable and the best code in that case) but then we conclude >> that the second test is always false, which is BUG. >> >> IMO the culprit is to let slip undefined overflow to RTL. > > Yes. I thought in RTL overflow is always well-defined (but then > as I said your patterns are equally bogus).
Yeah, me too. I don't see how the simplify-rtx.c code can be right. Is the following OK, if it passes testing? Thanks, Richard 2017-05-05 Richard Sandiford <richard.sandif...@linaro.org> gcc/ PR rtl-optimization/75964 * simplify-rtx.c (simplify_const_relational_operation): Remove invalid handling of comparisons of integer ABS. Index: gcc/simplify-rtx.c =================================================================== --- gcc/simplify-rtx.c 2017-05-05 13:44:27.364724260 +0100 +++ gcc/simplify-rtx.c 2017-05-05 13:44:36.580195277 +0100 @@ -5316,34 +5316,14 @@ simplify_const_relational_operation (enu { case LT: /* Optimize abs(x) < 0.0. */ - if (!HONOR_SNANS (mode) - && (!INTEGRAL_MODE_P (mode) - || (!flag_wrapv && !flag_trapv))) - { - if (INTEGRAL_MODE_P (mode) - && (issue_strict_overflow_warning - (WARN_STRICT_OVERFLOW_CONDITIONAL))) - warning (OPT_Wstrict_overflow, - ("assuming signed overflow does not occur when " - "assuming abs (x) < 0 is false")); - return const0_rtx; - } + if (!INTEGRAL_MODE_P (mode) && !HONOR_SNANS (mode)) + return const0_rtx; break; case GE: /* Optimize abs(x) >= 0.0. */ - if (!HONOR_NANS (mode) - && (!INTEGRAL_MODE_P (mode) - || (!flag_wrapv && !flag_trapv))) - { - if (INTEGRAL_MODE_P (mode) - && (issue_strict_overflow_warning - (WARN_STRICT_OVERFLOW_CONDITIONAL))) - warning (OPT_Wstrict_overflow, - ("assuming signed overflow does not occur when " - "assuming abs (x) >= 0 is true")); - return const_true_rtx; - } + if (!INTEGRAL_MODE_P (mode) && !HONOR_NANS (mode)) + return const_true_rtx; break; case UNGE: