http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51447
--- Comment #12 from Steven Bosscher <steven at gcc dot gnu.org> 2012-11-11 22:05:37 UTC --- (In reply to comment #7) > Created attachment 26100 [details] > gcc47-pr51447.patch > > While that fixes the testcase at -O1, at -O2 and above it still fails. > Apparently ud_dce pass removes it. I think DCE should never delete an insn setting a global reg. So in addition to your patch, we'd need the following patch: Index: dce.c =================================================================== --- dce.c (revision 193411) +++ dce.c (working copy) @@ -98,6 +98,11 @@ deletable_insn_p (rtx insn, bool fast, b rtx body, x; int i; + /* If INSN sets a global_reg, leave it untouched. */ + for (df_ref *def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++) + if (global_regs[DF_REF_REGNO (*def_rec)]) + return false; + if (CALL_P (insn) /* We cannot delete calls inside of the recursive dce because this may cause basic blocks to be deleted and this messes up