Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de>
Branch: regalloc-playground
Changeset: r92324:925ba08f5490
Date: 2017-09-03 12:05 +0200
http://bitbucket.org/pypy/pypy/changeset/925ba08f5490/

Log:    fix bug for a call argument appearing twice

diff --git a/rpython/jit/backend/x86/reghint.py 
b/rpython/jit/backend/x86/reghint.py
--- a/rpython/jit/backend/x86/reghint.py
+++ b/rpython/jit/backend/x86/reghint.py
@@ -167,24 +167,28 @@
     def hint(self, position, args, argtypes, save_all_regs):
         hinted_xmm = []
         hinted_gpr = []
+        hinted_args = []
         for i in range(len(args)):
             arg = args[i]
             if arg.type == "f":
                 tgt = self._unused_xmm()
-                if tgt is not None and not arg.is_constant():
+                if tgt is not None and not arg.is_constant() and arg not in 
hinted_args:
                     self.longevity.fixed_register(position, tgt, arg)
                     hinted_xmm.append(tgt)
+                    hinted_args.append(arg)
             elif i < len(argtypes) and argtypes[i] == 'S':
                 # Singlefloat argument
                 tgt = self._unused_xmm()
-                if tgt is not None and not arg.is_constant():
+                if tgt is not None and not arg.is_constant() and arg not in 
hinted_args:
                     self.longevity.fixed_register(position, tgt, arg)
                     hinted_xmm.append(tgt)
+                    hinted_args.append(arg)
             else:
                 tgt = self._unused_gpr()
-                if tgt is not None and not arg.is_constant():
+                if tgt is not None and not arg.is_constant() and arg not in 
hinted_args:
                     self.longevity.fixed_register(position, tgt, arg)
                     hinted_gpr.append(tgt)
+                    hinted_args.append(arg)
         # block all remaining registers that are not caller save
         # XXX the case save_all_regs == 1 (save callee-save regs + gc ptrs) is
         # no expressible atm
diff --git a/rpython/jit/backend/x86/test/test_regalloc.py 
b/rpython/jit/backend/x86/test/test_regalloc.py
--- a/rpython/jit/backend/x86/test/test_regalloc.py
+++ b/rpython/jit/backend/x86/test/test_regalloc.py
@@ -97,6 +97,22 @@
         # i0 and i1, one for the result to the stack
         assert len([entry for entry in self.log if entry.name == "mov"]) == 3
 
+    def test_call_use_argument_twice(self):
+        ops = '''
+        [i0, i1, i2, i3]
+        i7 = int_add(i0, i1)
+        i8 = int_add(i2, 13)
+        i9 = call_i(ConstClass(f2ptr), i7, i7, descr=f2_calldescr)
+        i10 = int_is_true(i9)
+        guard_true(i10) [i8]
+        finish(i9)
+        '''
+        self.interpret(ops, [5, 6, 7, 8])
+        # two moves are needed from the stack frame to registers for arguments
+        # i0 and i1, one for the result to the stack
+        # one for the copy to the other argument register
+        assert len([entry for entry in self.log if entry.name == "mov"]) == 4
+
     @pytest.mark.skip("later")
     def test_same_stack_entry_many_times(self):
         ops = '''
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to