This is an important core dialect that has not been exposed previously. Set up the default bindings generation and provide a nicer wrapper for the `for` loop with access to the loop configuration and body. Depends On D110758 Reviewed By: stellaraccident Differential Revision: https://reviews.llvm.org/D110759
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
# RUN: %PYTHON %s | FileCheck %s
|
|
|
|
from mlir.ir import *
|
|
from mlir.dialects import scf
|
|
from mlir.dialects import builtin
|
|
|
|
|
|
def run(f):
|
|
print("\nTEST:", f.__name__)
|
|
f()
|
|
return f
|
|
|
|
|
|
# CHECK-LABEL: TEST: testSimpleLoop
|
|
@run
|
|
def testSimpleLoop():
|
|
with Context(), Location.unknown():
|
|
module = Module.create()
|
|
index_type = IndexType.get()
|
|
with InsertionPoint(module.body):
|
|
|
|
@builtin.FuncOp.from_py_func(index_type, index_type, index_type)
|
|
def simple_loop(lb, ub, step):
|
|
loop = scf.ForOp(lb, ub, step, [lb, lb])
|
|
with InsertionPoint(loop.body):
|
|
scf.YieldOp(loop.inner_iter_args)
|
|
return
|
|
|
|
# CHECK: func @simple_loop(%[[ARG0:.*]]: index, %[[ARG1:.*]]: index, %[[ARG2:.*]]: index)
|
|
# CHECK: scf.for %{{.*}} = %[[ARG0]] to %[[ARG1]] step %[[ARG2]]
|
|
# CHECK: iter_args(%[[I1:.*]] = %[[ARG0]], %[[I2:.*]] = %[[ARG0]])
|
|
# CHECK: scf.yield %[[I1]], %[[I2]]
|
|
print(module)
|
|
|
|
|
|
# CHECK-LABEL: TEST: testInductionVar
|
|
@run
|
|
def testInductionVar():
|
|
with Context(), Location.unknown():
|
|
module = Module.create()
|
|
index_type = IndexType.get()
|
|
with InsertionPoint(module.body):
|
|
|
|
@builtin.FuncOp.from_py_func(index_type, index_type, index_type)
|
|
def induction_var(lb, ub, step):
|
|
loop = scf.ForOp(lb, ub, step, [lb])
|
|
with InsertionPoint(loop.body):
|
|
scf.YieldOp([loop.induction_variable])
|
|
return
|
|
|
|
# CHECK: func @induction_var(%[[ARG0:.*]]: index, %[[ARG1:.*]]: index, %[[ARG2:.*]]: index)
|
|
# CHECK: scf.for %[[IV:.*]] = %[[ARG0]] to %[[ARG1]] step %[[ARG2]]
|
|
# CHECK: scf.yield %[[IV]]
|
|
print(module)
|