PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/rpython/jit/metainterp/test/test_warmstate.py

https://bitbucket.org/pypy/pypy/
Python | 214 lines | 195 code | 19 blank | 0 comment | 2 complexity | 8eafeb1a461a3b576177e80775b8729c MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. from rpython.rtyper.test.test_llinterp import interpret
  2. from rpython.rtyper.lltypesystem import lltype, llmemory, rstr, rffi
  3. from rpython.rtyper.annlowlevel import llhelper
  4. from rpython.jit.metainterp.warmstate import wrap, unwrap, specialize_value
  5. from rpython.jit.metainterp.warmstate import equal_whatever, hash_whatever
  6. from rpython.jit.metainterp.warmstate import WarmEnterState
  7. from rpython.jit.metainterp.resoperation import InputArgInt, InputArgRef,\
  8. InputArgFloat
  9. from rpython.jit.metainterp.history import ConstInt, ConstFloat, ConstPtr,\
  10. IntFrontendOp, FloatFrontendOp, RefFrontendOp
  11. from rpython.jit.metainterp.counter import DeterministicJitCounter
  12. from rpython.jit.codewriter import longlong
  13. from rpython.rlib.rarithmetic import r_singlefloat
  14. def boxfloat(x):
  15. return InputArgFloat(longlong.getfloatstorage(x))
  16. def constfloat(x):
  17. return ConstFloat(longlong.getfloatstorage(x))
  18. def test_unwrap():
  19. S = lltype.GcStruct('S')
  20. RS = lltype.Struct('S')
  21. p = lltype.malloc(S)
  22. po = lltype.cast_opaque_ptr(llmemory.GCREF, p)
  23. assert unwrap(lltype.Void, InputArgInt(42)) is None
  24. assert unwrap(lltype.Signed, InputArgInt(42)) == 42
  25. assert unwrap(lltype.Char, InputArgInt(42)) == chr(42)
  26. assert unwrap(lltype.Float, boxfloat(42.5)) == 42.5
  27. assert unwrap(lltype.Ptr(S), InputArgRef(po)) == p
  28. assert unwrap(lltype.Ptr(RS), InputArgInt(0)) == lltype.nullptr(RS)
  29. def test_wrap():
  30. def InputArgInt(a):
  31. i = IntFrontendOp(0)
  32. i.setint(a)
  33. return i
  34. def InputArgFloat(a):
  35. i = FloatFrontendOp(0)
  36. i.setfloatstorage(a)
  37. return i
  38. def InputArgRef(a):
  39. i = RefFrontendOp(0)
  40. i.setref_base(a)
  41. return i
  42. def boxfloat(x):
  43. return InputArgFloat(longlong.getfloatstorage(x))
  44. def _is(box1, box2):
  45. return (box1.__class__ == box2.__class__ and
  46. box1.getvalue() == box2.getvalue())
  47. p = lltype.malloc(lltype.GcStruct('S'))
  48. po = lltype.cast_opaque_ptr(llmemory.GCREF, p)
  49. assert _is(wrap(None, 42), InputArgInt(42))
  50. assert _is(wrap(None, 42.5), boxfloat(42.5))
  51. assert _is(wrap(None, p), InputArgRef(po))
  52. assert _is(wrap(None, 42, in_const_box=True), ConstInt(42))
  53. assert _is(wrap(None, 42.5, in_const_box=True), constfloat(42.5))
  54. assert _is(wrap(None, p, in_const_box=True), ConstPtr(po))
  55. if longlong.supports_longlong:
  56. import sys
  57. from rpython.rlib.rarithmetic import r_longlong, r_ulonglong
  58. value = r_longlong(-sys.maxint*17)
  59. assert _is(wrap(None, value), InputArgFloat(value))
  60. assert _is(wrap(None, value, in_const_box=True), ConstFloat(value))
  61. value_unsigned = r_ulonglong(-sys.maxint*17)
  62. assert _is(wrap(None, value_unsigned), InputArgFloat(value))
  63. sfval = r_singlefloat(42.5)
  64. ival = longlong.singlefloat2int(sfval)
  65. assert _is(wrap(None, sfval), InputArgInt(ival))
  66. assert _is(wrap(None, sfval, in_const_box=True), ConstInt(ival))
  67. def test_specialize_value():
  68. assert specialize_value(lltype.Char, 0x41) == '\x41'
  69. if longlong.supports_longlong:
  70. import sys
  71. value = longlong.r_float_storage(sys.maxint*17)
  72. assert specialize_value(lltype.SignedLongLong, value) == sys.maxint*17
  73. sfval = r_singlefloat(42.5)
  74. ival = longlong.singlefloat2int(sfval)
  75. assert specialize_value(rffi.FLOAT, ival) == sfval
  76. def test_hash_equal_whatever_lltype():
  77. s1 = rstr.mallocstr(2)
  78. s2 = rstr.mallocstr(2)
  79. s1.chars[0] = 'x'; s1.chars[1] = 'y'
  80. s2.chars[0] = 'x'; s2.chars[1] = 'y'
  81. def fn(x):
  82. assert hash_whatever(lltype.typeOf(x), x) == 42
  83. assert (hash_whatever(lltype.typeOf(s1), s1) ==
  84. hash_whatever(lltype.typeOf(s2), s2))
  85. assert equal_whatever(lltype.typeOf(s1), s1, s2)
  86. fn(42)
  87. interpret(fn, [42])
  88. def test_make_unwrap_greenkey():
  89. class FakeJitDriverSD:
  90. _green_args_spec = [lltype.Signed, lltype.Float]
  91. state = WarmEnterState(None, FakeJitDriverSD())
  92. unwrap_greenkey = state.make_unwrap_greenkey()
  93. greenargs = unwrap_greenkey([ConstInt(42), constfloat(42.5)])
  94. assert greenargs == (42, 42.5)
  95. assert type(greenargs[0]) is int
  96. def test_make_jitdriver_callbacks_1():
  97. class FakeWarmRunnerDesc:
  98. cpu = None
  99. memory_manager = None
  100. rtyper = None
  101. jitcounter = DeterministicJitCounter()
  102. class FakeJitDriverSD:
  103. jitdriver = None
  104. _green_args_spec = [lltype.Signed, lltype.Float]
  105. _get_printable_location_ptr = None
  106. _confirm_enter_jit_ptr = None
  107. _get_unique_id_ptr = None
  108. _can_never_inline_ptr = None
  109. _should_unroll_one_iteration_ptr = None
  110. red_args_types = []
  111. class FakeCell:
  112. dont_trace_here = False
  113. state = WarmEnterState(FakeWarmRunnerDesc(), FakeJitDriverSD())
  114. def jit_getter(build, *args):
  115. return FakeCell()
  116. state.jit_getter = jit_getter
  117. state.make_jitdriver_callbacks()
  118. res = state.get_location_str([ConstInt(5), constfloat(42.5)])
  119. assert res == '(<unknown jitdriver>: no get_printable_location)'
  120. def test_make_jitdriver_callbacks_3():
  121. def get_location(x, y):
  122. assert x == 5
  123. assert y == 42.5
  124. return "hi there" # abuse the return type, but nobody checks it
  125. GET_LOCATION = lltype.Ptr(lltype.FuncType([lltype.Signed, lltype.Float],
  126. lltype.Ptr(rstr.STR)))
  127. class FakeWarmRunnerDesc:
  128. rtyper = None
  129. cpu = None
  130. memory_manager = None
  131. jitcounter = DeterministicJitCounter()
  132. class FakeJitDriverSD:
  133. jitdriver = None
  134. _green_args_spec = [lltype.Signed, lltype.Float]
  135. _get_printable_location_ptr = llhelper(GET_LOCATION, get_location)
  136. _confirm_enter_jit_ptr = None
  137. _can_never_inline_ptr = None
  138. _get_unique_id_ptr = None
  139. _should_unroll_one_iteration_ptr = None
  140. red_args_types = []
  141. state = WarmEnterState(FakeWarmRunnerDesc(), FakeJitDriverSD())
  142. state.make_jitdriver_callbacks()
  143. res = state.get_location_str([ConstInt(5), constfloat(42.5)])
  144. assert res == "hi there"
  145. def test_make_jitdriver_callbacks_4():
  146. def confirm_enter_jit(x, y, z):
  147. assert x == 5
  148. assert y == 42.5
  149. assert z == 3
  150. return True
  151. ENTER_JIT = lltype.Ptr(lltype.FuncType([lltype.Signed, lltype.Float,
  152. lltype.Signed], lltype.Bool))
  153. class FakeWarmRunnerDesc:
  154. rtyper = None
  155. cpu = None
  156. memory_manager = None
  157. jitcounter = DeterministicJitCounter()
  158. class FakeJitDriverSD:
  159. jitdriver = None
  160. _green_args_spec = [lltype.Signed, lltype.Float]
  161. _get_printable_location_ptr = None
  162. _confirm_enter_jit_ptr = llhelper(ENTER_JIT, confirm_enter_jit)
  163. _can_never_inline_ptr = None
  164. _get_unique_id_ptr = None
  165. _should_unroll_one_iteration_ptr = None
  166. red_args_types = []
  167. state = WarmEnterState(FakeWarmRunnerDesc(), FakeJitDriverSD())
  168. state.make_jitdriver_callbacks()
  169. res = state.confirm_enter_jit(5, 42.5, 3)
  170. assert res is True
  171. def test_make_jitdriver_callbacks_5():
  172. def can_never_inline(x, y):
  173. assert x == 5
  174. assert y == 42.5
  175. return True
  176. CAN_NEVER_INLINE = lltype.Ptr(lltype.FuncType(
  177. [lltype.Signed, lltype.Float], lltype.Bool))
  178. class FakeWarmRunnerDesc:
  179. rtyper = None
  180. cpu = None
  181. memory_manager = None
  182. jitcounter = DeterministicJitCounter()
  183. class FakeJitDriverSD:
  184. jitdriver = None
  185. _green_args_spec = [lltype.Signed, lltype.Float]
  186. _get_printable_location_ptr = None
  187. _confirm_enter_jit_ptr = None
  188. _get_unique_id_ptr = None
  189. _can_never_inline_ptr = llhelper(CAN_NEVER_INLINE, can_never_inline)
  190. _should_unroll_one_iteration_ptr = None
  191. red_args_types = []
  192. state = WarmEnterState(FakeWarmRunnerDesc(), FakeJitDriverSD())
  193. state.make_jitdriver_callbacks()
  194. res = state.can_never_inline(5, 42.5)
  195. assert res is True