]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/48932 (ICE in check_dep, at sched-deps.c:4097)
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Sat, 14 May 2011 20:39:54 +0000 (20:39 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sat, 14 May 2011 20:39:54 +0000 (20:39 +0000)
PR rtl_optimization/48932
Backport from mainline:
2010-09-15  Eric Botcazou  <ebotcazou@adacore.com>

PR rtl-optimization/45593
* reorg.c (relax_delay_slots): Use emit_copy_of_insn_after to re-emit
insns that were in delay slots as stand-alone insns.

Backport from mainline:
2010-09-15  Eric Botcazou  <ebotcazou@adacore.com>

* gcc.c-torture/compile/20100915-1.c: New test.

From-SVN: r173763

gcc/ChangeLog
gcc/reorg.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20100915-1.c [new file with mode: 0644]

index 145b36ab238bc594544e749ff676e4b8f1dd41fe..1389f83c80b0796210d0402f716d8d73a80b6cc4 100644 (file)
@@ -1,3 +1,13 @@
+2011-05-14  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR rtl_optimization/48932
+       Backport from mainline:
+       2010-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR rtl-optimization/45593
+       * reorg.c (relax_delay_slots): Use emit_copy_of_insn_after to re-emit
+       insns that were in delay slots as stand-alone insns.
+
 2011-05-10  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
index 0bbe031f8c148cfb6e96d0511eb3a8b7dbe877bc..adab945f7682c7ec426fc5d121d64fb3c821a6fa 100644 (file)
@@ -3453,9 +3453,13 @@ relax_delay_slots (rtx first)
             We do this by deleting the INSN containing the SEQUENCE, then
             re-emitting the insns separately, and then deleting the RETURN.
             This allows the count of the jump target to be properly
-            decremented.  */
+            decremented.
 
-         /* Clear the from target bit, since these insns are no longer
+            Note that we need to change the INSN_UID of the re-emitted insns
+            since it is used to hash the insns for mark_target_live_regs and
+            the re-emitted insns will no longer be wrapped up in a SEQUENCE.
+
+            Clear the from target bit, since these insns are no longer
             in delay slots.  */
          for (i = 0; i < XVECLEN (pat, 0); i++)
            INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)) = 0;
@@ -3463,13 +3467,10 @@ relax_delay_slots (rtx first)
          trial = PREV_INSN (insn);
          delete_related_insns (insn);
          gcc_assert (GET_CODE (pat) == SEQUENCE);
-         after = trial;
-         for (i = 0; i < XVECLEN (pat, 0); i++)
-           {
-             rtx this_insn = XVECEXP (pat, 0, i);
-             add_insn_after (this_insn, after, NULL);
-             after = this_insn;
-           }
+         add_insn_after (delay_insn, trial, NULL);
+         after = delay_insn;
+         for (i = 1; i < XVECLEN (pat, 0); i++)
+           after = emit_copy_of_insn_after (XVECEXP (pat, 0, i), after);
          delete_scheduled_jump (delay_insn);
          continue;
        }
@@ -3571,9 +3572,13 @@ relax_delay_slots (rtx first)
             We do this by deleting the INSN containing the SEQUENCE, then
             re-emitting the insns separately, and then deleting the jump.
             This allows the count of the jump target to be properly
-            decremented.  */
+            decremented.
 
-         /* Clear the from target bit, since these insns are no longer
+            Note that we need to change the INSN_UID of the re-emitted insns
+            since it is used to hash the insns for mark_target_live_regs and
+            the re-emitted insns will no longer be wrapped up in a SEQUENCE.
+
+            Clear the from target bit, since these insns are no longer
             in delay slots.  */
          for (i = 0; i < XVECLEN (pat, 0); i++)
            INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)) = 0;
@@ -3581,13 +3586,10 @@ relax_delay_slots (rtx first)
          trial = PREV_INSN (insn);
          delete_related_insns (insn);
          gcc_assert (GET_CODE (pat) == SEQUENCE);
