re PR fortran/57160 (short-circuit IF only with -ffrontend-optimize)
authorJanus Weil <janus@gcc.gnu.org>
Fri, 10 Aug 2018 14:08:53 +0000 (16:08 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Fri, 10 Aug 2018 14:08:53 +0000 (16:08 +0200)
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-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.

From-SVN: r263471

gcc/fortran/ChangeLog
gcc/fortran/invoke.texi
gcc/fortran/options.c
gcc/fortran/resolve.c
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/actual_pointer_function_1.f90
gcc/testsuite/gfortran.dg/inline_matmul_23.f90
gcc/testsuite/gfortran.dg/short_circuiting_2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/short_circuiting_3.f90 [new file with mode: 0644]

index 7051509..26ff784 100644 (file)
@@ -1,3 +1,14 @@
+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.
index 093864b..ee84a0b 100644 (file)
@@ -1793,13 +1793,17 @@ if @option{-ffrontend-optimize} is in effect.
 @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}
index af93751..e8db54d 100644 (file)
@@ -417,7 +417,7 @@ gfc_post_options (const char **pfilename)
      specified it directly.  */
 
   if (flag_frontend_optimize == -1)
-    flag_frontend_optimize = optimize;
+    flag_frontend_optimize = optimize && !optimize_debug;
 
   /* Same for front end loop interchange.  */
 
index 3035e02..16146e6 100644 (file)
@@ -3982,7 +3982,8 @@ resolve_operator (gfc_expr *e)
          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.  */
index dfc44f7..54e318e 100644 (file)
@@ -3348,12 +3348,12 @@ gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
       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;
 
index 174137e..ffa2035 100644 (file)
@@ -1,3 +1,11 @@
+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
index 01213fd..ecb5cbb 100644 (file)
@@ -17,7 +17,11 @@ CONTAINS
 \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
index 05633bc..bb7e868 100644 (file)
@@ -1,5 +1,5 @@
 ! { 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.
 
diff --git a/gcc/testsuite/gfortran.dg/short_circuiting_2.f90 b/gcc/testsuite/gfortran.dg/short_circuiting_2.f90
new file mode 100644 (file)
index 0000000..765c8e7
--- /dev/null
@@ -0,0 +1,28 @@
+! { 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
diff --git a/gcc/testsuite/gfortran.dg/short_circuiting_3.f90 b/gcc/testsuite/gfortran.dg/short_circuiting_3.f90
new file mode 100644 (file)
index 0000000..069f3f8
--- /dev/null
@@ -0,0 +1,28 @@
+! { 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