re PR target/52667 (sh_reorg segfault)
authorChung-Lin Tang <cltang@codesourcery.com>
Tue, 27 Mar 2012 13:05:01 +0000 (13:05 +0000)
committerChung-Lin Tang <cltang@gcc.gnu.org>
Tue, 27 Mar 2012 13:05:01 +0000 (13:05 +0000)
2012-03-27  Chung-Lin Tang  <cltang@codesourcery.com>

PR target/52667
* config/sh/sh.c (find_barrier): Add equality check of last_got
to avoid going above orig insn. Update comments.

From-SVN: r185867

gcc/ChangeLog
gcc/config/sh/sh.c

index e9acac3..876da25 100644 (file)
@@ -1,3 +1,9 @@
+2012-03-27  Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR target/52667
+       * config/sh/sh.c (find_barrier): Add equality check of last_got
+       to avoid going above orig insn. Update comments.
+
 2012-03-27  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/52720
index 7141a63..68e6034 100644 (file)
@@ -4751,8 +4751,12 @@ find_barrier (int num_mova, rtx mova, rtx from)
       /* Don't emit a constant table int the middle of global pointer setting,
         since that that would move the addressing base GOT into another table. 
         We need the first mov instruction before the _GLOBAL_OFFSET_TABLE_
-        in the pool anyway, so just move up the whole constant pool.  */
-      if (last_got)
+        in the pool anyway, so just move up the whole constant pool.
+
+        However, avoid doing so when the last single GOT mov is the starting
+        insn itself. Going past above the start insn would create a negative
+        offset, causing errors.  */
+      if (last_got && last_got != orig)
         from = PREV_INSN (last_got);
 
       /* Don't insert the constant pool table at the position which