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