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

Reply via email to