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:
parent
0c3de9003f
commit
250d125cd3
@ -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.
|
||||
|
35
gcc/global.c
35
gcc/global.c
@ -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
|
||||
|
51
gcc/testsuite/gcc.dg/torture/pr33676.c
Normal file
51
gcc/testsuite/gcc.dg/torture/pr33676.c
Normal file
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user