From: Jakub Jelinek Date: Thu, 12 Aug 2010 09:04:48 +0000 (+0200) Subject: re PR debug/45259 (ICE in save_call_clobbered_regs) X-Git-Tag: releases/gcc-4.6.0~5034 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=49b48605c822542b0ce623db4d5188ed3ae79401;p=thirdparty%2Fgcc.git re PR debug/45259 (ICE in save_call_clobbered_regs) PR debug/45259 * caller-save.c (save_call_clobbered_regs): Only swap notes with DEBUG_INSNs if n_regs_saved. * gcc.dg/pr45259.c: New test. From-SVN: r163185 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d55ddbe40121..fff6268ff634 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-08-12 Jakub Jelinek + + PR debug/45259 + * caller-save.c (save_call_clobbered_regs): Only swap notes with + DEBUG_INSNs if n_regs_saved. + 2010-08-12 Wei Guozhi PR target/44999 diff --git a/gcc/caller-save.c b/gcc/caller-save.c index 446da51acdf4..9ca8592bf34c 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -868,7 +868,10 @@ save_call_clobbered_regs (void) remain saved. If the last insn in the block is a JUMP_INSN, put the restore before the insn, otherwise, put it after the insn. */ - if (DEBUG_INSN_P (insn) && last && last->block == chain->block) + if (n_regs_saved + && DEBUG_INSN_P (insn) + && last + && last->block == chain->block) { rtx ins, prev; basic_block bb = BLOCK_FOR_INSN (insn); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ac7bbac087d..84bd311b8999 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-12 Jakub Jelinek + + PR debug/45259 + * gcc.dg/pr45259.c: New test. + 2010-08-12 Wei Guozhi PR target/44999 diff --git a/gcc/testsuite/gcc.dg/pr45259.c b/gcc/testsuite/gcc.dg/pr45259.c new file mode 100644 index 000000000000..b8dc36503f8c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr45259.c @@ -0,0 +1,42 @@ +/* PR debug/45259 */ +/* { dg-do compile } */ +/* { dg-options "-g -O2 -fpic -w" { target fpic } } */ + +struct S { void (*bar) (long); }; +struct T { struct S *t; }; +int w; +extern int baz (int); + +void +foo (int x, int u, char *z) +{ + struct T *v; + static void *y[256] = { &&l1, &&l2 }; + for (;;) + switch (x) + { + l2: + x = 9; + case 9: + goto *y[*z++]; + case 10: + case 27: + case 54: + case 99: + case 100: + case 120: + case 122: + case 131: + case 132: + case 134: + case 141: + case 142: + v->t->bar (u); + v->t->bar (u); + case 143: + continue; + l1: + default: + baz (w); + } +}