From a4bbf7579cd4621d069f7b8fa78c8c99b43a5bd2 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 19 Mar 2003 13:38:12 +0100 Subject: [PATCH] ifcvt.c (dead_or_predicable): Fail if there are any references to tablejump in merge_bb other than the final... * ifcvt.c (dead_or_predicable): Fail if there are any references to tablejump in merge_bb other than the final JUMP_INSN. * gcc.dg/20030309-1.c: New test. From-SVN: r64577 --- gcc/ChangeLog | 5 ++++ gcc/ifcvt.c | 17 +++++++++++++ gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.dg/20030309-1.c | 42 +++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/20030309-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 24a8e04f5fac..5e4f9c7af440 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-03-19 Jakub Jelinek + + * ifcvt.c (dead_or_predicable): Fail if there are any references + to tablejump in merge_bb other than the final JUMP_INSN. + 2003-03-19 Alan Modra PR target/10073 diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 166c59c1307c..a2b4cbd9512d 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -2519,11 +2519,28 @@ dead_or_predicable (test_bb, merge_bb, other_bb, new_dest, reversep) if (GET_CODE (end) == JUMP_INSN) { + rtx tmp, insn, label; + if (head == end) { head = end = NULL_RTX; goto no_body; } + + /* If there is a jump table following merge_bb, fail + if there are any insn between head and PREV_INSN (end) + references it. */ + if ((label = JUMP_LABEL (end)) != NULL_RTX + && (tmp = NEXT_INSN (label)) != NULL_RTX + && GET_CODE (tmp) == JUMP_INSN + && (GET_CODE (PATTERN (tmp)) == ADDR_VEC + || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC)) + { + for (insn = head; insn != PREV_INSN (end); insn = NEXT_INSN (insn)) + if (find_reg_note (insn, REG_LABEL, label)) + return FALSE; + } + end = PREV_INSN (end); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b5e1ea2ab676..fc3c1abada9f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-03-19 Jakub Jelinek + + * gcc.dg/20030309-1.c: New test. + 2003-03-16 Falk Hueffner * gcc.c-torture/execute/20030316-1.c: New test case. diff --git a/gcc/testsuite/gcc.dg/20030309-1.c b/gcc/testsuite/gcc.dg/20030309-1.c new file mode 100644 index 000000000000..2431bc1b52f3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20030309-1.c @@ -0,0 +1,42 @@ +/* { dg-do link } */ +/* { dg-options "-O2" } */ + +struct A0 { int x; }; +struct A1 { int x; int y[1]; }; +struct A2 { int x; int y[2]; }; +struct A3 { int x; int y[3]; }; +struct A4 { int x; int y[4]; }; + +void *s; +int u; + +int +main (void) +{ + int x; + void *t = s; + + switch (u) + { + case 0: + x = ((struct A0 *) t)->x; + break; + case 1: + x = ((struct A1 *) t)->x; + break; + case 2: + x = ((struct A2 *) t)->x; + break; + case 3: + x = ((struct A3 *) t)->x; + break; + case 4: + x = ((struct A4 *) t)->x; + break; + default: + x = 0; + break; + } + + return x; +} -- 2.47.2