From de0b4ad5451aa82edae1d13c6424194e101e437b Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 29 Apr 2009 10:39:26 +0000 Subject: [PATCH] re PR middle-end/39941 (ice in passes.c:execute_todo()) 2009-04-29 Richard Guenther PR tree-optimization/39941 * tree-ssa-pre.c (eliminate): Schedule update-ssa after eliminating an indirect call. * gcc.c-torture/compile/pr39941.c: New testcase. From-SVN: r146948 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr39941.c | 12 ++++++++++++ gcc/tree-ssa-pre.c | 5 +++++ 4 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr39941.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a6e64b92fd2..149e083d967 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-04-29 Richard Guenther + + PR tree-optimization/39941 + * tree-ssa-pre.c (eliminate): Schedule update-ssa after + eliminating an indirect call. + 2009-04-29 Richard Guenther * tree-cfg.c (verify_types_in_gimple_reference): Add require_lvalue diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bd54a302f24..4533e4b1a33 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-04-29 Richard Guenther + + PR tree-optimization/39941 + * gcc.c-torture/compile/pr39941.c: New testcase. + 2009-04-29 Bernd Schmidt * gcc.target/bfin/20090411-1.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr39941.c b/gcc/testsuite/gcc.c-torture/compile/pr39941.c new file mode 100644 index 00000000000..b6209086be9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr39941.c @@ -0,0 +1,12 @@ +typedef void (*entry_func) (void) __attribute__ ((noreturn)); +extern entry_func entry_addr; +static void bsd_boot_entry (void) +{ + stop (); +} +void bsd_boot (void) +{ + entry_addr = (entry_func) bsd_boot_entry; + (*entry_addr) (); +} + diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 61207b2f849..11b88eddc36 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -4131,6 +4131,11 @@ eliminate (void) update_stmt (stmt); if (maybe_clean_or_replace_eh_stmt (stmt, stmt)) gimple_purge_dead_eh_edges (b); + + /* Changing an indirect call to a direct call may + have exposed different semantics. This may + require an SSA update. */ + todo |= TODO_update_ssa; } } } -- 2.30.2