Hi Tobias,

I have not yet looked at the patch, but I wonder whether that causes
invalid code for
   if (any([a,b,c] < f()))
by evaluating f() multiple times.

This is avoided by this part of the patch:

+  if (op2->expr_type == EXPR_CONSTANT)
+    scalar = gfc_copy_expr (op2);
+  else
+    scalar = create_var (gfc_copy_expr (op2));

which results in code like this:

    __var_1 = f ();
    if ((a > __var_1 || b > __var_1) || c > __var_1)
      {
        {

Another question is: Why do we generate a temporary array for ANY/ALL?

The straightforward way of evaluating

   if (any([a,b,c] > 0.)) then

is to

- create a temporary array [a,b,c]
- to create a second logical array and fill it with the
  logical expressions,
- call a library function for ANY on it.

This was the original code and was not really efficient ;-)

Since Mikael's patch some time ago, we

- create a temporary array [a,b,c]
- loop over it, exiting early if a true value was found

With this patch (and my previous patch, which is already in),
with front-end optimization enabled, we now

- convert the expression into if (any[a>0, b>0, c>0])
- convert this into a>0 || b>0 || c>0 (effect of my previous patch)

A
scalar should be sufficient, i.e.

res = .false.
do i = 1, n
   res = res .or. (array(i) < eps)
end do
if (res)

We have been doing that since Mikael's patch some years ago.

Regards

        Thomas

Reply via email to