-         after = trial;
-         for (i = 0; i < XVECLEN (pat, 0); i++)
-           {
-             rtx this_insn = XVECEXP (pat, 0, i);
-             add_insn_after (this_insn, after, NULL);
-             after = this_insn;
-           }
+         add_insn_after (delay_insn, trial, NULL);
+         after = delay_insn;
+         for (i = 1; i < XVECLEN (pat, 0); i++)
+           after = emit_copy_of_insn_after (XVECEXP (pat, 0, i), after);
          delete_scheduled_jump (delay_insn);
          continue;
        }
index 8e1852893d180e05f5e9777500cce62fdd4efe22..3c2d721ac0d3b7ffa173c2c86c65b49e2dbf0183 100644 (file)
@@ -1,3 +1,10 @@
+2011-05-14  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       Backport from mainline:
+       2010-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.c-torture/compile/20100915-1.c: New test.
+
 2011-05-10  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
diff --git a/gcc/testsuite/gcc.c-torture/compile/20100915-1.c b/gcc/testsuite/gcc.c-torture/compile/20100915-1.c
new file mode 100644 (file)
index 0000000..04f6ab0
--- /dev/null
@@ -0,0 +1,82 @@
+/* PR rtl-optimization/45593 */
+/* Testcase by Arnaud Lacombe <lacombar@gmail.com> */
+
+typedef unsigned int __u32;
+typedef __u32 __be32;
+static inline __attribute__((always_inline)) int __attribute__((__cold__)) printk(const char *s, ...) { return 0; }
+typedef struct journal_s journal_t;
+typedef struct journal_header_s
+{
+ __be32 h_magic;
+ __be32 h_blocktype;
+ __be32 h_sequence;
+} journal_header_t;
+typedef struct journal_superblock_s
+{
+ journal_header_t s_header;
+ __be32 s_blocksize;
+ __be32 s_maxlen;
+} journal_superblock_t;
+struct journal_s
+{
+ struct buffer_head *j_sb_buffer;
+ journal_superblock_t *j_superblock;
+ int j_format_version;
+ int j_blocksize;
+ unsigned int j_maxlen;
+};
+static void journal_fail_superblock (journal_t *journal)
+{
+ journal->j_sb_buffer = ((void *)0);
+}
+static int journal_get_superblock(journal_t *journal)
+{
+ struct buffer_head *bh;
+ journal_superblock_t *sb;
+ int err = -100;
+ bh = journal->j_sb_buffer;
+ if (!buffer_uptodate(bh)) {
+  if (!buffer_uptodate(bh)) {
+   printk ("JBD: IO error reading journal superblock\n");
+   goto out;
+  }
+ }
+ err = -101;
+ if (sb->s_header.h_magic != (( __be32)(__u32)(0)) ||
+     sb->s_blocksize != (( __be32)(__u32)(journal->j_blocksize))) {
+  printk("JBD: no valid journal superblock found\n");
+  goto out;
+ }
+ switch((( __u32)(__be32)(sb->s_header.h_blocktype))) {
+ case 0:
+ case 1:
+  break;
+ default:
+  goto out;
+ }
+ if ((( __u32)(__be32)(sb->s_maxlen)) < journal->j_maxlen)
+  journal->j_maxlen = (( __u32)(__be32)(sb->s_maxlen));
+ else if ((( __u32)(__be32)(sb->s_maxlen)) > journal->j_maxlen) {
+  printk ("JBD: journal file too short\n");
+  goto out;
+ }
+ return 0;
+out:
+ journal_fail_superblock(journal);
+ return err;
+}
+static int load_superblock(journal_t *journal)
+{
+ journal_get_superblock(journal);
+ return 0;
+}
+int jbd2_journal_update_format (journal_t *journal)
+{
+ journal_get_superblock(journal);
+ return 0;
+}
+int jbd2_journal_wipe(journal_t *journal, int write)
+{
+ load_superblock(journal);
+ return 0;
+}