From: Jakub Jelinek Date: Thu, 20 Dec 2001 08:23:42 +0000 (+0100) Subject: combine.c (distribute_notes): Avoid adding REG_LABEL notes to JUMP_INSNs with JUMP_LABEL. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2a3b43b609ca4f3850226eecb5fec29f1ab80d35;p=gcc.git combine.c (distribute_notes): Avoid adding REG_LABEL notes to JUMP_INSNs with JUMP_LABEL. * combine.c (distribute_notes): Avoid adding REG_LABEL notes to JUMP_INSNs with JUMP_LABEL. * gcc.c-torture/execute/20011219-1.c: New test. From-SVN: r48198 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47fe504bb91..f1634cc4744 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-12-20 Jakub Jelinek + + * combine.c (distribute_notes): Avoid adding REG_LABEL notes + to JUMP_INSNs with JUMP_LABEL. + 2001-12-19 Aldy Hernandez * doc/install.texi: Add documentation for --enable-altivec. diff --git a/gcc/combine.c b/gcc/combine.c index 82e86b2816e..a0b08ec1258 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -12129,6 +12129,25 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1) else place = i2; } + + /* Don't attach REG_LABEL note to a JUMP_INSN which has + JUMP_LABEL already. Instead, decrement LABEL_NUSES. */ + if (place && GET_CODE (place) == JUMP_INSN && JUMP_LABEL (place)) + { + if (JUMP_LABEL (place) != XEXP (note, 0)) + abort (); + if (GET_CODE (JUMP_LABEL (place)) == CODE_LABEL) + LABEL_NUSES (JUMP_LABEL (place))--; + place = 0; + } + if (place2 && GET_CODE (place2) == JUMP_INSN && JUMP_LABEL (place2)) + { + if (JUMP_LABEL (place2) != XEXP (note, 0)) + abort (); + if (GET_CODE (JUMP_LABEL (place2)) == CODE_LABEL) + LABEL_NUSES (JUMP_LABEL (place2))--; + place2 = 0; + } break; case REG_NONNEG: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 00ed5ee1779..de0cdf8810a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-12-20 Jakub Jelinek + + * gcc.c-torture/execute/20011219-1.c: New test. + 2001-12-19 David Billinghurst * gcc.dg/special/ecos.exp: wkali-1.c unsupported if diff --git a/gcc/testsuite/gcc.c-torture/execute/20011219-1.c b/gcc/testsuite/gcc.c-torture/execute/20011219-1.c new file mode 100644 index 00000000000..d0726add7c9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20011219-1.c @@ -0,0 +1,49 @@ +/* This testcase failed on IA-32 at -O and above, because combine attached + a REG_LABEL note to jump instruction already using JUMP_LABEL. */ + +extern void abort (void); +extern void exit (int); + +enum X { A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q }; + +void +bar (const char *x, int y, const char *z) +{ +} + +long +foo (enum X x, const void *y) +{ + long a; + + switch (x) + { + case K: + a = *(long *)y; + break; + case L: + a = *(long *)y; + break; + case M: + a = *(long *)y; + break; + case N: + a = *(long *)y; + break; + case O: + a = *(long *)y; + break; + default: + bar ("foo", 1, "bar"); + } + return a; +} + +int +main () +{ + int i = 24; + if (foo (N, &i) != 24) + abort (); + exit (0); +}