PR target/62025
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Aug 2014 21:24:40 +0000 (21:24 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Aug 2014 21:24:40 +0000 (21:24 +0000)
* sched-deps.c (find_inc): Check if inc_insn doesn't clobber
any registers that are used in mem_insn.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@213887 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/sched-deps.c

index 946bc44..e1a4b56 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/62025
+       * sched-deps.c (find_inc): Check if inc_insn doesn't clobber
+       any registers that are used in mem_insn.
+
 2014-08-12  Steve Ellcey  <sellcey@mips.com>
 
        * config/mips/mips.h (ASM_SPEC): Pass float options to assembler. 
index 51c1a01..049927f 100644 (file)
@@ -4751,6 +4751,24 @@ find_inc (struct mem_inc_info *mii, bool backwards)
                           "inc conflicts with store failure.\n");
                goto next;
              }
+
+         /* The inc instruction could have clobbers, make sure those
+            registers are not used in mem insn.  */
+         FOR_EACH_INSN_DEF (def, mii->inc_insn)
+           if (!reg_overlap_mentioned_p (DF_REF_REG (def), mii->mem_reg0))
+             {
+               df_ref use;
+               FOR_EACH_INSN_USE (use, mii->mem_insn)
+                 if (reg_overlap_mentioned_p (DF_REF_REG (def),
+                                              DF_REF_REG (use)))
+                   {
+                     if (sched_verbose >= 5)
+                       fprintf (sched_dump,
+                                "inc clobber used in store failure.\n");
+                     goto next;
+                   }
+             }
+
          newaddr = mii->inc_input;
          if (mii->mem_index != NULL_RTX)
            newaddr = gen_rtx_PLUS (GET_MODE (newaddr), newaddr,