On 5 July 2013 16:18, Jakub Jelinek <ja...@redhat.com> wrote:
> On Fri, Jul 05, 2013 at 04:11:00PM +0800, Zhenqiang Chen wrote:
>> +       FOR_BB_INSNS(bb, x)
>
> Just style nits:
> Missing space between (.  Also, please don't use uppercase names
> for labels.
>
>         Jakub

Thanks for the comments. Update it as:

diff --git a/gcc/function.c b/gcc/function.c
index 3e33fc7..0d15db4 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -5524,12 +5524,40 @@ move_insn_for_shrink_wrap (basic_block bb, rtx insn,
          SET_REGNO_REG_SET (live_in, i);
        }

+      /* DF_LR_BB_INFO (bb)->def does not cover the DF_REF_PARTIAL and
+        DF_REF_CONDITIONAL def.  So recheck the DF_INSN_DEFS.  */
+      if (next_block)
+       {
+         rtx x;
+         df_ref *def_rec;
+
+         FOR_BB_INSNS (bb, x)
+           {
+             if (!NONDEBUG_INSN_P (x))
+               continue;
+
+             for (def_rec = DF_INSN_DEFS (x); *def_rec; def_rec++)
+               {
+                 df_ref def = *def_rec;
+                 unsigned int regno = DF_REF_REGNO (def);
+
+                 for (i = dregno; i < end_dregno; i++)
+                   if (i == regno)
+                     goto move_insn_done;
+                 for (i = sregno; i < end_sregno; i++)
+                   if (i == regno)
+                     goto move_insn_done;
+               }
+           }
+       }
+
       /* If we don't need to add the move to BB, look for a single
         successor block.  */
       if (next_block)
        next_block = next_block_for_reg (next_block, dregno, end_dregno);
     }
   while (next_block);
+move_insn_done:

   /* BB now defines DEST.  It only uses the parts of DEST that overlap SRC
      (next loop).  */

Reply via email to