re PR target/81766 (ICE in maybe_add_or_update_dep_1, at sched-deps.c:924 caused by r250815)

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
This commit is contained in:
Jakub Jelinek 2017-09-01 18:49:26 +02:00 committed by Jakub Jelinek
parent de7c2c6a24
commit bff0050a4e
4 changed files with 41 additions and 2 deletions

View 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>

View 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

View 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

View file

@ -0,0 +1,9 @@
/* PR target/81766 */
/* { dg-do compile { target { pie && lp64 } } } */
/* { dg-options "-O2 -fpie -mcmodel=large" } */
int
main ()
{
return 0;
}