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.