projects
/
libfirm
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
2e3f88f
)
optimize graphs that got calls inlined
author
Michael Beck
<beck@ipd.info.uni-karlsruhe.de>
Thu, 12 Oct 2006 21:22:57 +0000
(21:22 +0000)
committer
Michael Beck
<beck@ipd.info.uni-karlsruhe.de>
Thu, 12 Oct 2006 21:22:57 +0000
(21:22 +0000)
[r8344]
ir/ir/irgopt.c
patch
|
blob
|
history
diff --git
a/ir/ir/irgopt.c
b/ir/ir/irgopt.c
index
f41a758
..
a91ea7f
100644
(file)
--- a/
ir/ir/irgopt.c
+++ b/
ir/ir/irgopt.c
@@
-21,6
+21,7
@@
#include "ircons.h"
#include "iropt_t.h"
#include "ircons.h"
#include "iropt_t.h"
+#include "cfopt.h"
#include "irgopt.h"
#include "irgmod.h"
#include "irgwalk.h"
#include "irgopt.h"
#include "irgmod.h"
#include "irgwalk.h"
@@
-1357,6
+1358,7
@@
typedef struct {
int n_call_nodes_orig; /**< for statistics */
int n_callers; /**< Number of known graphs that call this graphs. */
int n_callers_orig; /**< for statistics */
int n_call_nodes_orig; /**< for statistics */
int n_callers; /**< Number of known graphs that call this graphs. */
int n_callers_orig; /**< for statistics */
+ int got_inline; /**< Set, if at leat one call inside this graph was inlined. */
} inline_irg_env;
/**
} inline_irg_env;
/**
@@
-1372,6
+1374,7
@@
static inline_irg_env *alloc_inline_irg_env(struct obstack *obst) {
env->n_call_nodes_orig = 0;
env->n_callers = 0;
env->n_callers_orig = 0;
env->n_call_nodes_orig = 0;
env->n_callers = 0;
env->n_callers_orig = 0;
+ env->got_inline = 0;
return env;
}
return env;
}
@@
-1548,6
+1551,8
@@
void inline_leave_functions(int maxsize, int leavesize, int size, int ignore_run
if (did_inline) {
/* Do some statistics */
inline_irg_env *callee_env = (inline_irg_env *)get_irg_link(callee);
if (did_inline) {
/* Do some statistics */
inline_irg_env *callee_env = (inline_irg_env *)get_irg_link(callee);
+
+ env->got_inline = 1;
--env->n_call_nodes;
env->n_nodes += callee_env->n_nodes;
--callee_env->n_callers;
--env->n_call_nodes;
env->n_nodes += callee_env->n_nodes;
--callee_env->n_callers;
@@
-1590,7
+1595,9
@@
void inline_leave_functions(int maxsize, int leavesize, int size, int ignore_run
}
if (inline_method(call, callee)) {
inline_irg_env *callee_env = (inline_irg_env *)get_irg_link(callee);
}
if (inline_method(call, callee)) {
inline_irg_env *callee_env = (inline_irg_env *)get_irg_link(callee);
+
/* callee was inline. Append it's call list. */
/* callee was inline. Append it's call list. */
+ env->got_inline = 1;
--env->n_call_nodes;
append_call_list(&obst, env, callee_env->call_head);
env->n_call_nodes += callee_env->n_call_nodes;
--env->n_call_nodes;
append_call_list(&obst, env, callee_env->call_head);
env->n_call_nodes += callee_env->n_call_nodes;
@@
-1620,8
+1627,16
@@
void inline_leave_functions(int maxsize, int leavesize, int size, int ignore_run
for (i = 0; i < n_irgs; ++i) {
irg = get_irp_irg(i);
env = (inline_irg_env *)get_irg_link(irg);
for (i = 0; i < n_irgs; ++i) {
irg = get_irp_irg(i);
env = (inline_irg_env *)get_irg_link(irg);
- if ((env->n_call_nodes_orig != env->n_call_nodes) ||
- (env->n_callers_orig != env->n_callers))
+
+ if (env->got_inline) {
+ /* this irg got calls inlined */
+ set_irg_outs_inconsistent(irg);
+ set_irg_doms_inconsistent(irg);
+
+ optimize_graph_df(irg);
+ optimize_cf(irg);
+ }
+ if (env->got_inline || (env->n_callers_orig != env->n_callers))
DB((dbg, SET_LEVEL_1, "Nodes:%3d ->%3d, calls:%3d ->%3d, callers:%3d ->%3d, -- %s\n",
env->n_nodes_orig, env->n_nodes, env->n_call_nodes_orig, env->n_call_nodes,
env->n_callers_orig, env->n_callers,
DB((dbg, SET_LEVEL_1, "Nodes:%3d ->%3d, calls:%3d ->%3d, callers:%3d ->%3d, -- %s\n",
env->n_nodes_orig, env->n_nodes, env->n_call_nodes_orig, env->n_call_nodes,
env->n_callers_orig, env->n_callers,