On December 29, 2020 6:42:30 PM GMT+01:00, Marc Glisse <marc.gli...@inria.fr> wrote: >On Tue, 29 Dec 2020, Richard Sandiford via Gcc wrote: > >> Any thoughts on what f should return in the following testcase, given >the >> usual GNU behaviour of treating signed >> as arithmetic shift right? >> >> typedef int vs4 __attribute__((vector_size(16))); >> typedef unsigned int vu4 __attribute__((vector_size(16))); >> int >> f (void) >> { >> vs4 x = { -1, -1, -1, -1 }; >> vu4 y = { 0, 0, 0, 0 }; >> return ((x + y) >> 1)[0]; >> } >> >> The C frontend takes the type of x+y from the first operand, so x+y >> is signed and f returns -1. > >Symmetry is an important property of addition in C/C++. > >> The C++ frontend applies similar rules to x+y as it would to scalars, >> with unsigned T having a higher rank than signed T, so x+y is >unsigned >> and f returns 0x7fffffff. > >That looks like the most natural choice. > >> FWIW, Clang treats x+y as signed, so f returns -1 for both C and C++. > >I think clang follows gcc and uses the type of the first operand.
The desired behavior is the one that OpenCL specifies. If it is implementation defined we should document behavior. I agree symmetry is nice but eventually the current C behavior is what OpenCL specifies. Richard.