http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54133
--- Comment #5 from amker.cheng <amker.cheng at gmail dot com> 2012-08-01 13:48:50 UTC --- Thanks for your patch, IMHO, I don't think the problem could be fixed in this way, because: 1. 78 r177:DF=r0:DF 80 [sp:SI]=r166:DF 81 [sp:SI+0x8]=r168:DF 82 [sp:SI+0x10]=r170:DF 84 r2:DF=r164:DF 85 r0:DF=call [`bar'] argc:0x18 REG_DEAD: r2:DF REG_UNUSED: r0:DF 86 [sp:SI]=r167:DF 87 [sp:SI+0x8]=r169:DF 88 [sp:SI+0x10]=r171:DF 89 r0:DF=r177:DF REG_DEAD: r177:DF 90 r2:DF=r165:DF 91 r0:DF=call [`bar'] argc:0x18 The propagation actually increases register pressure from insn 78 to insn 85, since r177 and r0 are both alive now. Maybe IRA makes a better decision in this case by spilling r177, I double the common results. 2.The reported case is some kind of special with all related insns limited in one basic block. In other cases like described in comment 2, the saving of hard register is in prologue, so the propagation crosses basic blocks. Anyway, one thing is clear that the problem is closely connected with parameter/return register moving.