2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-10 09:30:36 +08:00

re PR rtl-optimization/33676 (libgfortran bootstrap failure: selected_int_kind.f90:22: Segmentation fault, wrong code with -fomit-frame-pointer)

2007-10-11  Kenneth Zadeck <zadeck@naturalbridge.com>

	PR middle-end/33676
	* global.c (build_insn_chain): Include insn that occur between
	basic blocks.

2007-10-11  Kenneth Zadeck <zadeck@naturalbridge.com>

	PR middle-end/33676
	* gcc.dg/torture/pr33676.c: New.

From-SVN: r129244
This commit is contained in:
Kenneth Zadeck 2007-10-11 22:31:55 +00:00 committed by Kenneth Zadeck
parent 0c3de9003f
commit 250d125cd3
4 changed files with 97 additions and 0 deletions
gcc

@ -1,3 +1,9 @@
2007-10-11 Kenneth Zadeck <zadeck@naturalbridge.com>
PR middle-end/33676
* global.c (build_insn_chain): Include insn that occur between
basic blocks.
2007-10-11 Tom Tromey <tromey@redhat.com>
* gengtype-yacc.y: Delete.

@ -1575,6 +1575,41 @@ build_insn_chain (void)
}
}
}
/* FIXME!! The following code is a disaster. Reload needs to see the
labels and jump tables that are just hanging out in between
the basic blocks. See pr33676. */
insn = BB_HEAD (bb);
/* Skip over the barriers and cruft. */
while (insn && (BARRIER_P (insn) || NOTE_P (insn) || BLOCK_FOR_INSN (insn) == bb))
insn = PREV_INSN (insn);
/* While we add anything except barriers and notes, the focus is
to get the labels and jump tables into the
reload_insn_chain. */
while (insn)
{
if (!NOTE_P (insn) && !BARRIER_P (insn))
{
if (BLOCK_FOR_INSN (insn))
break;
c = new_insn_chain ();
c->next = next;
next = c;
*p = c;
p = &c->prev;
c->insn = insn;
/* The block makes no sense here, but it is what the old
code did. */
c->block = bb->index;
bitmap_copy (&c->live_throughout, live_relevant_regs);
}
insn = PREV_INSN (insn);
}
}
for (i = 0; i < (unsigned int)max_regno; i++)

@ -1,3 +1,8 @@
2007-10-11 Kenneth Zadeck <zadeck@naturalbridge.com>
PR middle-end/33676
* gcc.dg/torture/pr33676.c: New.
2007-10-11 Paolo Carlini <pcarlini@suse.de>
PR c++/31441

@ -0,0 +1,51 @@
/* { dg-do run } */
/* { dg-options "-march=i586 -fomit-frame-pointer" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
__attribute__((noreturn,noinline)) void abrt (const char *fi, const char *fu)
{
__builtin_abort ();
}
__attribute__((noinline)) int f (int k)
{
return k;
}
__attribute__((noinline)) int g (int t, int k)
{
int b;
switch (t)
{
case 0:
abrt (__FILE__, __FUNCTION__);
case 1:
b = f (k);
break;
case 2:
b = f (k);
break;
case 3:
b = f (k);
break;
case 4:
b = f (k);
break;
default:
abrt (__FILE__, __FUNCTION__);
}
return b;
}
int main (void)
{
if (g (3, 1337) != 1337)
abrt (__FILE__, __FUNCTION__);
return 0;
}