[OT] The Usual Arithmetic Confusions

Walter Bright newshound2 at digitalmars.com
Sat Feb 5 08:58:52 UTC 2022


On 2/4/2022 6:35 PM, Siarhei Siamashka wrote:
> On Friday, 4 February 2022 at 23:45:31 UTC, Walter Bright wrote:
>> On 2/4/2022 2:18 PM, Siarhei Siamashka wrote:
>>> If we want D language to be SIMD friendly, then discouraging the use of 
>>> `short` and `byte` types for local variables isn't the best idea.
>>
>> SIMD is its own world, and why D has vector types as a core language feature. 
>> I never had much faith in autovectorization.
> 
> I don't have much faith in autovectorization quality either, but this feature is 
> provided by free by GCC and LLVM backends. And right now excessively paranoid 
> errors about byte/short variables coerce the users into one of these two 
> unattractive alternatives:
> 
>   * litter the code with ugly casts
>   * change types of temporary variables to ints and waste some vectorization 
> opportunities

Generally one should use the vector types rather than relying on 
autovectorization. One of the problems with autovectorization is never knowing 
that some minor change you made prevented vectorizing.


> When the signal/noise ratio is bad, then it's natural that the users start 
> ignoring error messages. Beginners are effectively trained to apply casts 
> without thinking just to shut up the annoying compiler and it leads to 
> situations like this: 
> https://forum.dlang.org/thread/uqeobimtzhuyhvjpvkvz@forum.dlang.org

That has nothing to do with integers.


> Is see VRP as just a band-aid, which helps very little, but causes a lot of 
> inconveniences.

Certainly allowing implicit conversions of ints to shorts is *convenient*. But 
you cannot have that *and* safe integer math.

As I mentioned repeatedly, there is no solution that is fast, convenient, and 
doesn't hide mistakes.


> My suggestion:
> 
>   1. Implement `wrapping_add`, `wrapping_sub`, `wrapping_mul` intrinsics similar 
> to Rust, this is easy and costs nothing.
>   2. Implement an experimental `-ftrapv` option in one of the D compilers (most 
> likely GDC or LDC) to catch both signed and unsigned overflows at runtime. Or 
> maybe add function attributes to enable/disable this functionality with a more 
> fine grained control. Yes, I know that this violates the current D language 
> spec, which requires two's complement wraparound for everything, but it doesn't 
> matter for a fancy experimental option.
>   3. Run some tests with `-ftrapv` and check how many arithmetic overflows are 
> actually triggered in Phobos. Replace the affected arithmetic operators with 
> intrinsics if the wrapping behavior is actually intended.
>   4. In the long run consider updating the language spec.
> 
> Benefits: even if `-ftrapv` turns out to have a high overhead, this would still 
> become a useful tool for testing arithmetic overflows safety in applications. 
> Having something is better than having nothing.



More information about the Digitalmars-d mailing list