On Fri, Jan 8, 2016 at 11:24 PM, Joseph Myers <jos...@codesourcery.com> wrote:
> On Fri, 8 Jan 2016, Matthew Wahab wrote:
>
>> Hello,
>>
>> The C/C++ front-ends apply type conversions to expressions using ABS
>> with integral arguments of type smaller than int. This means that, for
>> short x, ABS(x) becomes something like (short)ABS((int)x)). When the
>> argument is the result of memory access, this restricts the vectorizer
>> apparently because the alignment of the operation doesn't match the
>> alignment of the memory access. This causes two failures in
>> gcc.target/aarch64/vec-abs-compile.c where the expected abs instructions
>> aren't generated.
>>
>> This patch adds a case to convert_to_integer_1 to push the integer type
>> conversions applied to an ABS expression into the argument, when it is
>> safe to do so. This fixes the failing test cases.
>
> Note that, for example, (int) labs (INT_MIN) is well-defined if long is
> wider than int (in GNU C, where conversion of out-of-range values to
> signed types is well-defined).  But abs (INT_MIN) is undefined.  That is,
> such transformations can never be safe unless the minimum value of the
> type of the ABS_EXPR argument is not a possible value of the contained
> expression.
>
> What's your definition of safe?  I'd expect a patch like this to contain
> lots of testcases verifying that the transformation occurs in cases where
> it's OK, but that (int) labs (int_var) does not end up with an ABS_EXPR on
> type int (for example) (in the absence of a guarantee that said ABS_EXPR
> will return INT_MIN for an argument of INT_MIN - which might be the case
> for -fwrapv, but can't be otherwise because *_nonnegative*_p assume
> ABS_EXPR always produces a nonnegative result).

Also please don't add to convert_* and friends but instead amend match.pd
with appropriate rules.

Richard.

> --
> Joseph S. Myers
> jos...@codesourcery.com

Reply via email to