[pypy-svn] r51384 - in pypy/dist/pypy/jit/codegen/cli: . test

antocuni at codespeak.net antocuni at codespeak.net
Mon Feb 11 14:25:20 CET 2008


Author: antocuni
Date: Mon Feb 11 14:25:18 2008
New Revision: 51384

Modified:
   pypy/dist/pypy/jit/codegen/cli/operation.py
   pypy/dist/pypy/jit/codegen/cli/rgenop.py
   pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py
Log:
delay the rendering of the return blocks until the end() of the code
generation; this is needed to make the CLI verifier happy; two more
tests pass



Modified: pypy/dist/pypy/jit/codegen/cli/operation.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/operation.py	(original)
+++ pypy/dist/pypy/jit/codegen/cli/operation.py	Mon Feb 11 14:25:18 2008
@@ -90,7 +90,7 @@
             self.inputargs_gv[i].store(self.il)
         self.il.Emit(OpCodes.Br, self.label)
 
-class BranchIf(Operation):
+class Branch(Operation):
     
     def __init__(self, il, gv_cond, opcode, label):
         self.il = il
@@ -102,7 +102,8 @@
         return None
 
     def emit(self):
-        self.gv_cond.load(self.il)
+        if self.gv_cond is not None:
+            self.gv_cond.load(self.il)
         self.il.Emit(self.opcode, self.label)
 
 class Return(Operation):

Modified: pypy/dist/pypy/jit/codegen/cli/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/cli/rgenop.py	Mon Feb 11 14:25:18 2008
@@ -219,8 +219,7 @@
         self.isOpen = False
         self.operations = []
         self.branches = []
-        self.retlabel = self.il.DefineLabel()
-        self.gv_returnvar = None
+        self.returnblocks = []
 
     @specialize.arg(1)
     def genop1(self, opname, gv_arg):
@@ -269,12 +268,17 @@
     def appendbranch(self, branch):
         self.branches.append(branch)
 
+    def appendreturn(self, retlabel, gv_returnvar):
+        self.returnblocks.append((retlabel, gv_returnvar))
+
     def start_writing(self):
         self.isOpen = True
 
     def finish_and_return(self, sigtoken, gv_returnvar):
-        self.il.Emit(OpCodes.Br, self.retlabel)
-        self.gv_returnvar = gv_returnvar
+        retlabel = self.il.DefineLabel()
+        op = ops.Branch(self.il, None, OpCodes.Br, retlabel)
+        self.emit(op)
+        self.appendreturn(retlabel, gv_returnvar)
         self.isOpen = False
 
     def finish_and_goto(self, outputargs_gv, target):
@@ -289,10 +293,11 @@
         for branch in self.branches:
             branch.replayops()
 
-        # render the return block for last, else the verifier could complain
-        self.il.MarkLabel(self.retlabel)
-        op = ops.Return(self.il, self.gv_returnvar)
-        self.emit(op)
+        # render the return blocks for last, else the verifier could complain
+        for retlabel, gv_returnvar in self.returnblocks:
+            self.il.MarkLabel(retlabel)
+            op = ops.Return(self.il, gv_returnvar)
+            self.emit(op)
 
         # build the delegate
         delegate_type = sigtoken2clitype(self.sigtoken)
@@ -310,7 +315,7 @@
 
     def _jump_if(self, gv_condition, opcode):
         label = self.il.DefineLabel()
-        op = ops.BranchIf(self.il, gv_condition, opcode, label)
+        op = ops.Branch(self.il, gv_condition, opcode, label)
         self.emit(op)
         branch = BranchBuilder(self, label)
         self.appendbranch(branch)
@@ -341,17 +346,15 @@
         # test_goto_compile to see why it fails
         return Builder.genop2(self, opname, gv_arg1, gv_arg2)
 
-    def finish_and_return(self, sigtoken, gv_returnvar):
-        op = ops.Return(self.parent.il, gv_returnvar)
-        self.emit(op)
-        self.isOpen = False
-
     def emit(self, op):
         self.operations.append(op)
 
     def appendbranch(self, branch):
         self.parent.appendbranch(branch)
 
+    def appendreturn(self, retlabel, gv_returnvar):
+        self.parent.appendreturn(retlabel, gv_returnvar)
+
     def replayops(self):
         assert not self.isOpen
         assert not self.parent.isOpen

Modified: pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py	Mon Feb 11 14:25:18 2008
@@ -21,6 +21,8 @@
         'test_longwinded_and',
         'test_condition_result_cross_link_direct',
         'test_multiple_cmps',
+        'test_flipped_cmp_with_immediate',
+        'test_tight_loop',
         ]
 
     for p in prefixes:



More information about the Pypy-commit mailing list