On 06/26/2014 04:29 PM, Jakub Jelinek wrote:
On Thu, Jun 26, 2014 at 04:27:49PM +0200, Martin Liška wrote:
Well yes - it is of course similar broken in spirit but at least a lot
simpler ;) I'd put a comment there why we do check g for NULL.
But it increases overhead, there are hundreds of gimple_location calls
and most of them will never pass NULL. Can't you simply
do what you do in the inline here in the couple of spots where
the stmt might be NULL?
Sure, do you have any suggestion how should be called such function?
Suggestion: gimple_location_or_unknown ?
gimple_location_safe or gimple_safe_location?
Jakub
Thanks, there's new patch.
Patch has been tested for Firefox with -flto -fdump-ipa-devirt.
Bootstrap and regression tests have been running.
Ready for trunk after regression tests?
ChangeLog:
2014-06-26 Martin Liska <mli...@suse.cz>
* gimple.h (gimple_safe_location): New function introduced.
* cgraphunit.c (walk_polymorphic_call_targets): Usage
of gimple_safe_location replaces gimple_location.
(gimple_fold_call): Likewise.
* ipa-devirt.c (ipa_devirt): Likewise.
* ipa-prop.c (ipa_make_edge_direct_to_target): Likewise.
* ipa.c (walk_polymorphic_call_targets): Likewise.
* tree-ssa-pre.c (eliminate_dom_walker::before_dom_children): Likewise.
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 76b2fda1..2bf5216 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -906,7 +906,7 @@ walk_polymorphic_call_targets (pointer_set_t *reachable_call_targets,
}
if (dump_enabled_p ())
{
- location_t locus = gimple_location (edge->call_stmt);
+ location_t locus = gimple_safe_location (edge->call_stmt);
dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus,
"devirtualizing call in %s to %s\n",
edge->caller->name (), target->name ());
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 403dee7..ad230be 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -387,7 +387,7 @@ fold_gimple_assign (gimple_stmt_iterator *si)
fndecl = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
if (dump_enabled_p ())
{
- location_t loc = gimple_location (stmt);
+ location_t loc = gimple_safe_location (stmt);
dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
"resolving virtual function address "
"reference to function %s\n",
@@ -1131,7 +1131,7 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
tree lhs = gimple_call_lhs (stmt);
if (dump_enabled_p ())
{
- location_t loc = gimple_location (stmt);
+ location_t loc = gimple_safe_location (stmt);
dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
"folding virtual function call to %s\n",
targets.length () == 1
diff --git a/gcc/gimple.h b/gcc/gimple.h
index ceefbc0..d401d47 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -1501,6 +1501,15 @@ gimple_location (const_gimple g)
return g->location;
}
+/* Return location information for statement G if g is not NULL.
+ Otherwise, UNKNOWN_LOCATION is returned. */
+
+static inline location_t
+gimple_safe_location (const_gimple g)
+{
+ return g ? gimple_location (g) : UNKNOWN_LOCATION;
+}
+
/* Return pointer to location information for statement G. */
static inline const location_t *
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index 21f4f11..4e5dae8 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -2080,7 +2080,7 @@ ipa_devirt (void)
{
if (dump_enabled_p ())
{
- location_t locus = gimple_location (e->call_stmt);
+ location_t locus = gimple_safe_location (e->call_stmt);
dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus,
"speculatively devirtualizing call in %s/%i to %s/%i\n",
n->name (), n->order,
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 1e10b53..c6967be 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -2673,17 +2673,11 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
if (dump_enabled_p ())
{
- const char *fmt = "discovered direct call to non-function in %s/%i, "
- "making it __builtin_unreachable\n";
-
- if (ie->call_stmt)
- {
- location_t loc = gimple_location (ie->call_stmt);
- dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, fmt,
- ie->caller->name (), ie->caller->order);
- }
- else if (dump_file)
- fprintf (dump_file, fmt, ie->caller->name (), ie->caller->order);
+ location_t loc = gimple_safe_location (ie->call_stmt);
+ dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
+ "discovered direct call to non-function in %s/%i, "
+ "making it __builtin_unreachable\n",
+ ie->caller->name (), ie->caller->order);
}
target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
@@ -2745,18 +2739,11 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
}
if (dump_enabled_p ())
{
- const char *fmt = "converting indirect call in %s to direct call to %s\n";
-
- if (ie->call_stmt)
- {
- location_t loc = gimple_location (ie->call_stmt);
+ location_t loc = gimple_safe_location (ie->call_stmt);
- dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, fmt,
- ie->caller->name (), callee->name ());
-
- }
- else if (dump_file)
- fprintf (dump_file, fmt, ie->caller->name (), callee->name ());
+ dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
+ "converting indirect call in %s to direct call to %s\n",
+ ie->caller->name (), callee->name ());
}
ie = cgraph_make_edge_direct (ie, callee);
es = inline_edge_summary (ie);
diff --git a/gcc/ipa.c b/gcc/ipa.c
index fce2e36..e3cd1a6 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -198,7 +198,7 @@ walk_polymorphic_call_targets (pointer_set_t *reachable_call_targets,
if (dump_enabled_p ())
{
- location_t locus = gimple_location (edge->call_stmt);
+ location_t locus = gimple_safe_location (edge->call_stmt);
dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus,
"devirtualizing call in %s/%i to %s/%i\n",
edge->caller->name (), edge->caller->order,
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 74238de..b6ba309 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -4367,7 +4367,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
{
if (dump_enabled_p ())
{
- location_t loc = gimple_location (stmt);
+ location_t loc = gimple_safe_location (stmt);
dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
"converting indirect call to "
"function %s\n",