------- Comment #1 from jakub at gcc dot gnu dot org 2008-12-16 13:49 ------- The culprit is tree-ssa-reassoc.c, with -fno-tree-ssa-reassoc the generated code is comparable to 3.4. For some reason it decides: Transforming err_10 = __err_3 | __err_8; into err_10 = __err_8 | __err_3; (no idea what advantages that has, but anyway) but instead of reinserting the transformed stmt into the location where err_10 used to be set before, it moves all the 30 err_A = err_B | __err_C stmts (where each stmt depends on the preceeding one) after the last asm volatile. This means that register pressure jumps through the roof. In this case (if the transformation actually makes sense) certainly the first transformed stmt can be inserted into the old definition spot and all the following stmts can be left untouched.
-- jakub at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |dberlin at gcc dot gnu dot | |org Keywords| |missed-optimization Summary|[4.2/4.3/4.4 regression] |[4.2/4.3/4.4 regression] |Inefficient stack usage |tree-ssa-reassoc.c increases | |register pressure several | |times http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38533