This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch, libgfortran] PR53029 missed optimization in internal read (without implied-do-loop)
- From: Manfred Schwarb <manfred99 at gmx dot ch>
- To: Jerry DeLisle <jvdelisle at charter dot net>, "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 29 May 2017 16:06:35 +0200
- Subject: Re: [patch, libgfortran] PR53029 missed optimization in internal read (without implied-do-loop)
- Authentication-results: sourceware.org; auth=none
- References: <bce47860-bff0-7120-5842-9a7652fd4d24@charter.net>
Am 29.05.2017 um 01:16 schrieb Jerry DeLisle:
> 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.
>
Seems to work as advertised.
With this small patch, I see a tremendous speedup for array reads.
The implied-do variant gets slightly slower (~10%), but the
array variant now takes 0.002s independent of the size of "m",
compared to some dozens of seconds without this patch!
Concerning your test case:
Your timeout of 2s is dangerously close to the timings of really fast
boxes without this patch, so I would lower this value.
I guess even on really slow ARM boxes or some-such this test case finishes
in some few tenth of seconds, at worst.
Or, as the new behavior seems to be independent of the m setting,
just bump the constant m by a factor 10 or 100. So you are sure no big iron
can pass this test without your patch being applied.
Thanks a bunch!
Manfred
> 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.