re PR target/81766 (ICE in maybe_add_or_update_dep_1, at sched-deps.c:924 caused...
authorJakub Jelinek <jakub@redhat.com>
Fri, 1 Sep 2017 16:49:26 +0000 (18:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 1 Sep 2017 16:49:26 +0000 (18:49 +0200)
PR target/81766
* config/i386/i386.c (ix86_init_large_pic_reg): Return label instead of void.
(ix86_init_pic_reg): Remember label from ix86_init_large_pic_reg, if non-NULL
and preceded by NOTE_INSN_BASIC_BLOCK, swap the note and label.

* gcc.target/i386/pr81766.c: New test.

From-SVN: r251606

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr81766.c [new file with mode: 0644]

index f9d9eb74a3aa28b2d01b3a324d62d19be106d48e..4cc3ac68d87baff9f8207e295d232f062fac50ce 100644 (file)
@@ -1,3 +1,10 @@
+2017-09-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/81766
+       * config/i386/i386.c (ix86_init_large_pic_reg): Return label instead of void.
+       (ix86_init_pic_reg): Remember label from ix86_init_large_pic_reg, if non-NULL
+       and preceded by NOTE_INSN_BASIC_BLOCK, swap the note and label.
+
 2017-09-01  Joerg Sonnenberger  <joerg@bec.de>
            Jeff Law  <law@redhat.com>
 
index 4eaf6e0262f3d73993ca8bc00a1fb18e8d02fdd8..0fe2958fcb87af11e945c354e7f8ba670c25731e 100644 (file)
@@ -8885,7 +8885,7 @@ ix86_use_pseudo_pic_reg (void)
 
 /* Initialize large model PIC register.  */
 
-static void
+static rtx_code_label *
 ix86_init_large_pic_reg (unsigned int tmp_regno)
 {
   rtx_code_label *label;
@@ -8902,6 +8902,7 @@ ix86_init_large_pic_reg (unsigned int tmp_regno)
   emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
   emit_insn (ix86_gen_add3 (pic_offset_table_rtx,
                            pic_offset_table_rtx, tmp_reg));
+  return label;
 }
 
 /* Create and initialize PIC register if required.  */
@@ -8910,6 +8911,7 @@ ix86_init_pic_reg (void)
 {
   edge entry_edge;
   rtx_insn *seq;
+  rtx_code_label *label = NULL;
 
   if (!ix86_use_pseudo_pic_reg ())
     return;
@@ -8919,7 +8921,7 @@ ix86_init_pic_reg (void)
   if (TARGET_64BIT)
     {
       if (ix86_cmodel == CM_LARGE_PIC)
-       ix86_init_large_pic_reg (R11_REG);
+       label = ix86_init_large_pic_reg (R11_REG);
       else
        emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
     }
@@ -8943,6 +8945,22 @@ ix86_init_pic_reg (void)
   entry_edge = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun));
   insert_insn_on_edge (seq, entry_edge);
   commit_one_edge_insertion (entry_edge);
+
+  if (label)
+    {
+      basic_block bb = BLOCK_FOR_INSN (label);
+      rtx_insn *bb_note = PREV_INSN (label);
+      /* If the note preceding the label starts a basic block, and the
+        label is a member of the same basic block, interchange the two.  */
+      if (bb_note != NULL_RTX
+         && NOTE_INSN_BASIC_BLOCK_P (bb_note)
+         && bb != NULL
+         && bb == BLOCK_FOR_INSN (bb_note))
+       {
+         reorder_insns_nobb (bb_note, bb_note, label);
+         BB_HEAD (bb) = label;
+       }
+    }
 }
 
 /* Initialize a variable CUM of type CUMULATIVE_ARGS
index 20f579e391da6d0c3901aa3a7574dfb7d5b066c9..4ead57edfa2c43e892b4b318cac82878762ff2d7 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/81766
+       * gcc.target/i386/pr81766.c: New test.
+
 2017-09-01  Joseph Myers  <joseph@codesourcery.com>
 
        PR c/82071
diff --git a/gcc/testsuite/gcc.target/i386/pr81766.c b/gcc/testsuite/gcc.target/i386/pr81766.c
new file mode 100644 (file)
index 0000000..b5aa346
--- /dev/null
@@ -0,0 +1,9 @@
+/* PR target/81766 */
+/* { dg-do compile { target { pie && lp64 } } } */
+/* { dg-options "-O2 -fpie -mcmodel=large" } */
+
+int
+main ()
+{
+  return 0;
+}