Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r44819:f6a6bbb43c28
Date: 2011-06-07 21:55 +0200
http://bitbucket.org/pypy/pypy/changeset/f6a6bbb43c28/

Log:    emit guards needed to match virtalstates before inlining the short
        preamble as the short preamble might relay on boxes belogning to the
        classes enforced by those gurads

diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py 
b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -632,8 +632,6 @@
 class OptInlineShortPreamble(Optimization):
     def __init__(self, retraced):
         self.retraced = retraced
-        self.inliner = None
-        
     
     def reconstruct_for_next_iteration(self,  short_boxes, surviving_boxes,
                                        optimizer, valuemap):
@@ -680,30 +678,28 @@
                     
                     if ok:
                         debug_stop('jit-log-virtualstate')
-                        # FIXME: Do we still need the dry run
-                        #if self.inline(sh.operations, sh.inputargs,
-                        #               op.getarglist(), dryrun=True):
+
+                        values = [self.getvalue(arg)
+                                  for arg in op.getarglist()]
+                        args = sh.virtual_state.make_inputargs(values,
+                                                               keyboxes=True)
+                        inliner = Inliner(sh.inputargs, args)
+                        
+                        for guard in extra_guards:
+                            if guard.is_guard():
+                                descr = sh.start_resumedescr.clone_if_mutable()
+                                inliner.inline_descr_inplace(descr)
+                                guard.setdescr(descr)
+                            self.emit_operation(guard)
+                        
                         try:
-                            values = [self.getvalue(arg)
-                                      for arg in op.getarglist()]
-                            args = sh.virtual_state.make_inputargs(values,
-                                                                   
keyboxes=True)
-                            self.inline(sh.operations, sh.inputargs, args)
+                            for shop in sh.operations:
+                                newop = inliner.inline_op(shop)
+                                self.emit_operation(newop)
                         except InvalidLoop:
                             debug_print("Inlining failed unexpectedly",
                                         "jumping to preamble instead")
                             self.emit_operation(op)
-                        else:
-                            jumpop = self.optimizer.newoperations.pop()
-                            assert jumpop.getopnum() == rop.JUMP
-                            for guard in extra_guards:
-                                if guard.is_guard():
-                                    descr = 
sh.start_resumedescr.clone_if_mutable()
-                                    self.inliner.inline_descr_inplace(descr)
-                                    guard.setdescr(descr)
-                                    
-                                self.emit_operation(guard)
-                            self.optimizer.newoperations.append(jumpop)
                         return
                 debug_stop('jit-log-virtualstate')
                 retraced_count = loop_token.retraced_count
@@ -728,23 +724,3 @@
                     else:
                         loop_token.failed_states.append(virtual_state)
         self.emit_operation(op)
-                
-        
-        
-    def inline(self, loop_operations, loop_args, jump_args, dryrun=False):
-        self.inliner = inliner = Inliner(loop_args, jump_args)
-
-        for op in loop_operations:
-            newop = inliner.inline_op(op)
-            if not dryrun:
-                self.emit_operation(newop)
-            else:
-                if not self.is_emittable(newop):
-                    return False
-        
-        return True
-
-    #def inline_arg(self, arg):
-    #    if isinstance(arg, Const):
-    #        return arg
-    #    return self.argmap[arg]
diff --git a/pypy/jit/metainterp/test/test_ajit.py 
b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -2499,7 +2499,7 @@
                 i += 1
             return sa
         assert self.meta_interp(f, [20]) == f(20)
-        self.check_loops(int_gt=1, int_lt=3, int_ge=3, int_le=1)
+        self.check_loops(int_gt=1, int_lt=3, int_ge=2, int_le=1)
 
     def test_intbounds_not_generalized2(self):
         myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa', 'node'])
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to