On Friday, 2 June 2023 09:49:26 CEST Alexander Monakov wrote: > > simd<int> x = ...; > > bool t = all_of(x < x + 1); // unconditionally true or not? > > > > I'd expect t to be unconditionally true. Because simd<int> simply is a > > data- parallel version of int. > > Okay, I see opinions will vary here. I was thinking about our immintrin.h > which is partially implemented in terms of generic vectors. Imagine we > extend UBSan to trap on signed overflow for vector types. I expect that > will blow up on existing code that uses Intel intrinsics.
_mm_add_epi32 is already implemented via __v4su addition (i.e. unsigned). So the intrinsic would continue to wrap on signed overflow. > > > Revised patch below. > > > > This can be considered a breaking change. Does it need a mention in the > > release notes? > > I'm not sure what you consider a breaking change here. Is that the implied > threat to use undefinedness for range deduction and other optimizations? Consider the stdx::simd implementation. It currently follows semantics of the builtin types. So simd<char> can be shifted by 30 without UB. The implementation of the shift operator depends on the current behavior, even if it is target-dependent. For PPC the simd implementation adds extra code to avoid the "UB". With nailing down shifts > sizeof(T) as UB this extra code now needs to be added for all targets. - Matthias -- ────────────────────────────────────────────────────────────────────────── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtz Centre for Heavy Ion Research https://gsi.de stdₓ::simd ──────────────────────────────────────────────────────────────────────────