re PR target/70110 (ICE at -O3 in the 32-bit mode in set_last_insn, at emit-rtl.h:420)

PR target/70110
	* config/i386/i386.c (scalar_chain::make_vector_copies,
	scalar_chain::convert_reg): Call end_sequence in between
	get_insns and emit_conversion_insns rather than after both
	calls.

	* gcc.dg/pr70110.c: New test.

From-SVN: r234057
This commit is contained in:
Jakub Jelinek 2016-03-08 09:05:26 +01:00 committed by Jakub Jelinek
parent 324167d122
commit 12b81409d9
4 changed files with 56 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2016-03-08 Jakub Jelinek <jakub@redhat.com>
PR target/70110
* config/i386/i386.c (scalar_chain::make_vector_copies,
scalar_chain::convert_reg): Call end_sequence in between
get_insns and emit_conversion_insns rather than after both
calls.
2016-03-07 Uros Bizjak <ubizjak@gmail.com>
PR target/70064

View File

@ -3272,8 +3272,9 @@ scalar_chain::make_vector_copies (unsigned regno)
gen_rtx_SUBREG (SImode, reg, 4));
emit_move_insn (vreg, tmp);
}
emit_conversion_insns (get_insns (), insn);
rtx_insn *seq = get_insns ();
end_sequence ();
emit_conversion_insns (seq, insn);
if (dump_file)
fprintf (dump_file,
@ -3348,8 +3349,9 @@ scalar_chain::convert_reg (unsigned regno)
emit_move_insn (gen_rtx_SUBREG (SImode, scopy, 4),
adjust_address (tmp, SImode, 4));
}
emit_conversion_insns (get_insns (), insn);
rtx_insn *seq = get_insns ();
end_sequence ();
emit_conversion_insns (seq, insn);
if (dump_file)
fprintf (dump_file,

View File

@ -1,3 +1,8 @@
2016-03-08 Jakub Jelinek <jakub@redhat.com>
PR target/70110
* gcc.dg/pr70110.c: New test.
2016-03-07 Martin Jambor <mjambor@suse.cz>
* c-c++-common/gomp/clauses-1.c: Remove dg-options.

View File

@ -0,0 +1,39 @@
/* PR target/70110 */
/* { dg-do compile } */
/* { dg-options "-O3" } */
/* { dg-additional-options "-msse2" { target i?86-*-* x86_64-*-* } } */
int a, c, d, f, h;
long long b;
static inline void
foo (void)
{
if (a)
foo ();
b = c;
}
static inline void
bar (int p)
{
if (p)
f = 0;
b |= c;
}
void
baz (int g, int i)
{
for (b = d; (d = 1) != 0; )
{
if (a)
foo ();
b |= c;
bar (h);
bar (g);
bar (h);
bar (i);
bar (h);
}
}