This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/82365] stack locations are consolidated if noreturn function is on the path
- From: "pinskia at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sat, 30 Sep 2017 21:49:12 +0000
- Subject: [Bug middle-end/82365] stack locations are consolidated if noreturn function is on the path
- Auto-submitted: auto-generated
- References: <bug-82365-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82365
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |missed-optimization
Status|UNCONFIRMED |NEW
Last reconfirmed| |2017-09-30
Component|other |middle-end
Summary|excessive stack usage with |stack locations are
|norreturn attribute |consolidated if noreturn
| |function is on the path
Ever confirmed|0 |1
Severity|normal |enhancement
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
here is a reduced testcase to show the issue a lot better:
#define __noreturn __attribute__((noreturn))
struct i2c_board_info {
char type[20];
char pad[100];
};
#ifdef NONORETURN
void fortify_panic();
#else
void fortify_panic() __noreturn;
#endif
int f(int a)
{
if (a)
fortify_panic();
}
void i2c_new_device(struct i2c_board_info *);
int em28xx_dvb_init(int model, int a, int b, int c, int d)
{
switch (model) {
case 1:{
struct i2c_board_info info = {};
f(a);
i2c_new_device(&info);
break;
}
case 2:{
struct i2c_board_info info = {};
f(b);
i2c_new_device(&info);
break;
}
case 3:{
struct i2c_board_info info = { };
f(c);
i2c_new_device(&info);
break;
}
case 4:{
struct i2c_board_info info = { };
f(d);
i2c_new_device(&info);
break;
}
}
return 0;
}
Basically the noreturn function is not considered a barrier for the info so the
middle-end thinks all of the info can overlap in scope.