aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2018-08-10 16:08:53 +0200
committerJanus Weil <janus@gcc.gnu.org>2018-08-10 16:08:53 +0200
commitbf9197df810b0b0ac032c7e480d5a8b24c22f973 (patch)
tree11d80fa0ccfd814b4d9c2e52533951c7081beb60 /gcc/fortran
parent8b9a5b5e0e1c69cd97f56c732cdb8a96c92baabe (diff)
downloadgcc-bf9197df810b0b0ac032c7e480d5a8b24c22f973.zip
gcc-bf9197df810b0b0ac032c7e480d5a8b24c22f973.tar.gz
gcc-bf9197df810b0b0ac032c7e480d5a8b24c22f973.tar.bz2
re PR fortran/57160 (short-circuit IF only with -ffrontend-optimize)
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
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog11
-rw-r--r--gcc/fortran/invoke.texi18
-rw-r--r--gcc/fortran/options.c2
-rw-r--r--gcc/fortran/resolve.c3
-rw-r--r--gcc/fortran/trans-expr.c4
5 files changed, 27 insertions, 11 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7051509..26ff784 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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.
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 093864b..ee84a0b 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -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}
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index af93751..e8db54d4 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -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. */
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 3035e02..16146e6 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -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. */
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index dfc44f7..54e318e 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -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;