| # RUN: %PYTHON %s |
| # Standalone sanity check of context life-cycle. |
| import gc |
| import mlir.ir |
| |
| assert mlir.ir.Context._get_live_count() == 0 |
| |
| # Create first context. |
| print("CREATE C1") |
| c1 = mlir.ir.Context() |
| assert mlir.ir.Context._get_live_count() == 1 |
| c1_repr = repr(c1) |
| print("C1 = ", c1_repr) |
| |
| print("GETTING AGAIN...") |
| c2 = c1._get_context_again() |
| c2_repr = repr(c2) |
| assert mlir.ir.Context._get_live_count() == 1 |
| assert c1_repr == c2_repr |
| |
| print("C2 =", c2) |
| |
| # Make sure new contexts on constructor. |
| print("CREATE C3") |
| c3 = mlir.ir.Context() |
| assert mlir.ir.Context._get_live_count() == 2 |
| c3_repr = repr(c3) |
| print("C3 =", c3) |
| assert c3_repr != c1_repr |
| print("FREE C3") |
| c3 = None |
| gc.collect() |
| assert mlir.ir.Context._get_live_count() == 1 |
| |
| print("Free C1") |
| c1 = None |
| gc.collect() |
| assert mlir.ir.Context._get_live_count() == 1 |
| print("Free C2") |
| c2 = None |
| gc.collect() |
| assert mlir.ir.Context._get_live_count() == 0 |
| |
| # Create a context, get its capsule and create from capsule. |
| c4 = mlir.ir.Context() |
| c4_capsule = c4._CAPIPtr |
| assert '"mlir.ir.Context._CAPIPtr"' in repr(c4_capsule) |
| c5 = mlir.ir.Context._CAPICreate(c4_capsule) |
| assert c4 is c5 |
| c4 = None |
| c5 = None |
| gc.collect() |
| |
| # Create a global threadpool and use it in two contexts |
| tp = mlir.ir.ThreadPool() |
| assert tp.get_max_concurrency() > 0 |
| c5 = mlir.ir.Context() |
| c5.set_thread_pool(tp) |
| assert c5.get_num_threads() == tp.get_max_concurrency() |
| assert c5._mlir_thread_pool_ptr() == tp._mlir_thread_pool_ptr() |
| c6 = mlir.ir.Context() |
| c6.set_thread_pool(tp) |
| assert c6.get_num_threads() == tp.get_max_concurrency() |
| assert c6._mlir_thread_pool_ptr() == tp._mlir_thread_pool_ptr() |
| c7 = mlir.ir.Context(thread_pool=tp) |
| assert c7.get_num_threads() == tp.get_max_concurrency() |
| assert c7._mlir_thread_pool_ptr() == tp._mlir_thread_pool_ptr() |
| assert mlir.ir.Context._get_live_count() == 3 |
| c5 = None |
| c6 = None |
| c7 = None |
| gc.collect() |
| assert mlir.ir.Context._get_live_count() == 0 |
| |
| # Test begin_transient_scope and end_transient_scope APIs |
| print("TEST TRANSIENT SCOPE") |
| ctx = mlir.ir.Context() |
| assert not ctx.is_in_transient_scope |
| |
| with ctx, mlir.ir.Location.unknown(ctx): |
| i32 = mlir.ir.IntegerType.get_signless(32) |
| |
| ctx.begin_transient_scope() |
| assert ctx.is_in_transient_scope |
| |
| # Verify exception when attempting to enter again while already active |
| try: |
| ctx.begin_transient_scope() |
| except ValueError as e: |
| assert "Context is already in a transient scope" in str(e) |
| else: |
| assert False, "Expected ValueError when entering transient scope twice" |
| |
| # Create transient types and attributes |
| vec_type = mlir.ir.VectorType.get([4], i32) |
| str_attr = mlir.ir.StringAttr.get("transient_ident") |
| assert str_attr.value == "transient_ident" |
| |
| # End transient scope back to base |
| ctx.end_transient_scope() |
| assert not ctx.is_in_transient_scope |
| |
| # Base type is intact |
| post_i32 = mlir.ir.IntegerType.get_signless(32) |
| assert post_i32 == i32 |
| |
| # Re-creating types post reset succeeds |
| new_vec_type = mlir.ir.VectorType.get([4], i32) |
| assert new_vec_type is not None |
| |
| # Test transient_scope context manager |
| with ctx.transient_scope(): |
| assert ctx.is_in_transient_scope |
| transient_f32 = mlir.ir.F32Type.get() |
| transient_vec = mlir.ir.VectorType.get([2, 2], transient_f32) |
| assert transient_vec is not None |
| |
| # Verify exception on nested transient_scope |
| try: |
| with ctx.transient_scope(): |
| pass |
| except ValueError as e: |
| assert "Context is already in a transient scope" in str(e) |
| else: |
| assert False, "Expected ValueError on nested transient_scope" |
| |
| assert not ctx.is_in_transient_scope |
| |
| ctx = None |
| i32 = None |
| post_i32 = None |
| vec_type = None |
| new_vec_type = None |
| str_attr = None |
| transient_f32 = None |
| transient_vec = None |
| gc.collect() |
| assert mlir.ir.Context._get_live_count() == 0 |