public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jerry DeLisle <jvdelisle@charter.net>
To: "fortran@gcc.gnu.org" <fortran@gcc.gnu.org>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>
Subject: [patch, libgfortran] PR53029 missed optimization in internal read (without implied-do-loop)
Date: Mon, 29 May 2017 04:27:00 -0000	[thread overview]
Message-ID: <bce47860-bff0-7120-5842-9a7652fd4d24@charter.net> (raw)

[-- Attachment #1: Type: text/plain, Size: 1002 bytes --]

Hi all,

The problem here is that we never set the err return to LIBERROR_END in all 
cases. For the example case we are detecting the EOF condition inside the 
read_integer procedure and it gets acted on correctly at higher levels in the 
code. Consequently in the big loop over the array where we call 
list_formatted_read_scalar, we never returned an error code so we never exited 
the loop early.

The patch tests for the EOF first locally as before, but then returns the error 
flags set in dtp->common.flags which are set globally in the individual read 
procedures whene hit_eof is called.

Regression tested on x86_64. I have added a test case which will check the 
execution time of the loop. The previous results of the REAd were correct, just 
took a long time on large arrays.

OK for trunk?

Regards,

Jerry

2017-05-28  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libgfortran/35339
	* list_read.c.c (list_formatted_read_scala): Set the err return
	value to the common.flags error values.

[-- Attachment #2: pr35339.diff --]
[-- Type: text/x-patch, Size: 784 bytes --]

diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index 6c00d11b..b6cd6670 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -2298,11 +2298,16 @@ list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p,
     free_saved (dtp);
 
 cleanup:
+  /* err may have been set above from finish_separator, so if it is set
+     trigger the hit_eof. The hit_eof will set bits in common.flags.  */
   if (err == LIBERROR_END)
     {
       free_line (dtp);
       hit_eof (dtp);
     }
+  /* Now we check common.flags for any errors that could have occurred in
+     a READ elsewhere such as in read_integer.  */
+  err = dtp->common.flags & IOPARM_LIBRETURN_MASK;
   fbuf_flush_list (dtp->u.p.current_unit, LIST_READING);
   return err;
 }

[-- Attachment #3: read_5.f90 --]
[-- Type: text/x-fortran, Size: 669 bytes --]

! { dg-do run }
! PR35339 Missed optimization, this test case took several seconds to
      program internalread
      implicit none
      integer m
      parameter(m=1000000)
      character value*10
      character(80) :: result
      integer i,j,intvalues(m)
      real :: start, finish
      intvalues = 33
      call cpu_time(start)
      do j=1,100
        write(value,'(i3,a5)') j," 5 69"
        read(value,*,end=20) intvalues
   20   write(result,*) (intvalues(i),i=2,4)
      if (result.ne.('           5          69          33')) call abort
      call cpu_time(finish)
      if ((finish-start).gt. 2.0) call abort
      enddo
      end program internalread

             reply	other threads:[~2017-05-28 23:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-29  4:27 Jerry DeLisle [this message]
2017-05-29 14:13 ` Manfred Schwarb
2017-05-29 16:53 ` Thomas Koenig
2017-05-29 19:44   ` Jerry DeLisle

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bce47860-bff0-7120-5842-9a7652fd4d24@charter.net \
    --to=jvdelisle@charter.net \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).