This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch,avr,committed]: Remove flag_strict_overflow from avr.md
Richard Biener <rguenther@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.sandiford@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: