Author: Armin Rigo <[email protected]>
Branch:
Changeset: r95425:a318a9cf2b74
Date: 2018-12-05 18:32 +0200
http://bitbucket.org/pypy/pypy/changeset/a318a9cf2b74/
Log: Tentative fix for issue #2904
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -11,7 +11,7 @@
from rpython.jit.metainterp.optimizeopt.shortpreamble import PreambleOp
from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp.resoperation import rop, ResOperation, OpHelpers,\
- AbstractResOp, GuardResOp
+ GuardResOp
from rpython.rlib.objectmodel import we_are_translated
from rpython.jit.metainterp.optimizeopt import info
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py
b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -6,7 +6,7 @@
from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization,
CONST_1,
CONST_0)
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from rpython.jit.metainterp.resoperation import rop, AbstractResOp
+from rpython.jit.metainterp.resoperation import rop
from rpython.jit.metainterp.optimizeopt import vstring
from rpython.jit.codewriter.effectinfo import EffectInfo
from rpython.rlib.rarithmetic import intmask
@@ -44,8 +44,9 @@
if b.has_lower and b.has_upper and b.lower == b.upper:
self.make_constant_int(box, b.lower)
- if isinstance(box, AbstractResOp):
- dispatch_bounds_ops(self, box)
+ box1 = self.optimizer.as_operation(box)
+ if box1 is not None:
+ dispatch_bounds_ops(self, box1)
def _optimize_guard_true_false_value(self, op):
return self.emit(op)
@@ -126,7 +127,8 @@
v1, v2 = v2, v1
# if both are constant, the pure optimization will deal with it
if v2.is_constant() and not v1.is_constant():
- if not self.optimizer.is_inputarg(arg1):
+ arg1 = self.optimizer.as_operation(arg1)
+ if arg1 is not None and 0: # XXX check and re-enable this
if arg1.getopnum() == rop.INT_ADD:
prod_arg1 = arg1.getarg(0)
prod_arg2 = arg1.getarg(1)
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -288,15 +288,14 @@
self._really_emitted_operation = None
self._last_guard_op = None
+ self._inparg_dict = {}
self.set_optimizations(optimizations)
self.setup()
- def init_inparg_dict_from(self, lst):
- pass
- #self.inparg_dict = {}
- #for box in lst:
- # self.inparg_dict[box] = None
+ def add_to_inparg_dict_from(self, lst):
+ for box in lst:
+ self._inparg_dict[box] = None
def set_optimizations(self, optimizations):
if optimizations:
@@ -385,9 +384,12 @@
return info.force_box(op, optforce)
return op
- def is_inputarg(self, op):
- return True
- #return op in self.inparg_dict
+ def as_operation(self, op):
+ # You should never check "isinstance(op, AbstractResOp" directly.
+ # Instead, use this helper.
+ if isinstance(op, AbstractResOp) and op not in self._inparg_dict:
+ return op
+ return None
def get_constant_box(self, box):
box = self.get_box_replacement(box)
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py
b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -10,7 +10,7 @@
from rpython.jit.metainterp.optimizeopt.info import INFO_NONNULL, INFO_NULL
from rpython.jit.metainterp.optimizeopt.util import _findall,
make_dispatcher_method
from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
- OpHelpers, AbstractResOp
+ OpHelpers
from rpython.rlib.rarithmetic import highest_bit
from rpython.rtyper.lltypesystem import llmemory
from rpython.rtyper import rclass
@@ -490,11 +490,11 @@
def postprocess_GUARD_TRUE(self, op):
box = self.get_box_replacement(op.getarg(0))
- if (isinstance(box, AbstractResOp) and
- box.getopnum() == rop.INT_IS_TRUE):
+ box1 = self.optimizer.as_operation(box)
+ if box1 is not None and box1.getopnum() == rop.INT_IS_TRUE:
# we can't use the (current) range analysis for this because
# "anything but 0" is not a valid range
- self.pure_from_args(rop.INT_IS_ZERO, [box.getarg(0)], CONST_0)
+ self.pure_from_args(rop.INT_IS_ZERO, [box1.getarg(0)], CONST_0)
self.make_constant(box, CONST_1)
def optimize_GUARD_FALSE(self, op):
@@ -502,11 +502,11 @@
def postprocess_GUARD_FALSE(self, op):
box = self.get_box_replacement(op.getarg(0))
- if (isinstance(box, AbstractResOp) and
- box.getopnum() == rop.INT_IS_ZERO):
+ box1 = self.optimizer.as_operation(box)
+ if box1 is not None and box1.getopnum() == rop.INT_IS_ZERO:
# we can't use the (current) range analysis for this because
# "anything but 0" is not a valid range
- self.pure_from_args(rop.INT_IS_TRUE, [box.getarg(0)], CONST_1)
+ self.pure_from_args(rop.INT_IS_TRUE, [box1.getarg(0)], CONST_1)
self.make_constant(box, CONST_0)
def optimize_ASSERT_NOT_NONE(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -9503,14 +9503,21 @@
# we don't store advanced virtualstate information like "i1 = i2 + 1",
# which means that the following loop, when unrolled, cannot be
# optimized based on the knowledge that "i1 = i2 + 1" from the
- # preamble---we can't use that knowledge.
+ # preamble---we can't use that knowledge. After the fix, we get
+ # the value "i2 + 1" passed as a third argument, possibly different
+ # from "i1".
ops = """
[i1, i2]
guard_value(i1, 10) []
i3 = int_add(i2, 1)
jump(i3, i2)
"""
- self.optimize_loop(ops, ops)
+ expected = """
+ [i1, i2, i3]
+ guard_value(i1, 10) []
+ jump(i3, i2, i3)
+ """
+ self.optimize_loop(ops, expected)
class TestLLtype(OptimizeOptTest, LLtypeMixin):
pass
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -10,8 +10,7 @@
from rpython.jit.metainterp.optimizeopt.vstring import StrPtrInfo
from rpython.jit.metainterp.optimizeopt.virtualstate import (
VirtualStateConstructor, VirtualStatesCantMatch)
-from rpython.jit.metainterp.resoperation import rop, ResOperation, GuardResOp,\
- AbstractResOp
+from rpython.jit.metainterp.resoperation import rop, ResOperation, GuardResOp
from rpython.jit.metainterp import compile
from rpython.rlib.debug import debug_print, debug_start, debug_stop,\
have_debug_prints
@@ -144,7 +143,7 @@
except VirtualStatesCantMatch:
raise InvalidLoop("Cannot import state, virtual states don't
match")
self.potential_extra_ops = {}
- self.optimizer.init_inparg_dict_from(label_args)
+ self.optimizer.add_to_inparg_dict_from(label_args)
try:
info, _ = self.optimizer.propagate_all_forward(
trace, call_pure_results, flush=False)
@@ -431,8 +430,9 @@
for box in self._map_args(mapping, short_jump_args)]
def _expand_info(self, arg, infos):
- if isinstance(arg, AbstractResOp) and rop.is_same_as(arg.opnum):
- info = self.optimizer.getinfo(arg.getarg(0))
+ arg1 = self.optimizer.as_operation(arg)
+ if arg1 is not None and rop.is_same_as(arg1.opnum):
+ info = self.optimizer.getinfo(arg1.getarg(0))
else:
info = self.optimizer.getinfo(arg)
if arg in infos:
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py
b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -6,8 +6,7 @@
from rpython.jit.metainterp.optimizeopt.optimizer import CONST_0, CONST_1
from rpython.jit.metainterp.optimizeopt.optimizer import llhelper, REMOVED
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from rpython.jit.metainterp.resoperation import rop, ResOperation,\
- AbstractResOp
+from rpython.jit.metainterp.resoperation import rop, ResOperation
from rpython.jit.metainterp.optimizeopt import info
from rpython.rlib.objectmodel import specialize, we_are_translated
from rpython.rlib.unroll import unrolling_iterable
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit