On Tue, Dec 16, 2014 at 7:42 PM, Ulrich Weigand <uweig...@de.ibm.com> wrote: > Richard Biener wrote: >> On Fri, Dec 12, 2014 at 1:08 PM, Ulrich Weigand <uweig...@de.ibm.com> wrote: >> > Richard Biener wrote: >> >> On Thu, Dec 11, 2014 at 4:04 PM, Ulrich Weigand <uweig...@de.ibm.com> >> >> wrote: >> >> > However, if we make that change, there will be some cases that regress: >> >> > the >> >> > problem is that an expression "x + y" has *one* result type, and some >> >> > things >> >> > you do with the result will require that type to match precisely >> >> > (including >> >> > signedness). So *any* change that affects what that result type is will >> >> > regress some code that happened to rely on the precise result type ... >> >> >> >> True, but IMHO that's still better. You may want to check the openCL spec >> >> which we tried to follow losely as to what we allow. >> >> >> >> So again, implementing your A is ok with me. >> > >> > Well, the openCL spec says that operations between signed and unsigned >> > vectors are simply prohibited (both openCL 1.2 and openCL 2.0 agree on >> > this, and it matches the behavior of my old openCL compiler ...): > [snip] >> The question is what the fallout is if we reject this by default (I suppose >> we accept it with -flax-vector-conversions). I'm ok with following >> OpenCL as well, >> that is either solution that makes behavior consistent between C and C++. > > I agree that we should certainly continue to support mixed types with > -flax-vector-conversions. (This means we really should fix the C/C++ > inconsistency as to return type in any case, even if we disable mixed > type support by default.) > > What the fallout of disabling mixed types by default would be is hard > to say. On the one hand, all other standards I've looked at (OpenCL, > Altivec/VSX, Cell SPU) prohibit mixing signed/unsigned types. So this > hopefully means users of the GCC extension don't use this feature (much). > [Of course, Altivec does not really talk about operators, but ideally > GCC's a + b should be equivalent to the Altivec vec_add (a, b), which > does not support mixing signed/unsigned types.] > > On the other hand, I've noticed at least two related areas where disabling > mixed types could result in unexpected fallout: opaque types and platform > specific vector types (e.g. "vector bool" on Altivec). > > Opaque types are a somewhat under-specified GCC feature that is used for > different purposes by various platforms and the middle-end itself: > - some platform-specific types (PPC SPE __ev64_opaque__ or MEP cp_vector) > - function parameters for overloaded builtins in C before resolution > - the output of vector comparison operators and vector truth_type_for > > It should be possible to use an opaque type together with vectors of > different types, even with -flax-vector-conversions (and even if we > disable support for signed/unsigned mixed types); the result of an > operation on an opaque type and a non-opaque type should be the > non-opaque type; it's not quite clear to me how operations on two > different opaque types are (should be?) defined. > > Platform-specific types like Altivec "vector bool" are not really known > to the middle-end; this particular case is treated just like a normal > unsigned integer vector type. This means that as a side-effect of > disabling signed/unsigned mixed types, we would also disallow mixing > signed/bool types. But at least for Altivec vec_add, the latter is > explicitly *allowed* (returning the signed type). It would certainly > be preferable for + to be compatible to vec_add also for the bool types. > [ Note that the current implementation also does not fully match that > goal, because while signed + bool is allowed, the return value is > sometimes the bool type instead of the signed type. ] > > This can probably only be fully solved by making the middle-end aware > that things like "vector bool" need to be handled specially. I had > thought that maybe the back-end simply needs to mark "vector bool" > as an opaque type (after all, the middle-end also uses this for > vector truth types), but that doesn't work as-is, since one of the > other features of opaque types is that they cannot be initialized. > (Altivec vector bool *can* be initialized.) Maybe those two features > should be decoupled, so we can have opaque types used as truth types, > and those that cannot be initialized ... > > > So overall the list of actions probably looks like this: > > 1. Fix the selection of the common type to use for binary vector operations > - C and C++ need to be consistent
Right. > - If one type is opaque and the other isn't, use the non-opaque type Correct. > - If one type is unsigned and the other is signed, use the unsigned type Yes. > - What to do with different types where neither of the above rules apply? Reject them? > 2. Rework support for opaque and platform-specific vector types > - Instead of the single "opaque" bit, have two flags: > * Mark type as compatible with other types in assignment/operations > * Mark type as "cannot be initialized" > - Use initializable opaque types for Altivec "vector bool" (and others?) I have to little knowledge about these specialities. They should be fully C family frontend + backend specific, the middle-end should just see regular vectors. > 3. Disable mixing signed/unsigned types in binary operations > - This remains allowed if -flax-vector-conversions > > Doing just 1. will at least fix the current C/C++ inconsistencies. > Doing 2. in addition will fix the current "vector bool" inconsistencies. > Doing all 3 will get us in line with OpenCL, Altivec, etc. > > If this sounds reasonable, I can try to come up with a set of patches ... Yes, I think this sounds reasonable. Thanks, Richard. > Bye, > Ulrich > > -- > Dr. Ulrich Weigand > GNU/Linux compilers and toolchain > ulrich.weig...@de.ibm.com >