Dominique Dhumieres wrote:
(1) Is there any hint of -fno-whole-file misbehavior (as suggested by the
second point of the "Reasoning")?
The middle end is simply not prepared for having multiple declaration
for a single file ("translation unit"), which leads to wrong
optimizations and thus to wrong code.
I think the bug which triggeded my decision to fix all remaining known
-fno-whole-file issues and then to enable it by default was PR 44945.
See also http://gcc.gnu.org/ml/fortran/2010-07/msg00321.html
But there are surely more. Using multiple declarations was simply a
design bug in the original implementation of gfortran, which was only
realized rather late - and then deferred. Paul was that brave to fix
this by implementing -fwhole-file.
As said in my comment below, if the answer is yes, then IMO this should be
investigated and fixed before removal.
We did the investigation when switching to -fwhole-file by default. And
no, I do not want to investigate why the middle end "misbehaves" with
multiple declarations in a single translation unit - nor do I want to
fix it. I am content if everything works with -fwhole-file. There is
really not any advantage of having multiple declarations in a single TU.
(2) Is the -fwhole-file status ZKB (zero known bug)?
I am not 100% confident that this the case (see at least PR 45128).
I am not aware of any bug since 4.6. I am rather certain that we fixed
all known bugs in this area. Neither having remaining mult-decls nor
issues which wouldn't occur with -fno-whole-file. By now it simply makes
more sense to fix a bug, ignoring whether it worked by chance with
-fno-whole-file or not. All recent regressions seem to be unrelated.
Thus, for users it makes more sense to use an older version or wait for
the patch than to try -fno-while-file. Given the potential to generate
wrong-code bugs, I wouldn't trust -fno-whole-file for any code which
goes beyond a hello-world example.
PR45128 requires the new array descriptor; we have a kludge which allows
sub-type pointer in some cases. Seemingly, that kludge works in one case
with -fno-whole-file where it fails with -fwhole-file. But I will
actively ignore all subpointer PRs until the new array descriptor is
ready, which will be the right fix.
(3) What is the confidence that there is no rampant bug in -fwhole-file?
Well, even if there is a bug which doesn't affect -fno-whole-file, using
-fno-whole-file is no solution, given that -fno-whole-file has many
known bugs.
And while I am willing to fix -fwhole-file bugs, I will ignore any
-fno-whole-file ones.
(4) Is there an easy replacement for -fno-whole-file?
Yes: -fwhole-file :-) Really, you shouldn't think of -fno-whole-file
anymore.
Here the answer is clearly yes: put the different TUs in different files.
Or doing that ;-)
My understanding of -fno-whole-file as well as -fno-realloc-lhs,
-fno-frontend-optimize, or any of the -fno-* options is two fold:
(i) to provide a workaround to user hit by a bug in the corresponding area,
(ii) to help the maintainers to locate the bug or to change the default in
case of a too severe bug.
Well, the main point of -fno-realloc-lhs is to disable the performance
penalty of RHS. That is also helped to find some bugs was a side effect.
For -fno-frontend-optimize I agree that its purpose was indeed to toggle
the optimization separately from only using -O0 vs -O1.
But there is a difference between -frealloc-lhs, -ffrontend-optimize and
-fwhole-file: The former two enable a specific feature or optimization
and valid programs can (should) be produced with either version. By
contrast, in terms of middle-end assumptions -fno-whole-file is always
wrong.
I think (ii) does not really apply. We never changed the defaults when a
serious bug popped up, we always fixed it. [Though we might have
suggested a command-line option as workaround, cf. (i).] For
-fno-whole-file, it also didn't help much with localizing the bug. For
-f(no-)frontend-optimize I agree that it helped several times to isolate
the bug.
* There are many wrong-code issues and probably also some ICEs with
-fno-whole file.
I think the wording is misleading. I have checked bugzilla for open PR
containing -fno-whole-file and I have found only 2 (48939 and 52621).
None of them are related to wrong-code issue due to -fno-whole-file.
You have to search for mult-decl issues. -fwhole-file was the cure of
that problem; as it had a couple of issues before July 2010 and wasn't
enabled by default, almost no one used it. Hence, you don't find it in
the log. And after -fwhole-file became the default, no one cared anymore
about issues which occurred only with -fno-whole-file.
My understanding of the -fno-whole-file option is that it is (should be)
strictly equivalent to put all the TUs in separate files. If it exists an
example for which this is not true, I think it would be a bug
But that's not how the middle end works. It expects that in a single
file (translation unit), no multiple declarations for the same object exist.
We do not want to change the middle end. Besides, having a single decl
per object allows for inlining and similar optimization. There is simply
no reason for -fno-whole-file except that gfortran until 4.5 had it by
default.
In principle, we could have done the switch without adding
-f(no-)whole-file; having the flag was only useful because: (i) It
allowed Paul to sensible put the patch into the trunk even though it was
not yet completely working. (ii) It allowed to find out that PR44945 was
only failing with -fno-whole-file. (iii) Mainly in 2010-07, it made it
easier to find regressions in -fwhole-file. After 2010-07, most issues
were solved, rendering -f(no-)whole-file less useful.
* The generated code of -fwhole-file is faster as it allows for inlining.
This has nothing to do with the removal of -fno-whole-file.
No but with the addition of -fwhole-file. Without, inlining was
essentially not possible.
AFAICT most of the speeddup is achieved with -fwhole-program.
But that only works with a single file/TU, unless you use LTO.
Additionally, -flto and -fwhole-program both enable -fwhole-file. Due to
the multiple declarations issue, -fno-whole-file -fwhole-program would
optimize many procedures away, which were actually used - leading to
linking errors.
OK, but no time table has been released so far.
In terms of the bugs, I was even considering to remove it for 4.6. I
think by 2010-08 we had fixed nearly all -fwhole-file specific bugs -
and no one wanted to go back to -fno-whole-file.
Compiling PR 45128 with -fwhole-file gives an ICE: Segmentation fault,
while with -fno-whole-file it gives a linking error Undefined symbols:
"_span.0", referenced from: ... as it does if the two TUs are put is
different files. Dominique
As said above: I will actively ignore subpointer bugs! Actually, before
I thought that -fno-whole-file worked for that file, but as the linker
error indicates, -fno-whole-file also doesn't work!
Tobias