+2018-08-10 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/57160
+ * invoke.texi (frontend-optimize): Mention short-circuiting.
+ * options.c (gfc_post_options): Disable -ffrontend-optimize with -Og.
+ * resolve.c (resolve_operator): Warn about short-circuiting only with
+ -ffrontend-optimize.
+ * trans-expr.c (gfc_conv_expr_op): Use short-circuiting operators only
+ with -ffrontend-optimize. Without that flag, make sure that both
+ operands are evaluated.
+
2018-08-08 Nathan Sidwell <nathan@acm.org>
* cpp.c (cb_file_change): Use linemap_included_from.
@opindex @code{frontend-optimize}
@cindex Front-end optimization
This option performs front-end optimization, based on manipulating
-parts the Fortran parse tree. Enabled by default by any @option{-O}
-option. Optimizations enabled by this option include inlining calls
-to @code{MATMUL}, elimination of identical function calls within
-expressions, removing unnecessary calls to @code{TRIM} in comparisons
-and assignments and replacing @code{TRIM(a)} with
-@code{a(1:LEN_TRIM(a))}. It can be deselected by specifying
-@option{-fno-frontend-optimize}.
+parts the Fortran parse tree. Enabled by default by any @option{-O} option
+except @option{-O0} and @option{-Og}. Optimizations enabled by this option
+include:
+@itemize @bullet
+@item inlining calls to @code{MATMUL},
+@item elimination of identical function calls within expressions,
+@item removing unnecessary calls to @code{TRIM} in comparisons and assignments,
+@item replacing @code{TRIM(a)} with @code{a(1:LEN_TRIM(a))} and
+@item short-circuiting of logical operators (@code{.AND.} and @code{.OR.}).
+@end itemize
+It can be deselected by specifying @option{-fno-frontend-optimize}.
@item -ffrontend-loop-interchange
@opindex @code{frontend-loop-interchange}
specified it directly. */
if (flag_frontend_optimize == -1)
- flag_frontend_optimize = optimize;
+ flag_frontend_optimize = optimize && !optimize_debug;
/* Same for front end loop interchange. */
else if (op2->ts.kind < e->ts.kind)
gfc_convert_type (op2, &e->ts, 2);
- if (e->value.op.op == INTRINSIC_AND || e->value.op.op == INTRINSIC_OR)
+ if (flag_frontend_optimize &&
+ (e->value.op.op == INTRINSIC_AND || e->value.op.op == INTRINSIC_OR))
{
/* Warn about short-circuiting
with impure function as second operand. */
return;
case INTRINSIC_AND:
- code = TRUTH_ANDIF_EXPR;
+ code = flag_frontend_optimize ? TRUTH_ANDIF_EXPR : TRUTH_AND_EXPR;
lop = 1;
break;
case INTRINSIC_OR:
- code = TRUTH_ORIF_EXPR;
+ code = flag_frontend_optimize ? TRUTH_ORIF_EXPR : TRUTH_OR_EXPR;
lop = 1;
break;
+2018-08-10 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/57160
+ * gfortran.dg/actual_pointer_function_1.f90: Fix invalid test case.
+ * gfortran.dg/inline_matmul_23.f90: Add option "-ffrontend-optimize".
+ * gfortran.dg/short_circuiting_2.f90: New test case.
+ * gfortran.dg/short_circuiting_3.f90: New test case.
+
2018-08-10 Alexander Monakov <amonakov@ispras.ru>
PR target/82418
\r
logical function cp_logger_log(logger)\r
TYPE(cp_logger_type), POINTER ::logger\r
- cp_logger_log = associated (logger) .and. (logger%a .eq. 42)\r
+ if (associated (logger)) then\r
+ cp_logger_log = (logger%a .eq. 42)\r
+ else\r
+ cp_logger_log = .false.\r
+ end if\r
END function\r
\r
FUNCTION cp_get_default_logger(v) RESULT(res)\r
! { dg-do compile }
-! { dg-options "-Og -fcheck=bounds -fdump-tree-optimized" }
+! { dg-options "-Og -ffrontend-optimize -fcheck=bounds -fdump-tree-optimized" }
! Check that bounds checking is done only before the matrix
! multiplication.
--- /dev/null
+! { dg-do run }
+! { dg-options "-O0" }
+!
+! PR 57160: short-circuit IF only with -ffrontend-optimize
+!
+! this checks that short-circuiting is not done with -O0
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+program short_circuit
+
+ integer, save :: i = 0
+ logical :: flag
+
+ flag = .false.
+ flag = check() .and. flag
+ flag = flag .and. check()
+
+ if (i /= 2) stop 1
+
+contains
+
+ logical function check()
+ i = i + 1
+ check = .true.
+ end function
+
+end
--- /dev/null
+! { dg-do run }
+! { dg-options "-O3" }
+!
+! PR 57160: short-circuit IF only with -ffrontend-optimize
+!
+! this checks that short-circuiting is done with -O3
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+program short_circuit
+
+ integer, save :: i = 0
+ logical :: flag
+
+ flag = .false.
+ flag = check() .and. flag
+ flag = flag .and. check()
+
+ if (i /= 1) stop 1
+
+contains
+
+ logical function check()
+ i = i + 1
+ check = .true.
+ end function
+
+end