+2003-03-19 Jakub Jelinek <jakub@redhat.com>
+
+ * 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 <amodra@bigpond.net.au>
PR target/10073
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);
}
+2003-03-19 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.dg/20030309-1.c: New test.
+
2003-03-16 Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
* gcc.c-torture/execute/20030316-1.c: New test case.
--- /dev/null
+/* { 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;
+}