
In particular for Graph Regions, the terminator needs is just a historical artifact of the generalization of MLIR from CFG region. Operations like Module don't need a terminator, and before Module migrated to be an operation with region there wasn't any needed. To validate the feature, the ModuleOp is migrated to use this trait and the ModuleTerminator operation is deleted. This patch is likely to break clients, if you're in this case: - you may iterate on a ModuleOp with `getBody()->without_terminator()`, the solution is simple: just remove the ->without_terminator! - you created a builder with `Builder::atBlockTerminator(module_body)`, just use `Builder::atBlockEnd(module_body)` instead. - you were handling ModuleTerminator: it isn't needed anymore. - for generic code, a `Block::mayNotHaveTerminator()` may be used. Differential Revision: https://reviews.llvm.org/D98468
100 lines
2.5 KiB
Python
100 lines
2.5 KiB
Python
# RUN: %PYTHON %s | FileCheck %s
|
|
|
|
import gc
|
|
from mlir.ir import *
|
|
|
|
def run(f):
|
|
print("\nTEST:", f.__name__)
|
|
f()
|
|
gc.collect()
|
|
assert Context._get_live_count() == 0
|
|
|
|
|
|
# CHECK-LABEL: TEST: testContextEnterExit
|
|
def testContextEnterExit():
|
|
with Context() as ctx:
|
|
assert Context.current is ctx
|
|
try:
|
|
_ = Context.current
|
|
except ValueError as e:
|
|
# CHECK: No current Context
|
|
print(e)
|
|
else: assert False, "Expected exception"
|
|
|
|
run(testContextEnterExit)
|
|
|
|
|
|
# CHECK-LABEL: TEST: testLocationEnterExit
|
|
def testLocationEnterExit():
|
|
ctx1 = Context()
|
|
with Location.unknown(ctx1) as loc1:
|
|
assert Context.current is ctx1
|
|
assert Location.current is loc1
|
|
|
|
# Re-asserting the same context should not change the location.
|
|
with ctx1:
|
|
assert Context.current is ctx1
|
|
assert Location.current is loc1
|
|
# Asserting a different context should clear it.
|
|
with Context() as ctx2:
|
|
assert Context.current is ctx2
|
|
try:
|
|
_ = Location.current
|
|
except ValueError: pass
|
|
else: assert False, "Expected exception"
|
|
|
|
# And should restore.
|
|
assert Context.current is ctx1
|
|
assert Location.current is loc1
|
|
|
|
# All should clear.
|
|
try:
|
|
_ = Location.current
|
|
except ValueError as e:
|
|
# CHECK: No current Location
|
|
print(e)
|
|
else: assert False, "Expected exception"
|
|
|
|
run(testLocationEnterExit)
|
|
|
|
|
|
# CHECK-LABEL: TEST: testInsertionPointEnterExit
|
|
def testInsertionPointEnterExit():
|
|
ctx1 = Context()
|
|
m = Module.create(Location.unknown(ctx1))
|
|
ip = InsertionPoint(m.body)
|
|
|
|
with ip:
|
|
assert InsertionPoint.current is ip
|
|
# Asserting a location from the same context should preserve.
|
|
with Location.unknown(ctx1) as loc1:
|
|
assert InsertionPoint.current is ip
|
|
assert Location.current is loc1
|
|
# Location should clear.
|
|
try:
|
|
_ = Location.current
|
|
except ValueError: pass
|
|
else: assert False, "Expected exception"
|
|
|
|
# Asserting the same Context should preserve.
|
|
with ctx1:
|
|
assert InsertionPoint.current is ip
|
|
|
|
# Asserting a different context should clear it.
|
|
with Context() as ctx2:
|
|
assert Context.current is ctx2
|
|
try:
|
|
_ = InsertionPoint.current
|
|
except ValueError: pass
|
|
else: assert False, "Expected exception"
|
|
|
|
# All should clear.
|
|
try:
|
|
_ = InsertionPoint.current
|
|
except ValueError as e:
|
|
# CHECK: No current InsertionPoint
|
|
print(e)
|
|
else: assert False, "Expected exception"
|
|
|
|
run(testInsertionPointEnterExit)
|