Re: Can D optimize?

2019-06-09 Thread Johan Engelen via Digitalmars-d-learn

On Sunday, 9 June 2019 at 05:24:56 UTC, Amex wrote:

Can dmd or ldc optimize the following cases:

foo(int x)
{
   if (x > 10 && x < 100) bar1; else bar2;
}


...

for(int i = 23; i < 55; i++)
   foo(i); // equivalent to calling bar1(i)

clearly i is within the range of the if in foo and so the 
checks are unnecessary.


This is a simple case of inlining for the optimizer, so works out 
well with LDC and GDC:

https://d.godbolt.org/z/pLy8Yy

-Johan



Can D optimize?

2019-06-08 Thread Amex via Digitalmars-d-learn

Can dmd or ldc optimize the following cases:

foo(int x)
{
   if (x > 10 && x < 100) bar1; else bar2;
}


...

for(int i = 23; i < 55; i++)
   foo(i); // equivalent to calling bar1(i)

clearly i is within the range of the if in foo and so the checks 
are unnecessary.


I realize that this is generally a complex and possibly 
unsolvable problem... but in the example above, which comes up 
enough, it is not.


Many times when one iterates over an array the boundaries cause 
special cases... for maximum performance one has to break up the 
boundary cases which just increases code complexity and 
verbosity.  If the compiler can figure it out automatically then 
it is unnecessary.


When working with algorithms

Of course, if the limits are not known at compile time this 
method cannot be used...



So, I'm wondering if there is a simple way to achieve the same 
thing that is easy on the eyes.


Suppose we have a resampling function. The boundaries require 
different functionality.


So there are effectively 3 functions and the loop over the data 
would be split up in to three parts. Normally we have to do it by 
hand and maintain everything.


I imagine ranges might be able to help solve this in an optimal 
way but I'm not sure what might be the best approach. It should 
be equivalent to hand written code if not better.