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
This commit is contained in:
parent
8b9a5b5e0e
commit
bf9197df81
@ -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.
|
||||
|
@ -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}
|
||||
|
@ -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. */
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -17,7 +17,11 @@ CONTAINS
|
||||
|
||||
logical function cp_logger_log(logger)
|
||||
TYPE(cp_logger_type), POINTER ::logger
|
||||
cp_logger_log = associated (logger) .and. (logger%a .eq. 42)
|
||||
if (associated (logger)) then
|
||||
cp_logger_log = (logger%a .eq. 42)
|
||||
else
|
||||
cp_logger_log = .false.
|
||||
end if
|
||||
END function
|
||||
|
||||
FUNCTION cp_get_default_logger(v) RESULT(res)
|
||||
|
@ -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.
|
||||
|
||||
|
28
gcc/testsuite/gfortran.dg/short_circuiting_2.f90
Normal file
28
gcc/testsuite/gfortran.dg/short_circuiting_2.f90
Normal file
@ -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
|
28
gcc/testsuite/gfortran.dg/short_circuiting_3.f90
Normal file
28
gcc/testsuite/gfortran.dg/short_circuiting_3.f90
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user