Hello.

As discussed in [1], I would like to change code emission from:

    D.3428 = (*array)[0];
    D.3429 = (*array)[1];
    i = D.3428;
    if (i <= D.3429)
      {
        while (1)
          {
            {
              logical(kind=4) D.3432;

              (*block)[(integer(kind=8)) i + -1] = (*block)[(integer(kind=8)) i 
+ -1] + 10;
              L.1:;
              D.3432 = i == D.3429;
              i = i + 1;
              if (D.3432) goto L.2;
            }
          }
      }
    L.2:;

to:

    D.3428 = (*array)[0];
    D.3429 = (*array)[1];
    i = D.3428;
    while (1)
      {
        {
          logical(kind=4) D.3432;

          D.3432 = i > D.3429;
          if (D.3432) goto L.2;
          (*block)[(integer(kind=8)) i + -1] = (*block)[(integer(kind=8)) i + 
-1] + 10;
          L.1:;
          i = i + 1;
        }
      }
    L.2:;

Following changes quite significantly improves exchange_2 benchmark (part of 
CPUv6),
where it runs 6% faster. The patchset consists of 2 patches:

a)  Add PRED_FORTRAN_LOOP_PREHEADER to DO loops with step bigger than +-1.

  1) I converted predict-[12].f90 tests to use a different step than 1
  2) I noticed that a generic DO loop code emission misses expect 
PRED_FORTRAN_LOOP_PREHEADER, thus I added that.

b)  Optimize fortran loops with +-1 step.

  1) We generate the c-style loop.
  2) New warning Wundefined-do-loop is added.
  3) Couple of tests which hit the undefined behavior are removed.
  4) New tests that cover the undefined behavior are introduced.

The patchset survives regression tests and bootstraps on x86_64-linux-gnu and
I've been running CPU2006 benchmarks to hit a possible speed-up/regression.

Martin

[1] https://gcc.gnu.org/ml/fortran/2016-06/msg00122.html

 gcc/fortran/lang.opt                         |   4 +
 gcc/fortran/resolve.c                        |  23 +++++
 gcc/fortran/trans-stmt.c                     | 123 ++++++++++++++-------------
 gcc/testsuite/gfortran.dg/do_1.f90           |   6 --
 gcc/testsuite/gfortran.dg/do_3.F90           |   2 -
 gcc/testsuite/gfortran.dg/do_check_11.f90    |  12 +++
 gcc/testsuite/gfortran.dg/do_check_12.f90    |  12 +++
 gcc/testsuite/gfortran.dg/do_corner_warn.f90 |  22 +++++
 gcc/testsuite/gfortran.dg/ldist-1.f90        |   2 +-
 gcc/testsuite/gfortran.dg/pr48636.f90        |   2 +-
 gcc/testsuite/gfortran.dg/predict-1.f90      |   9 +-
 gcc/testsuite/gfortran.dg/predict-2.f90      |   6 +-
 12 files changed, 150 insertions(+), 73 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/do_check_11.f90
 create mode 100644 gcc/testsuite/gfortran.dg/do_check_12.f90
 create mode 100644 gcc/testsuite/gfortran.dg/do_corner_warn.f90

-- 
2.8.4

Reply via email to