From 78d5a34be5a7ddf381c654bec90c8a0af0795888 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Wed, 23 Feb 2005 01:28:59 +0000 Subject: [PATCH] re PR rtl-optimization/20017 (internal compiler error: in rtl_verify_flow_info, at cfgrtl.c:2212) gcc/ PR rtl-optimization/20017. * passes.c (rest_of_handle_combine, rest_of_handle_cse, rest_of_handle_cse2, rest_of_handle_gcse): Call delete_dead_jumptables immediately before calling cleanup_cfg. testsuite/ PR rtl-optimization/20017. * gcc.dg/pr20017.c: New. From-SVN: r95431 --- gcc/ChangeLog | 7 ++++++ gcc/passes.c | 6 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr20017.c | 41 ++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr20017.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 68199d0396f..b83b79afd9a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-02-22 Kazu Hirata + + PR rtl-optimization/20017. + * passes.c (rest_of_handle_combine, rest_of_handle_cse, + rest_of_handle_cse2, rest_of_handle_gcse): Call + delete_dead_jumptables immediately before calling cleanup_cfg. + 2005-02-22 Devang Patel PR 19952 diff --git a/gcc/passes.c b/gcc/passes.c index 695e4908cd1..956885ab717 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -895,6 +895,7 @@ rest_of_handle_combine (void) rebuild_jump_labels (get_insns ()); timevar_pop (TV_JUMP); + delete_dead_jumptables (); cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE); } @@ -971,6 +972,9 @@ rest_of_handle_cse (void) expecting CSE to be run. But always rerun it in a cheap mode. */ cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse; + if (tem) + delete_dead_jumptables (); + if (tem || optimize > 1) cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP); @@ -1006,6 +1010,7 @@ rest_of_handle_cse2 (void) { timevar_push (TV_JUMP); rebuild_jump_labels (get_insns ()); + delete_dead_jumptables (); cleanup_cfg (CLEANUP_EXPENSIVE); timevar_pop (TV_JUMP); } @@ -1053,6 +1058,7 @@ rest_of_handle_gcse (void) { timevar_push (TV_JUMP); rebuild_jump_labels (get_insns ()); + delete_dead_jumptables (); cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP); timevar_pop (TV_JUMP); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1a64436cebb..91b54b0bcba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-02-22 Kazu Hirata + + PR rtl-optimization/20017. + * gcc.dg/pr20017.c: New. + 2005-02-22 Devang Patel PR 19952 diff --git a/gcc/testsuite/gcc.dg/pr20017.c b/gcc/testsuite/gcc.dg/pr20017.c new file mode 100644 index 00000000000..ee425f55377 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr20017.c @@ -0,0 +1,41 @@ +/* PR rtl-optimization/20017 + + After CSE/GCSE folds a switch statement to an unconditonal jump, + cfg_cleanup did not remove a dead jump table, confusing the CFG + layout code later on. */ + +/* { dg-do compile } */ +/* { dg-options "-O1" } */ +/* { dg-options "-O1 -march=i386" { target { i?86-*-* && ilp32 } } } */ + +int +foo (int *buf, int *p) +{ + int result; + const int *tmp; + + if (*buf) + return 1; + + result = 2; + *buf = 2; + tmp = buf; + switch (*tmp) + { + case 3: + case 4: + case 6: + case 14: + return 1; + + case 0: + result = *p; + + /* Fall through. */ + default: + if (result) + return 1; + } + + return 0; +}