gcc/ChangeLog.gimple-classes: * gimple.c (gimple_set_lhs): Add checked casts to gassign * and gcall * as appropriate. * tree-cfg.c (execute_fixup_cfg): Introduce local "call_stmt" via a dyn_cast and use it in place of "stmt" where appropriate * tree-cfgcleanup.c (split_bb_on_noreturn_calls): Strengthen local "stmt" from gimple to gcall *, replacing an is_gimple_call with a dyn_cast. * tree-cfgcleanup.h (fixup_noreturn_call): Strengthen param from gimple to gcall *. * tree-ssa-dce.c (eliminate_unnecessary_stmts): Replace is_gimple_call with a dyn_cast, introducing local "call_stmt" and using it in place of "stmt" for typesafety. * tree-ssa-propagate.c (finish_update_gimple_call): Strengthen params "new_stmt" and "stmt" from gimple to gcall *. --- gcc/ChangeLog.gimple-classes | 17 +++++++++++++++++ gcc/gimple.c | 4 ++-- gcc/tree-cfg.c | 9 +++++---- gcc/tree-cfgcleanup.c | 4 ++-- gcc/tree-cfgcleanup.h | 2 +- gcc/tree-ssa-dce.c | 10 +++++----- gcc/tree-ssa-propagate.c | 4 ++-- 7 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/gcc/ChangeLog.gimple-classes b/gcc/ChangeLog.gimple-classes index e2fb3d2..33bd5bf 100644 --- a/gcc/ChangeLog.gimple-classes +++ b/gcc/ChangeLog.gimple-classes @@ -1,5 +1,22 @@ 2014-10-31 David Malcolm <dmalc...@redhat.com> + * gimple.c (gimple_set_lhs): Add checked casts to gassign * and + gcall * as appropriate. + * tree-cfg.c (execute_fixup_cfg): Introduce local "call_stmt" + via a dyn_cast and use it in place of "stmt" where appropriate + * tree-cfgcleanup.c (split_bb_on_noreturn_calls): Strengthen + local "stmt" from gimple to gcall *, replacing an is_gimple_call + with a dyn_cast. + * tree-cfgcleanup.h (fixup_noreturn_call): Strengthen param from + gimple to gcall *. + * tree-ssa-dce.c (eliminate_unnecessary_stmts): Replace + is_gimple_call with a dyn_cast, introducing local "call_stmt" and + using it in place of "stmt" for typesafety. + * tree-ssa-propagate.c (finish_update_gimple_call): Strengthen + params "new_stmt" and "stmt" from gimple to gcall *. + +2014-10-31 David Malcolm <dmalc...@redhat.com> + * config/i386/i386.c (add_condition_to_bb): Strengthen local "call_cond_stmt" from gimple to gcall *. * gimple-fold.c (gimple_build): Likewise for local "stmt". diff --git a/gcc/gimple.c b/gcc/gimple.c index b58c9db..d86ca49 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -1640,9 +1640,9 @@ gimple_set_lhs (gimple stmt, tree lhs) enum gimple_code code = gimple_code (stmt); if (code == GIMPLE_ASSIGN) - gimple_assign_set_lhs (stmt, lhs); + gimple_assign_set_lhs (as_a <gassign *> (stmt), lhs); else if (code == GIMPLE_CALL) - gimple_call_set_lhs (stmt, lhs); + gimple_call_set_lhs (as_a <gcall *> (stmt), lhs); else gcc_unreachable (); } diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 1d1aaef..1ec250b 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -8555,12 +8555,13 @@ execute_fixup_cfg (void) for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);) { gimple stmt = gsi_stmt (gsi); - tree decl = is_gimple_call (stmt) - ? gimple_call_fndecl (stmt) + gcall *call_stmt = dyn_cast <gcall *> (stmt); + tree decl = call_stmt + ? gimple_call_fndecl (call_stmt) : NULL; if (decl) { - int flags = gimple_call_flags (stmt); + int flags = gimple_call_flags (call_stmt); if (flags & (ECF_CONST | ECF_PURE | ECF_LOOPING_CONST_OR_PURE)) { if (gimple_purge_dead_abnormal_call_edges (bb)) @@ -8574,7 +8575,7 @@ execute_fixup_cfg (void) } if (flags & ECF_NORETURN - && fixup_noreturn_call (stmt)) + && fixup_noreturn_call (call_stmt)) todo |= TODO_cleanup_cfg; } diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 7383924..fc9f2af 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -645,9 +645,9 @@ split_bb_on_noreturn_calls (basic_block bb) for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { - gimple stmt = gsi_stmt (gsi); + gcall *stmt = dyn_cast <gcall *> (gsi_stmt (gsi)); - if (!is_gimple_call (stmt)) + if (!stmt) continue; if (gimple_call_noreturn_p (stmt)) diff --git a/gcc/tree-cfgcleanup.h b/gcc/tree-cfgcleanup.h index 19ff170..9538ddd 100644 --- a/gcc/tree-cfgcleanup.h +++ b/gcc/tree-cfgcleanup.h @@ -23,6 +23,6 @@ along with GCC; see the file COPYING3. If not see /* In tree-cfgcleanup.c */ extern bitmap cfgcleanup_altered_bbs; extern bool cleanup_tree_cfg (void); -extern bool fixup_noreturn_call (gimple stmt); +extern bool fixup_noreturn_call (gcall *stmt); #endif /* GCC_TREE_CFGCLEANUP_H */ diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 06ffb24..20a4e40 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -1229,11 +1229,11 @@ eliminate_unnecessary_stmts (void) something_changed = true; remove_dead_stmt (&gsi, bb); } - else if (is_gimple_call (stmt)) + else if (gcall *call_stmt = dyn_cast <gcall *> (stmt)) { - tree name = gimple_call_lhs (stmt); + tree name = gimple_call_lhs (call_stmt); - notice_special_calls (as_a <gcall *> (stmt)); + notice_special_calls (call_stmt); /* When LHS of var = call (); is dead, simplify it into call (); saving one operand. */ @@ -1243,7 +1243,7 @@ eliminate_unnecessary_stmts (void) /* Avoid doing so for allocation calls which we did not mark as necessary, it will confuse the special logic we apply to malloc/free pair removal. */ - && (!(call = gimple_call_fndecl (stmt)) + && (!(call = gimple_call_fndecl (call_stmt)) || DECL_BUILT_IN_CLASS (call) != BUILT_IN_NORMAL || (DECL_FUNCTION_CODE (call) != BUILT_IN_ALIGNED_ALLOC && DECL_FUNCTION_CODE (call) != BUILT_IN_MALLOC @@ -1260,7 +1260,7 @@ eliminate_unnecessary_stmts (void) fprintf (dump_file, "\n"); } - gimple_call_set_lhs (stmt, NULL_TREE); + gimple_call_set_lhs (call_stmt, NULL_TREE); maybe_clean_or_replace_eh_stmt (stmt, stmt); update_stmt (stmt); release_ssa_name (name); diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index 6625000..478e8b9 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -727,8 +727,8 @@ move_ssa_defining_stmt_for_defs (gimple new_stmt, gimple old_stmt) A GIMPLE_CALL STMT is being replaced with GIMPLE_CALL NEW_STMT. */ static void -finish_update_gimple_call (gimple_stmt_iterator *si_p, gimple new_stmt, - gimple stmt) +finish_update_gimple_call (gimple_stmt_iterator *si_p, gcall *new_stmt, + gcall *stmt) { gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt)); move_ssa_defining_stmt_for_defs (new_stmt, stmt); -- 1.7.11.7