http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60291
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> --- remove_unused_locals is called from at least cfgcleanup-post-optimizing at -O0. At -O0 I have (trunk) expand : 481.98 (94%) usr 1.15 (17%) sys 481.94 (93%) wall 293891 kB (15%) ggc TOTAL : 512.44 6.86 519.82 2023628 kB so it's not that particular spot at -O0. At -O1 it becomes dominant though: expand : 36.83 (18%) usr 0.78 ( 8%) sys 37.18 (17%) wall 177246 kB ( 8%) ggc remove unused locals : 122.09 (58%) usr 0.79 ( 8%) sys 122.80 (56%) wall 0 kB ( 0%) ggc TOTAL : 210.18 9.30 219.40 2258487 kB fixed by removing that walking of DECL_INITIAL. I'm sure somebody put thought into it but I can't think of any case that would break with not doing that walking. -O1 without that: phase parsing : 5.50 ( 6%) usr 4.49 (48%) sys 9.98 (11%) wall 294905 kB (13%) ggc expand : 34.99 (41%) usr 0.92 (10%) sys 36.44 (38%) wall 177246 kB ( 8%) ggc integrated RA : 4.65 ( 5%) usr 0.29 ( 3%) sys 4.60 ( 5%) wall 478130 kB (21%) ggc TOTAL : 85.57 9.39 94.92 2258487 kB so probably the very same issue as with -O0.