Author: Ronan Lamy <[email protected]>
Branch: inline-earlier
Changeset: r73894:4834be503b4d
Date: 2014-10-10 05:20 +0100
http://bitbucket.org/pypy/pypy/changeset/4834be503b4d/
Log: deJavaise r/t/b/inline.py
diff --git a/rpython/memory/gctransform/transform.py
b/rpython/memory/gctransform/transform.py
--- a/rpython/memory/gctransform/transform.py
+++ b/rpython/memory/gctransform/transform.py
@@ -125,14 +125,14 @@
if not self.prepared:
raise Exception("Need to call prepare_inline_helpers first")
if self.inline:
- raise_analyzer = RaiseAnalyzer(self.translator)
+ can_raise = RaiseAnalyzer(self.translator).can_raise
to_enum = self.graph_dependencies.get(graph, self.graphs_to_inline)
must_constfold = False
for inline_graph in to_enum:
try:
inline.inline_function(self.translator, inline_graph,
graph,
self.lltype_to_classdef,
- raise_analyzer,
+ can_raise,
cleanup=False)
must_constfold = True
except inline.CannotInline, e:
diff --git a/rpython/translator/backendopt/inline.py
b/rpython/translator/backendopt/inline.py
--- a/rpython/translator/backendopt/inline.py
+++ b/rpython/translator/backendopt/inline.py
@@ -68,16 +68,16 @@
return False
def inline_function(translator, inline_func, graph, lltype_to_classdef,
- raise_analyzer, call_count_pred=None, cleanup=True):
+ can_raise, call_count_pred=None, cleanup=True):
inliner = Inliner(translator, graph, inline_func, lltype_to_classdef,
- raise_analyzer=raise_analyzer,
+ can_raise=can_raise,
call_count_pred=call_count_pred, cleanup=cleanup)
return inliner.inline_all()
def simple_inline_function(translator, inline_func, graph):
inliner = Inliner(translator, graph, inline_func,
translator.rtyper.lltype_to_classdef_mapping(),
- raise_analyzer=RaiseAnalyzer(translator))
+ can_raise=RaiseAnalyzer(translator).can_raise)
return inliner.inline_all()
@@ -101,25 +101,24 @@
elif op.opname == "malloc" and op.result is currvar:
return Ptr(op.args[0].value), block.exits[0]
-def does_raise_directly(graph, raise_analyzer):
+def does_raise_directly(graph, can_raise):
""" this function checks, whether graph contains operations which can raise
and which are not exception guarded """
for block in graph.iterblocks():
if block is graph.exceptblock:
return True # the except block is reachable
if block.exitswitch == c_last_exception:
- consider_ops_to = -1
+ ops = block.operations[:-1]
else:
- consider_ops_to = len(block.operations)
- for op in block.operations[:consider_ops_to]:
- if raise_analyzer.can_raise(op):
- return True
+ ops = block.operations
+ if any(can_raise(op) for op in ops):
+ return True
return False
-def any_call_to_raising_graphs(from_graph, translator, raise_analyzer):
+def any_call_to_raising_graphs(from_graph, translator, can_raise):
for graph_or_something in collect_called_graphs(from_graph, translator):
if isinstance(graph_or_something, FunctionGraph):
- if does_raise_directly(graph_or_something, raise_analyzer):
+ if does_raise_directly(graph_or_something, can_raise):
return True
else:
return True # conservatively
@@ -129,7 +128,7 @@
else:
consider_ops_to = len(block.operations)
for op in block.operations[:consider_ops_to]:
- if raise_analyzer.can_raise(op):
+ if can_raise(op):
return True
return False
@@ -137,7 +136,7 @@
def __init__(self, translator, graph, lltype_to_classdef,
inline_guarded_calls=False,
inline_guarded_calls_no_matter_what=False,
- raise_analyzer=None,
+ can_raise=None,
call_count_pred=None,
cleanup=True):
self.translator = translator
@@ -147,8 +146,8 @@
# if this argument is set, the inliner will happily produce wrong code!
# it is used by the exception transformation
self.inline_guarded_calls_no_matter_what =
inline_guarded_calls_no_matter_what
- assert raise_analyzer is not None
- self.raise_analyzer = raise_analyzer
+ assert can_raise is not None
+ self.can_raise = can_raise
self.lltype_to_classdef = lltype_to_classdef
self.call_count_pred = call_count_pred
@@ -193,10 +192,10 @@
self.exception_guarded = True
if self.inline_guarded_calls:
if (not self.inline_guarded_calls_no_matter_what and
- does_raise_directly(self.graph_to_inline,
self.raise_analyzer)):
+ does_raise_directly(self.graph_to_inline, self.can_raise)):
raise CannotInline("can't inline because the call is
exception guarded")
elif any_call_to_raising_graphs(self.graph_to_inline,
- self.translator,
self.raise_analyzer):
+ self.translator, self.can_raise):
raise CannotInline("can't handle exceptions")
self._passon_vars = {}
self.entrymap = mkentrymap(self.graph_to_inline)
@@ -423,13 +422,13 @@
def __init__(self, translator, graph, inline_func, lltype_to_classdef,
inline_guarded_calls=False,
inline_guarded_calls_no_matter_what=False,
- raise_analyzer=None,
+ can_raise=None,
call_count_pred=None,
cleanup=True):
BaseInliner.__init__(self, translator, graph, lltype_to_classdef,
inline_guarded_calls,
inline_guarded_calls_no_matter_what,
- raise_analyzer,
+ can_raise,
call_count_pred,
cleanup)
self.inline_func = inline_func
@@ -629,7 +628,7 @@
valid_weight = {}
try_again = {}
lltype_to_classdef = translator.rtyper.lltype_to_classdef_mapping()
- raise_analyzer = RaiseAnalyzer(translator)
+ can_raise = RaiseAnalyzer(translator).can_raise
count = 0
while heap:
weight, _, graph = heap[0]
@@ -673,7 +672,7 @@
subcount = 0
try:
subcount = inline_function(translator, graph, parentgraph,
- lltype_to_classdef, raise_analyzer,
+ lltype_to_classdef, can_raise,
call_count_pred, cleanup=False)
to_cleanup[parentgraph] = True
res = bool(subcount)
diff --git a/rpython/translator/backendopt/test/test_inline.py
b/rpython/translator/backendopt/test/test_inline.py
--- a/rpython/translator/backendopt/test/test_inline.py
+++ b/rpython/translator/backendopt/test/test_inline.py
@@ -65,11 +65,11 @@
sanity_check(t) # also check before inlining (so we don't blame it)
if option.view:
t.view()
- raise_analyzer = canraise.RaiseAnalyzer(t)
+ can_raise = canraise.RaiseAnalyzer(t).can_raise
inliner = Inliner(t, graphof(t, in_func), func,
t.rtyper.lltype_to_classdef_mapping(),
inline_guarded_calls,
- raise_analyzer=raise_analyzer)
+ can_raise=can_raise)
inliner.inline_all()
if option.view:
t.view()
diff --git a/rpython/translator/exceptiontransform.py
b/rpython/translator/exceptiontransform.py
--- a/rpython/translator/exceptiontransform.py
+++ b/rpython/translator/exceptiontransform.py
@@ -334,7 +334,7 @@
inliner = inline.OneShotInliner(
self.translator, graph, self.lltype_to_classdef,
inline_guarded_calls=True,
inline_guarded_calls_no_matter_what=True,
- raise_analyzer=self.raise_analyzer)
+ can_raise=self.raise_analyzer.can_raise)
inliner.inline_once(block, len(block.operations)-1)
#block.exits[0].exitcase = block.exits[0].llexitcase = False
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit