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 <jvdeli...@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.