On Thu, 18 Jul 2024, Richard Biener wrote:
> The following adds support for vector conditionals in C. The support > was nearly there already but c_objc_common_truthvalue_conversion > rejecting vector types. Instead of letting them pass there unchanged > I chose to instead skip it when parsing conditionals instead as a > variant with less possible fallout. The part missing was promotion > of a scalar second or third operand to vector, I copied the logic > from binary operator handling for this. > > I've moved the testcases I could easily spot over to c-c++-common. > > The C++ frontend implements vector ? '1' : '0' with promotion of > both scalar to a vector but without applying integer promotions > first (r0-124280-g07298ffd6f7c2d). I don't think this is > what we document or backed by OpenCL or C++ valarray. I think we do document that: If both b and c are scalars and the type of true?b:c has the same size as the element type of a, then b and c are converted to a vector type whose elements have this type and with the same number of elements as a. (in https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html ) and I added In contrast to scalar operations in C and C++, operands of integer vector operations do not undergo integer promotions. when spelling out the behavior of vector shifts. Clang also supports 'vector ? scalar : scalar'. > I've left > this out for now. I think we need better coverage in the testsuite > for this and others, for example the patch below now accepts > vector(int) ? vector(short) : 0 but the C++ frontend rejects this > (I think OpenCL is fine with this). OpenCL says the conditional > op is equivalent to select(exp3,exp2,exp1) which is defined as > result[i] = if MSB of c[i] is set ? b[i] : a[i], with no restriction > on the conditional. I think we require that sizes match because that's natural considering how it is lowered (bitwise blending of comparison mask with op2/op3). Note that in Clang ext_vector_type has OpenCL semantics for c?a:b (taking the MSB of 'c') while vector_size has GNU semantics ('c' is compared with zero). Thanks. Alexander