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:
Steve Ellcey 2006-09-20 16:41:12 +00:00 committed by Steve Ellcey
parent d7f245b19d
commit 4e60515f9a
3 changed files with 87 additions and 0 deletions

View File

@ -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

View File

@ -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))

View 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() {}