Re: mmc: atmel-mci: Reduce scope for the variable “slot” in atmci_request_end()
From: Joe Perches
Date: Sat Dec 12 2020 - 04:57:17 EST
On Fri, 2020-12-11 at 09:03 +0100, Alexandre Belloni wrote:
> On 11/12/2020 07:34:41+0100, Markus Elfring wrote:
> > > > How do you think about a patch like “staging: speakup: remove redundant initialization
> > > > of pointer p_key” for comparison?
> > > > https://lore.kernel.org/patchwork/patch/1199128/
> > > > https://lore.kernel.org/driverdev-devel/20200223153954.420731-1-colin.king@xxxxxxxxxxxxx/
> > > >
> > > > Would you tolerate to omit the initialisation for the variable “slot”?
> > >
> > > If you were able to provide one good technical reason.
> >
> > I find that the positions of variable definitions (and similar assignments) influence
> > the generation of executable code.
> >
> And you are wrong, it doesn't.
I rarely reply or read any Markus' emails as everything
from Markus goes into a 'don't read' folder but I was cc'd
directly on one from someone else recently so I think I
should reply to this one too.
In this case Alexandre it seems true, but in the generic case
it may be false. It may depend on stack size and location.
For instance, with large structs declared either at the top
of a function or in separate branches within the function:
$ cat t_structs.c
struct a {
int a[2000];
int b[4000];
};
struct b {
char a[100];
char b[10000];
};
void foo1(struct a *a);
void foo2(struct b *b);
void foo(int index)
{
if (index) {
struct a ai = {};
ai.a[index] = index;
foo1(&ai);
} else {
struct b bi = {};
bi.b[0] = 1;
foo2(&bi);
}
}
void bar(int index)
{
struct a ai = {};
struct b bi = {};
if (index) {
ai.a[index] = index;
foo1(&ai);
} else {
bi.b[0] = 1;
foo2(&bi);
}
}
$
newer gcc versions are smart enough to minimize
stack use in foo() but not bar() so ai and bi start
at the same address in foo() so the total stack
used is smaller.
older gcc versions like 4.8 use separate addresses
for ai and bi in foo() so the total stack used is
larger.
$ gcc-4.8 -Wframe-larger-than=1000 -c t_structs.c
t_structs.c: In function ‘foo’:
t_structs.c:27:1: warning: the frame size of 34116 bytes is larger than 1000 bytes [-Wframe-larger-than=]
}
^
t_structs.c: In function ‘bar’:
t_structs.c:41:1: warning: the frame size of 34116 bytes is larger than 1000 bytes [-Wframe-larger-than=]
}
^
$ gcc-5 -Wframe-larger-than=1000 -c t_structs.c
t_structs.c: In function ‘foo’:
t_structs.c:27:1: warning: the frame size of 24032 bytes is larger than 1000 bytes [-Wframe-larger-than=]
}
^
t_structs.c: In function ‘bar’:
t_structs.c:41:1: warning: the frame size of 34144 bytes is larger than 1000 bytes [-Wframe-larger-than=]
}
^