checkedint call removal
via Digitalmars-d
digitalmars-d at puremagic.com
Tue Jul 29 02:40:25 PDT 2014
On Monday, 28 July 2014 at 15:52:23 UTC, John Colvin wrote:
> On Monday, 28 July 2014 at 15:20:44 UTC, Ola Fosheim Grøstad
> wrote:
>> If asserts were used as optimization constraints
>
> all available code is fair game as optimisation constraints.
> What you are asking for is a special case for `assert` such
> that the optimiser is blind to it.
>
> bool foo(int a)
> {
> //let's handwrite a simple assert
> if(a >= 0)
> {
> exit(EXIT_FAILURE);
> }
> //and then do something.
> return a < 0;
> }
>
> Of course the compiler is free to rewrite that as
>
> bool foo(int a)
> {
> if(a >= 0)
> {
> exit(EXIT_FAILURE);
> }
> return true;
> }
>
> Why should the situation be different if I use the builtin
> `assert` instead?
The problem is that in release mode, the asserts are removed. It
would then be a very big mistake to still take them into account
for optimizations, as if they were actually there.
To take your code:
assert(a >= 0);
return a < 0;
is equivalent to
assert(a >= 0);
return true;
but only in non-release mode. In release mode, this effectively
becomes
return a < 0;
which is _not_ equivalent to
return true;
I believe this is was Ola is protesting about, and I agree with
him. Such optimizations must only happen if the check stays.
More information about the Digitalmars-d
mailing list