mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-22 19:11:18 +08:00
re PR target/28574 (switch statement points to unreferenced label at -O2)
PR target/28574 * ifcvt.c (dead_or_predicable): Don't predicate then blocks with tablejumps in them. From-SVN: r117084
This commit is contained in:
parent
d7f245b19d
commit
4e60515f9a
@ -1,3 +1,9 @@
|
||||
2006-09-20 Steve Ellcey <sje@cup.hp.com>
|
||||
|
||||
PR target/28574
|
||||
* ifcvt.c (dead_or_predicable): Don't predicate then blocks
|
||||
with tablejumps in them.
|
||||
|
||||
2006-09-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/28046
|
||||
|
@ -3560,6 +3560,13 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
|
||||
head = BB_HEAD (merge_bb);
|
||||
end = BB_END (merge_bb);
|
||||
|
||||
/* If merge_bb ends with a tablejump, predicating/moving insn's
|
||||
into test_bb and then deleting merge_bb will result in the jumptable
|
||||
that follows merge_bb being removed along with merge_bb and then we
|
||||
get an unresolved reference to the jumptable. */
|
||||
if (tablejump_p (end, NULL, NULL))
|
||||
return FALSE;
|
||||
|
||||
if (LABEL_P (head))
|
||||
head = NEXT_INSN (head);
|
||||
if (NOTE_P (head))
|
||||
|
74
gcc/testsuite/gcc.dg/pr28574.c
Normal file
74
gcc/testsuite/gcc.dg/pr28574.c
Normal file
@ -0,0 +1,74 @@
|
||||
/* On IA64 This test resulted in a missing jumptable and an undefined
|
||||
reference to a label. Make sure we can compile and link it with
|
||||
no undefs at -O2. */
|
||||
|
||||
/* { dg-do link } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
typedef enum yasm_module_type {
|
||||
YASM_MODULE_ARCH = 0,
|
||||
YASM_MODULE_DBGFMT,
|
||||
YASM_MODULE_OBJFMT,
|
||||
YASM_MODULE_LISTFMT,
|
||||
YASM_MODULE_OPTIMIZER
|
||||
} yasm_module_type;
|
||||
|
||||
struct yasm_module {
|
||||
const char *name;
|
||||
};
|
||||
|
||||
typedef struct yasm_module yasm_arch_module;
|
||||
typedef struct yasm_module yasm_dbgfmt_module;
|
||||
typedef struct yasm_module yasm_objfmt_module;
|
||||
typedef struct yasm_module yasm_listfmt_module;
|
||||
typedef struct yasm_module yasm_optimizer_module;
|
||||
|
||||
typedef struct module {
|
||||
void *data;
|
||||
} module;
|
||||
|
||||
static struct {
|
||||
module *m;
|
||||
int n;
|
||||
} module_types[] = {
|
||||
{},
|
||||
};
|
||||
|
||||
void
|
||||
yasm_list_modules(yasm_module_type type,
|
||||
void (*printfunc) (const char *name))
|
||||
{
|
||||
int i;
|
||||
module *modules = module_types[type].m;
|
||||
yasm_arch_module *arch;
|
||||
yasm_dbgfmt_module *dbgfmt;
|
||||
yasm_objfmt_module *objfmt;
|
||||
yasm_listfmt_module *listfmt;
|
||||
yasm_optimizer_module *optimizer;
|
||||
|
||||
for (i=0; i<2; i++) {
|
||||
switch (type) {
|
||||
case YASM_MODULE_ARCH:
|
||||
arch = modules[i].data;
|
||||
printfunc(arch->name);
|
||||
break;
|
||||
case YASM_MODULE_DBGFMT:
|
||||
dbgfmt = modules[i].data;
|
||||
printfunc(dbgfmt->name);
|
||||
break;
|
||||
case YASM_MODULE_OBJFMT:
|
||||
objfmt = modules[i].data;
|
||||
printfunc(objfmt->name);
|
||||
break;
|
||||
case YASM_MODULE_LISTFMT:
|
||||
listfmt = modules[i].data;
|
||||
printfunc(listfmt->name);
|
||||
break;
|
||||
case YASM_MODULE_OPTIMIZER:
|
||||
optimizer = modules[i].data;
|
||||
printfunc(optimizer->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
main() {}
|
Loading…
x
Reference in New Issue
Block a user