checkedint call removal

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Mon Jul 28 14:58:10 PDT 2014


On 7/28/2014 1:42 AM, bearophile wrote:
> void main() {
>      import std.stdio, core.checkedint;
>
>      ubyte x = 100;
>      ubyte y = 200;
>
>      bool overflow = false;
>      immutable result = muls(x, y, overflow);
>      assert(!overflow);
>      writeln("Product: ", result);
> }
>
>
> Here I am not willing to add an assume(). Here at the call point of muls() x and
> y have a full range of ubytes, so the range analysis tell the compiler their
> product will not overflow, so it can replace the muls() with a regular product
> and leave overflow untouched. This is faster.

Here there are no new language features required. muls() being an intrinsic 
means the compiler knows about it. The compiler already does data flow analysis 
on constants, meaning it knows that x is 100, and will replace subsequent 
instances of x with 100. This is called "constant propagation", and has been a 
standard feature of compilers for 30 years.

Some optimizers (not including dmd's) go further with this data flow analysis 
and do ranges. assert()s are mined by the optimizer for information about 
ranges. ('assume' adds absolutely nothing here.) With this, since the compiler 
knows about muls(), it can optimize it.

The point being:

     NO NEW LANGUAGE FEATURES ARE NECESSARY

bearophile, I know you are interested in these sorts of things, but you are 
unaware of routine data flow analysis that compilers have done for decades. I 
strongly recommend you pick up a compiler book like "Compilers Principles 
Techniques and Tools" and thumb through the optimization section. I think you'll 
find it enjoyable and useful.



More information about the Digitalmars-d mailing list