------- Comment #9 from bonzini at gnu dot org 2008-07-14 16:29 ------- In fact, using modified_between_p would not fix the bug. The problem is that use_killed_between gives the wrong answer *before* it reaches the code that "redoes" modified_between_p using df data structures.
I'll regtest this patch tomorrow because the machine is right now too busy. But if anyone wants to beat me, feel free. Index: ../../peak-gcc-src/gcc/fwprop.c =================================================================== --- ../../peak-gcc-src/gcc/fwprop.c (revision 136756) +++ ../../peak-gcc-src/gcc/fwprop.c (working copy) @@ -480,10 +480,15 @@ use_killed_between (struct df_ref *use, return true; /* Check if the reg in USE has only one definition. We already - know that this definition reaches use, or we wouldn't be here. */ + know that this definition reaches use, or we wouldn't be here. + However, this is not true for hard registers, because if they are + live at the beginning of the function it does not mean that we + have an uninitialized access. */ regno = DF_REF_REGNO (use); def = DF_REG_DEF_CHAIN (regno); - if (def && (def->next_reg == NULL)) + if (def + && (def->next_reg == NULL) + && regno >= FIRST_PSEUDO_REGISTER) return false; /* Check locally if we are in the same basic block. */ -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36753