PR40011 -fwhole-file problems
Tobias Schlüter
tobias.schlueter@physik.uni-muenchen.de
Wed Jun 3 03:23:00 GMT 2009
Hi,
Paul Richard Thomas wrote:
> gfortran.dg/default_initialization_3.f90 fails at runtime at -O2. I
> have reduced it to expose the problem:
...
> Which looks fine. At -O2, however, we get:
>
> func (integer(kind=4) & ivalue, struct myint & retval1, struct myint & retval2)
> {
> static struct myint foo2 = {.bar=77};
>
> <bb 2>:
> retval1_1(D)->bar = 42;
> *retval2_2(D) = foo2;
> foo2.bar = 999;
> return;
>
> }
>
>
> ;; Function other (other_)
>
> other ()
> {
> static struct myint foo2 = {.bar=77};
> static struct myint foo2 = {.bar=77};
> static struct myint foo2 = {.bar=77};
This is the issue, apparently the optimizer can't handle inlining
functions with static variables (SAVE in Fortran). I verified with a C
example that indeed functions with static variables are not inlined if
they're called more than once.
Example below.
Cheers & HTH,
- Tobi
extern int printf(const char*, ...);
static int x()
{
static int i = 0;
return i++;
}
static int y()
{
int i = 2;
return i;
}
int z()
{
if (x())
printf("a");
if (y())
printf("b");
if (x())
printf("c");
}
from the optimized dump:
<bb 0>:
D.1472 = x ();
if (D.1472 != 0) goto <L0>; else goto <L1>;
<L0>:;
printf (&"a"[0]);
<L1>:;
printf (&"b"[0]);
D.1474 = x ();
if (D.1474 != 0) goto <L5>; else goto <L6>;
<L5>:;
printf (&"c"[0]) [tail call];
More information about the Fortran
mailing list