This is an automated email from the ASF dual-hosted git repository.
tqchen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new f66d50df63 refactor(op-dispatch)!: dispatch tile ops through Op
attributes (#20671)
f66d50df63 is described below
commit f66d50df63f18ca8d17886c8ef8475abf8d47fbd
Author: Bohan Hou <[email protected]>
AuthorDate: Mon Oct 12 08:15:08 2026 -0400
refactor(op-dispatch)!: dispatch tile ops through Op attributes (#20671)
TileDispatch currently identifies tile Calls through `TIRxOpCategory`
and invokes fixed Python dispatcher and scope globals. Register
`FTileOpDispatch(Call, DispatchContext) -> Function` on each Op and use
that attribute for both tile detection and lowering. Resolve execution
scopes from reflected Call attributes so native C++ callbacks can run
without loading Python.
Remove the category definitions and registrations, migrate Trainium
workspace callers, and update documentation and regression coverage for
custom Ops, live callback replacement, recursive expansion, residual
Calls, and invalid results.
Downstream compatibility PR:
https://github.com/mlc-ai/TIRx-kernels/pull/10
Validation:
- Incremental C++ build and pre-commit passed.
- 54 targeted dispatch, namespace, scope, and Trainium
private-allocation tests passed.
- Standalone C++ registration and TileDispatch passed without Python,
including an initially absent dispatch attribute column.
- Extended CUDA coverage: 389 passed, 2 skipped, 24 vectorization
failures. All 24 failures reproduced on the original revision with the
same `lanes > 1` error.
- Op tests: 12 passed, 3 JSON round-trip failures. All 3 failures
reproduced on the original revision.
---
docs/tirx/api/tile_dispatch.rst | 11 +-
docs/tirx/arch/tile_dispatch.rst | 18 ++-
include/tvm/tirx/op_attr_types.h | 11 --
include/tvm/tirx/tile/dispatch.h | 16 ++-
python/tvm/backend/cuda/ptx/engine.py | 2 -
python/tvm/backend/trn/tile/private_alloc.py | 6 +-
python/tvm/tirx/tile/dispatch.py | 6 -
python/tvm/tirx/tile/instruction.py | 13 +-
src/backend/cuda/codegen/intrin_rule_cuda.cc | 5 -
src/backend/cuda/op/iket.cc | 7 --
src/backend/cuda/op/target_builtin.cc | 14 +--
src/backend/cuda/op/tcgen05.cc | 3 -
src/backend/cuda/op/tensormap.cc | 1 -
src/backend/metal/codegen/intrin_rule_metal.cc | 3 -
src/backend/metal/op/cooperative_tensor.cc | 4 -
src/backend/metal/op/target_builtin.cc | 4 -
src/backend/opencl/op/memory.cc | 3 -
src/backend/trn/op/target_builtin.cc | 2 -
src/backend/webgpu/codegen/intrin_rule_webgpu.cc | 3 -
src/tirx/op/abi.cc | 18 ---
src/tirx/op/annotation.cc | 2 -
src/tirx/op/cpu.cc | 1 -
src/tirx/op/gpu.cc | 16 ---
src/tirx/op/memory.cc | 15 ---
src/tirx/op/prim_metadata.cc | 132 +++++++--------------
src/tirx/op/region.cc | 15 +--
src/tirx/op/vector.cc | 4 -
src/tirx/tile/dispatch.cc | 11 +-
src/tirx/tile/lower.cc | 29 +++--
src/tirx/transform/split_host_device.cc | 3 +-
tests/python/tirx/iket/test_iket_profiler.py | 2 +-
tests/python/tirx/test_op.py | 5 +-
tests/python/tirx/test_op_namespace_cleanup.py | 35 ++----
.../tirx/tile/cuda/gemm/test_gemm_mma_m16n8k_.py | 2 +-
tests/python/tirx/tile/test_dispatcher.py | 85 ++++++++++++-
35 files changed, 218 insertions(+), 289 deletions(-)
diff --git a/docs/tirx/api/tile_dispatch.rst b/docs/tirx/api/tile_dispatch.rst
index 0f74e61eea..6e3b4d3ef2 100644
--- a/docs/tirx/api/tile_dispatch.rst
+++ b/docs/tirx/api/tile_dispatch.rst
@@ -24,7 +24,7 @@ The shared implementation is ``tvm.tirx.tile.instruction``;
CUDA and
Trainium's ``tile/instructions.py`` files contain the concrete contracts.
Registration installs the fixed argument count, void return type, opaque
-side effects, category, printer name, and native Call validator on the Op.
+side effects, ``FTileOpDispatch``, printer name, and native Call validator on
the Op.
The validator also runs for directly constructed Calls and printer entry.
Runtime expressions must be operands. New static qualifiers require a typed
attribute field rather than an arbitrary dictionary.
@@ -34,6 +34,15 @@ Lowerers receive a semantic view and ``DispatchContext`` and
return a
layouts for the selected core instruction. They must report unsupported
contracts rather than select a different instruction family.
+``FTileOpDispatch`` has the signature
+``(tvm.ir.Call, DispatchContext) -> tvm.tirx.Function``. Its presence
identifies
+a tile Op; no separate category registration is required. ``Instruction``
+registers an adapter that decodes the semantic view and invokes its lowerer.
+Custom implementations can register the callback directly using
+``tvm.ir.register_op_attr(op_name, "FTileOpDispatch", dispatch)`` or C++
+``OpDef::set_attr<tile::FTileOpDispatch>``. The Call must carry reflected
+attributes with a string ``scope`` field in the target's execution hierarchy.
+
Named workspace operands have fixed optional slots. Declare a workspace policy
only for instructions that own such scratch storage; do not use it to hide
caller-owned algorithms. See :doc:`../arch/tile_dispatch` for callbacks and
diff --git a/docs/tirx/arch/tile_dispatch.rst b/docs/tirx/arch/tile_dispatch.rst
index 4c963f44af..fbde2a6eec 100644
--- a/docs/tirx/arch/tile_dispatch.rst
+++ b/docs/tirx/arch/tile_dispatch.rst
@@ -27,7 +27,7 @@ types and the native Call validator are in
``src/tirx/tile/op.cc``.
The public C++ tile interfaces are grouped under ``include/tvm/tirx/tile/``:
- ``op.h`` declares the instruction registration and validation contract.
-- ``dispatch.h`` declares the dispatcher entry point.
+- ``dispatch.h`` declares ``FTileOpDispatch`` and the dispatcher entry point.
- ``exec_scope.h`` defines backend execution hierarchy nodes used by layouts
and tile calls. The shared ``tirx::ExecScope`` type remains unchanged.
- ``context.h`` defines the backend-neutral ``tile::DispatchContext`` and its
@@ -39,9 +39,10 @@ active-thread execution contexts, and predicate analysis
remain private to
``include/tvm/tirx/layout.h``.
``tirx.TileDispatch`` remains the first phase of ``LowerTIRx``.
-The pass recognizes ``Evaluate(Call)`` by the operator's ``TIRxOpCategory``:
-``tile_primitive`` or ``tile_composite``. It validates the call, resolves the
-scope against the active thread set, constructs a ``DispatchContext``, and
+The pass recognizes ``Evaluate(Call)`` by the presence of the operator's
+``FTileOpDispatch`` attribute. It validates the call, reads its reflected
+``scope`` attribute, resolves the scope against the active thread set,
+constructs a ``DispatchContext``, and
invokes the instruction's registered lowerer. It replaces the Evaluate with
the returned function body and lowers any nested tensor calls.
@@ -49,8 +50,13 @@ This preserves launch parameters, inter/intra scope maps,
value ranges,
descriptor caches, host initialization, and allocation/initialization
callbacks. Lowering occurs at a statement boundary because one instruction
may require address preparation, layout expansion, and multiple occurrences
-of the same core instruction. A residual-call verifier rejects either
-category after expansion.
+of the same core instruction. A residual-call verifier rejects any remaining
+tile instruction after expansion using the same dispatch attribute.
+
+The dispatch table is the native Op attribute registry. Python registers
+callbacks on individual Ops; C++ implementations can register the same typed
+attribute directly. The pass does not call a global Python dispatcher or
+consult a Python instruction table to identify tile Ops or resolve their scope.
There is one lowerer per instruction identity. Unsupported layouts and scopes
produce an error that includes the instruction, target, scope, and original
diff --git a/include/tvm/tirx/op_attr_types.h b/include/tvm/tirx/op_attr_types.h
index a1cd0767ad..729c62a3c1 100644
--- a/include/tvm/tirx/op_attr_types.h
+++ b/include/tvm/tirx/op_attr_types.h
@@ -56,16 +56,6 @@ using FLowerIntrinsic =
ffi::TypedFunction<PrimExpr(PrimExpr)>;
*/
using FLegalize = ffi::TypedFunction<PrimExpr(PrimExpr)>;
-/*!
- * \brief Broad TIRx op category.
- *
- * Expected values:
- * - "builtin"
- * - "tile_primitive"
- * - "device_intrin"
- */
-using TIRxOpCategory = ffi::String;
-
/*!
* \brief Device intrinsic namespace.
*
@@ -76,7 +66,6 @@ using TDeviceIntrinsicNamespace = ffi::String;
namespace op_attr {
inline constexpr const char* kGlobalSymbol = "TGlobalSymbol";
inline constexpr const char* kVectorizable = "TVectorizable";
-inline constexpr const char* kOpCategory = "TIRxOpCategory";
inline constexpr const char* kDeviceIntrinsicNamespace =
"TDeviceIntrinsicNamespace";
} // namespace op_attr
diff --git a/include/tvm/tirx/tile/dispatch.h b/include/tvm/tirx/tile/dispatch.h
index d912655664..d2672ec3f2 100644
--- a/include/tvm/tirx/tile/dispatch.h
+++ b/include/tvm/tirx/tile/dispatch.h
@@ -20,13 +20,27 @@
#ifndef TVM_TIRX_TILE_DISPATCH_H_
#define TVM_TIRX_TILE_DISPATCH_H_
+#include <tvm/ffi/function.h>
+#include <tvm/ir/op.h>
#include <tvm/tirx/function.h>
#include <tvm/tirx/tile/context.h>
namespace tvm::tirx::tile {
/*!
- * \brief Invoke the registered tile dispatcher.
+ * \brief Lower a tile instruction Call using its execution context.
+ *
+ * Registering this attribute identifies an Op as a tile instruction. The
+ * dispatcher can be implemented in C++ or registered from Python.
+ */
+using FTileOpDispatch = ffi::TypedFunction<Function(const Call&, const
DispatchContext&)>;
+
+namespace op_attr {
+inline constexpr const char* kTileOpDispatch = "FTileOpDispatch";
+} // namespace op_attr
+
+/*!
+ * \brief Invoke the Call's FTileOpDispatch attribute.
* \param call The tile instruction to lower.
* \param context The operator's execution context and accumulated callbacks.
* \return The instruction implementation, whose body is expanded by
TileDispatch.
diff --git a/python/tvm/backend/cuda/ptx/engine.py
b/python/tvm/backend/cuda/ptx/engine.py
index 5e869f671e..d86a8e18f4 100644
--- a/python/tvm/backend/cuda/ptx/engine.py
+++ b/python/tvm/backend/cuda/ptx/engine.py
@@ -107,7 +107,6 @@ def register_table(table: dict[str, InstructionEntry]) ->
None:
# other family, and `gen_stubs` already spells the attribute this way.
family = escape_token(entry.family)
register_op_attr(entry.op_name, "TScriptPrinterName",
f"tirx.ptx.{family}")
- register_op_attr(entry.op_name, "TIRxOpCategory", "device_intrin")
register_op_attr(entry.op_name, "TDeviceIntrinsicNamespace", "ptx")
register_op_attr(entry.op_name, "TFixedReturnType", PrimType("void"))
if Op.get(entry.op_name).get_attr("__tvm_doc_translate_op_call__") is
None:
@@ -126,7 +125,6 @@ def register_addr() -> None:
op.add_arg("base", "The base pointer.")
op.add_arg("byte_offset", "The offset in bytes.")
register_op_attr(_ADDR_OP_NAME, "TScriptPrinterName", "tirx.ptx.addr")
- register_op_attr(_ADDR_OP_NAME, "TIRxOpCategory", "device_intrin")
register_op_attr(_ADDR_OP_NAME, "TDeviceIntrinsicNamespace", "ptx")
register_op_attr(_ADDR_OP_NAME, "FInferType", _infer_addr_type)
if op.get_attr("__tvm_doc_translate_op_call__") is None:
diff --git a/python/tvm/backend/trn/tile/private_alloc.py
b/python/tvm/backend/trn/tile/private_alloc.py
index 3914d68337..9f0cce70a5 100644
--- a/python/tvm/backend/trn/tile/private_alloc.py
+++ b/python/tvm/backend/trn/tile/private_alloc.py
@@ -22,7 +22,7 @@ from tvm.ir import Bind, Call, DictAttrs, Stmt, Tuple
from tvm.script import tirx as T
from tvm.tirx import FloatImm, IntImm, Var
from tvm.tirx.tile import DispatchContext
-from tvm.tirx.tile.dispatch import f_op_dispatcher
+from tvm.tirx.tile.dispatch import run_dispatch
from tvm.tirx.tile.instruction import TensorCall
from tvm.tirx.tile.views import (
BinaryReduce,
@@ -105,7 +105,7 @@ def alloc_partial_reduce_trn(
) -> dict[str, Any]:
if "partial_reduce" in op.workspaces:
return {}
- f_op_dispatcher(op, sctx)
+ run_dispatch(op, sctx)
partial_reduce_tensor = None
if DispatchContext.kPrivateAlloc not in sctx.callbacks:
return {}
@@ -145,7 +145,7 @@ def alloc_unary_reduce_trn(
else:
if "const_bias" in op.workspaces and "partial_reduce" in op.workspaces:
return {}
- f_op_dispatcher(op, sctx)
+ run_dispatch(op, sctx)
partial_reduce_tensor = None
const_bias_tensor = None
if DispatchContext.kPrivateAlloc not in sctx.callbacks:
diff --git a/python/tvm/tirx/tile/dispatch.py b/python/tvm/tirx/tile/dispatch.py
index 5afbf8a1fb..12477fb3e8 100644
--- a/python/tvm/tirx/tile/dispatch.py
+++ b/python/tvm/tirx/tile/dispatch.py
@@ -20,7 +20,6 @@ Mirrors the C++ header ``include/tvm/tirx/tile/context.h``.
"""
# pylint: disable=no-member
-import tvm_ffi
from tvm_ffi import register_object
from tvm.ir import Expr, Range, Scriptable, Stmt, Var
@@ -251,8 +250,3 @@ def run_dispatch(call, sctx):
f"target={sctx.target.kind.name} scope={sctx.scope_kind}\n"
f"{error}\ncall: {view.call}"
) from error
-
-
-@tvm_ffi.register_global_func("tirx.f_op_dispatcher")
-def f_op_dispatcher(call, sctx):
- return run_dispatch(call, sctx)
diff --git a/python/tvm/tirx/tile/instruction.py
b/python/tvm/tirx/tile/instruction.py
index 755a409fb1..92082203cf 100644
--- a/python/tvm/tirx/tile/instruction.py
+++ b/python/tvm/tirx/tile/instruction.py
@@ -76,13 +76,11 @@ class Instruction:
def register(self):
if self.name in SPECS:
return SPECS[self.name]._factory
+ from .dispatch import run_dispatch
+
register_op_attr(self.name, "TCallEffectKind", 3)
register_op_attr(self.name, "TFixedReturnType", PrimType("void"))
- register_op_attr(
- self.name,
- "TIRxOpCategory",
- "tile_composite" if ".compose." in self.name else "tile_primitive",
- )
+ register_op_attr(self.name, "FTileOpDispatch", run_dispatch)
register_op_attr(self.name, "TScriptPrinterName", self.name)
op = Op.get(self.name)
op.set_signature(args=[arg.name for arg in self.operands])
@@ -367,11 +365,6 @@ class TensorCall:
return Call(self.op, args, attrs=self.call.attrs, ty=self.call.ty,
loc=self.call.loc)
-@tvm_ffi.register_global_func("tirx.TensorCallScope")
-def _scope(call):
- return ExecScope(SPECS[call.op.name].backend, str(call.attrs.scope))
-
-
for _name in (
"ScopeAttrs",
"MemoryAttrs",
diff --git a/src/backend/cuda/codegen/intrin_rule_cuda.cc
b/src/backend/cuda/codegen/intrin_rule_cuda.cc
index e2c5dcc5a1..4bbbccf694 100644
--- a/src/backend/cuda/codegen/intrin_rule_cuda.cc
+++ b/src/backend/cuda/codegen/intrin_rule_cuda.cc
@@ -290,7 +290,6 @@ void RegisterCudaIntrinRules() {
sig::arg<IntExpr>("lane", "The source thread id."),
sig::arg<IntExpr>("width", "The warp thread width, must be a power
of 2."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<1>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.__shfl_sync"))
@@ -304,7 +303,6 @@ void RegisterCudaIntrinRules() {
sig::arg<IntExpr>("delta", "The source lane id offset to be added."),
sig::arg<IntExpr>("width", "The warp thread width, must be a power
of 2."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<1>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.__shfl_up_sync"))
@@ -318,7 +316,6 @@ void RegisterCudaIntrinRules() {
sig::arg<IntExpr>("delta", "The source lane id offset to be
subtracted."),
sig::arg<IntExpr>("width", "The warp thread width, must be a power
of 2."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<1>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.__shfl_down_sync"))
@@ -332,7 +329,6 @@ void RegisterCudaIntrinRules() {
sig::arg<IntExpr>("lane_mask", "The lane mask."),
sig::arg<IntExpr>("width", "The warp thread width, must be a power
of 2."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<1>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.__shfl_xor_sync"))
@@ -342,7 +338,6 @@ void RegisterCudaIntrinRules() {
OpDef("tirx.cuda.__activemask")
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::UInt(32))
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.__activemask"))
diff --git a/src/backend/cuda/op/iket.cc b/src/backend/cuda/op/iket.cc
index e4c65a9444..24e12b5bc5 100644
--- a/src/backend/cuda/op/iket.cc
+++ b/src/backend/cuda/op/iket.cc
@@ -41,7 +41,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.cuda.iket_mark")
.signature(sig::arg("name", "The name."), sig::var_args("args"))
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
@@ -57,7 +56,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.cuda.iket_range_start")
.signature(sig::arg("name", "The name."), sig::var_args("args"))
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::UInt(32))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
@@ -73,7 +71,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.cuda.iket_range_end")
.signature(sig::arg<IntExpr>("token", "The token."),
sig::var_args("args"))
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
@@ -89,7 +86,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.cuda.iket_range_push")
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
.signature(sig::arg("name", "The name."), sig::var_args("args"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
@@ -104,7 +100,6 @@ const Op& iket_range_pop_op() {
TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.cuda.iket_range_pop")
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
@@ -120,7 +115,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.cuda.iket_sentinel_token")
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::UInt(32))
.signature(sig::arg("name", "The name."))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
@@ -132,7 +126,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::UInt(32))
.signature(sig::arg("event_id", "The event identifier."),
sig::arg("source_code", "The source code."),
sig::var_args("args"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
diff --git a/src/backend/cuda/op/target_builtin.cc
b/src/backend/cuda/op/target_builtin.cc
index 0f893fe6be..21c6f292d2 100644
--- a/src/backend/cuda/op/target_builtin.cc
+++ b/src/backend/cuda/op/target_builtin.cc
@@ -106,7 +106,6 @@ void RegisterCudaTargetBuiltins() {
true)
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.decl_tmem"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
@@ -122,7 +121,6 @@ void RegisterCudaTargetBuiltins() {
sig::arg<IntExpr>("index_c", "The C fragment index."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.bmma_sync"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -137,7 +135,6 @@ void RegisterCudaTargetBuiltins() {
sig::arg<IntExpr>("cp_size", "The copy size."),
sig::var_args("args"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("s_tir"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
@@ -152,7 +149,6 @@ void RegisterCudaTargetBuiltins() {
sig::arg<IntExpr>("dst_stride", "The destination stride."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.mma_store"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -162,7 +158,6 @@ void RegisterCudaTargetBuiltins() {
sig::arg<IntExpr>("offset", "The offset."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.mma_fill"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -174,7 +169,6 @@ void RegisterCudaTargetBuiltins() {
sig::arg<IntExpr>("group_id", "The group identifier."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.timer_init"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -187,7 +181,6 @@ void RegisterCudaTargetBuiltins() {
sig::arg("leader_cond", "The leader condition."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.timer_start"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -200,7 +193,6 @@ void RegisterCudaTargetBuiltins() {
sig::arg("leader_cond", "The leader condition."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.timer_end"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -212,7 +204,6 @@ void RegisterCudaTargetBuiltins() {
sig::arg("leader_cond", "The leader condition."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.timer_finalize"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -231,9 +222,8 @@ TVM_FFI_NO_INLINE void RegisterDeviceIntrinsicAttrs(OpDef&
def, const char* op_n
printer_name.compare(printer_name.size() - 5, 5, "_warp") == 0))) {
printer_name[printer_name.rfind('_')] = '.';
}
- def.set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
-
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
- ffi::String(op_namespace))
+
def.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
+ ffi::String(op_namespace))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(effect_kind));
if (std::string(op_namespace) != "cuda") {
def.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
diff --git a/src/backend/cuda/op/tcgen05.cc b/src/backend/cuda/op/tcgen05.cc
index 35380e8d5a..11327e6198 100644
--- a/src/backend/cuda/op/tcgen05.cc
+++ b/src/backend/cuda/op/tcgen05.cc
@@ -73,7 +73,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.cuda.tcgen05_encode_instr_descriptor")
.signature(sig::arg("desc"),
sig::call_attrs<backend::cuda::TCGen05InstrDescriptorAttrs>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
@@ -82,7 +81,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.cuda.tcgen05_encode_instr_descriptor_block_scaled")
.signature(sig::arg("desc"),
sig::call_attrs<backend::cuda::TCGen05InstrDescriptorBlockScaledAttrs>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
@@ -91,7 +89,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.cuda.tcgen05_encode_matrix_descriptor")
.signature(sig::arg("desc"), sig::arg("addr"), sig::arg<IntExpr>("ldo"),
sig::arg<IntExpr>("sdo"), sig::arg<IntExpr>("swizzle"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("cuda"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
diff --git a/src/backend/cuda/op/tensormap.cc b/src/backend/cuda/op/tensormap.cc
index a2e48ec4b4..b2256fd538 100644
--- a/src/backend/cuda/op/tensormap.cc
+++ b/src/backend/cuda/op/tensormap.cc
@@ -66,7 +66,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::var_args<PrimExpr>("args"),
sig::call_attrs<TensorMapEncodeTiledAttr>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cuda.tensormap_encode_tiled"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
diff --git a/src/backend/metal/codegen/intrin_rule_metal.cc
b/src/backend/metal/codegen/intrin_rule_metal.cc
index a3cb9cbaf1..3b2bc27b34 100644
--- a/src/backend/metal/codegen/intrin_rule_metal.cc
+++ b/src/backend/metal/codegen/intrin_rule_metal.cc
@@ -162,7 +162,6 @@ void RegisterMetalIntrinRules() {
.signature(sig::arg("var", "The variable to sync."),
sig::arg<IntExpr>("lane", "The source thread id."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<0>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("metal"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.simd_shuffle"))
@@ -173,7 +172,6 @@ void RegisterMetalIntrinRules() {
.signature(sig::arg("var", "The variable to sync."),
sig::arg<IntExpr>("delta", "The source lane id offset to be added."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<0>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("metal"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.simd_shuffle_up"))
@@ -184,7 +182,6 @@ void RegisterMetalIntrinRules() {
.signature(sig::arg("var", "The variable to sync."),
sig::arg<IntExpr>("delta", "The source lane id offset to be
subtracted."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<0>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("metal"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.simd_shuffle_down"))
diff --git a/src/backend/metal/op/cooperative_tensor.cc
b/src/backend/metal/op/cooperative_tensor.cc
index d003dedb71..d3946a74a9 100644
--- a/src/backend/metal/op/cooperative_tensor.cc
+++ b/src/backend/metal/op/cooperative_tensor.cc
@@ -43,7 +43,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("cols", "The number of columns."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.cooperative_tensor_fill"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -67,7 +66,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("operand_role", "The matrix operand role."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.cooperative_tensor_load"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -91,7 +89,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("operand_role", "The matrix operand role."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.cooperative_tensor_store"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -116,7 +113,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TScriptPrinterName>(
tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.cooperative_tensor_multiply_accumulate"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
diff --git a/src/backend/metal/op/target_builtin.cc
b/src/backend/metal/op/target_builtin.cc
index 6f375b3785..4273304937 100644
--- a/src/backend/metal/op/target_builtin.cc
+++ b/src/backend/metal/op/target_builtin.cc
@@ -47,7 +47,6 @@ void RegisterMetalTargetBuiltins() {
sig::arg<IntExpr>("row", "The row index."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.make_filled_simdgroup_matrix"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -60,7 +59,6 @@ void RegisterMetalTargetBuiltins() {
sig::arg("transpose_matrix", "Whether to transpose the
matrix."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.simdgroup_load"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -73,7 +71,6 @@ void RegisterMetalTargetBuiltins() {
sig::arg("transpose_matrix", "Whether to transpose the
matrix."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.simdgroup_store"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -86,7 +83,6 @@ void RegisterMetalTargetBuiltins() {
sig::arg("c", "The C operand."), sig::arg<IntExpr>("index_c", "The C
fragment index."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.metal.simdgroup_multiply_accumulate"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
diff --git a/src/backend/opencl/op/memory.cc b/src/backend/opencl/op/memory.cc
index 5d88c68a84..bd4ca4cb22 100644
--- a/src/backend/opencl/op/memory.cc
+++ b/src/backend/opencl/op/memory.cc
@@ -39,7 +39,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("z", "The third input value."),
sig::arg<IntExpr>("channel_size", "The number of channels."),
sig::arg<PrimExpr>("value", "The value to use."))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TVectorizable>(tvm::tirx::op_attr::kVectorizable, true)
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -57,7 +56,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("z", "The third input value."),
sig::arg<IntExpr>("channel_size", "The number of channels."),
sig::arg<PrimExpr>("element_index", "The element index within
a texture channel."))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TVectorizable>(tvm::tirx::op_attr::kVectorizable, true)
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -73,7 +71,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg("storage_scope", "The storage scope."),
sig::arg<IntExpr>("ndim", "The number of dimensions."),
sig::arg("shape", "The shape."), sig::var_args("args"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
diff --git a/src/backend/trn/op/target_builtin.cc
b/src/backend/trn/op/target_builtin.cc
index 9295bb01d1..83e44d41ee 100644
--- a/src/backend/trn/op/target_builtin.cc
+++ b/src/backend/trn/op/target_builtin.cc
@@ -56,7 +56,6 @@ void RegisterTRNTargetBuiltins() {
.signature()
.set_attr<FRegionGetBodyParams>(tvm::op_attr::kRegionGetBodyParams,
FRegionGetBodyParams::FromNative<&RegionNoBodyParams>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("nki"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
@@ -81,7 +80,6 @@ TVM_FFI_NO_INLINE NKIIntrinsicNames
MakeNKIIntrinsicNames(const char* op_name) {
TVM_FFI_NO_INLINE void RegisterNKIIntrinsicAttrs(OpDef& def, const
std::string& printer_name) {
def.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("nki"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
diff --git a/src/backend/webgpu/codegen/intrin_rule_webgpu.cc
b/src/backend/webgpu/codegen/intrin_rule_webgpu.cc
index ad2910a96b..70565ce6d2 100644
--- a/src/backend/webgpu/codegen/intrin_rule_webgpu.cc
+++ b/src/backend/webgpu/codegen/intrin_rule_webgpu.cc
@@ -188,7 +188,6 @@ void RegisterWebGPUIntrinRules() {
.signature(sig::arg("var", "The variable to sync."),
sig::arg<IntExpr>("lane", "The source thread id."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<0>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("webgpu"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.webgpu.subgroup_shuffle"))
@@ -199,7 +198,6 @@ void RegisterWebGPUIntrinRules() {
.signature(sig::arg("var", "The variable to sync."),
sig::arg<IntExpr>("delta", "The source lane id offset to be added."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<0>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("webgpu"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.webgpu.subgroup_shuffle_up"))
@@ -210,7 +208,6 @@ void RegisterWebGPUIntrinRules() {
.signature(sig::arg("var", "The variable to sync."),
sig::arg<IntExpr>("delta", "The source lane id offset to be
subtracted."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeReturnArgType<0>>())
- .set_attr<tirx::TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("device_intrin"))
.set_attr<tirx::TDeviceIntrinsicNamespace>(tvm::tirx::op_attr::kDeviceIntrinsicNamespace,
ffi::String("webgpu"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.webgpu.subgroup_shuffle_down"))
diff --git a/src/tirx/op/abi.cc b/src/tirx/op/abi.cc
index 6eab069826..1dd16b6670 100644
--- a/src/tirx/op/abi.cc
+++ b/src/tirx/op/abi.cc
@@ -64,7 +64,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg("func_name", "The function name."),
sig::var_args("args"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.call_extern"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -79,7 +78,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg("func_name", "The function name."),
sig::var_args("args"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.call_pure_extern"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -94,7 +92,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg<IntExpr>("intrin_id", "The intrinsic identifier."),
sig::var_args("args"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.call_llvm_intrin"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -109,7 +106,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg<IntExpr>("intrin_id", "The intrinsic identifier."),
sig::var_args("args"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.call_llvm_pure_intrin"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure))
.set_attr<TVectorizable>(tvm::tirx::op_attr::kVectorizable, true);
@@ -124,7 +120,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.call_spirv_pure_glsl450")
.signature(sig::arg<IntExpr>("intrin_id", "The intrinsic identifier."),
sig::var_args<PrimExpr>("args"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -140,7 +135,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("field", "The field index."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.abi_field_get"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kReadState));
}
@@ -158,7 +152,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg("value", "The value to use."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.abi_field_set"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kUpdateState));
}
@@ -173,7 +166,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.throw_last_error"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -191,7 +183,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("num", "The number of entries."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.stack_alloca"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -207,7 +198,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::var_args<IntExpr>("args"))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.stack_make_shape"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -227,7 +217,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("elem_offset", "The element offset."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.stack_make_dltensor"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -241,7 +230,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.call_packed")
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Int(32))
.signature(sig::arg("func_name", "The function name."),
sig::var_args("args"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
@@ -275,7 +263,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Int(32))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.call_ffi_kernel"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -289,7 +276,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.call_cpacked")
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Int(32))
.signature(sig::arg("func_name", "The function name."),
sig::var_args("args"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
@@ -308,7 +294,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg("args_stack", "The argument stack."),
sig::arg<IntExpr>("begin", "The start index."),
sig::arg<IntExpr>("end", "The end index."))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
@@ -327,7 +312,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg("args_stack", "The argument stack."),
sig::arg<IntExpr>("begin", "The start index."),
sig::arg<IntExpr>("end", "The end index."))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
@@ -344,7 +328,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("dtype_bits_hint", "The data type bit-width
hint."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.alloc_workspace"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TGlobalSymbol>(tvm::tirx::op_attr::kGlobalSymbol,
"TVMBackendAllocWorkspace")
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
@@ -358,7 +341,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg("ptr", "The pointer."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.free_workspace"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TGlobalSymbol>(tvm::tirx::op_attr::kGlobalSymbol,
"TVMBackendFreeWorkspace")
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
diff --git a/src/tirx/op/annotation.cc b/src/tirx/op/annotation.cc
index ea2ececdfc..7cacbe3519 100644
--- a/src/tirx/op/annotation.cc
+++ b/src/tirx/op/annotation.cc
@@ -42,7 +42,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.kernel_replace_point"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -58,7 +57,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg<PrimExpr>("predicate", "The predicate."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.ignore_loop_partition"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
diff --git a/src/tirx/op/cpu.cc b/src/tirx/op/cpu.cc
index d53af22a3e..3a26a810f0 100644
--- a/src/tirx/op/cpu.cc
+++ b/src/tirx/op/cpu.cc
@@ -43,7 +43,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.cpu_parallel_barrier"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
diff --git a/src/tirx/op/gpu.cc b/src/tirx/op/gpu.cc
index 65cd6f9839..080147ef51 100644
--- a/src/tirx/op/gpu.cc
+++ b/src/tirx/op/gpu.cc
@@ -54,7 +54,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_thread_return"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kControlJump));
}
@@ -71,7 +70,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<PrimExpr>("pred", "The predicate."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_thread_filter"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -89,7 +87,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
FInferType::FromNative<&InferTypeReturnArgType<0>>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_active_thread_selector"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -106,7 +103,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg<PrimExpr>("cond", "The condition."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_thread_invariant"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -122,7 +118,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_storage_sync"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -143,7 +138,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
FInferType::FromNative<&InferTypeReturnArgType<1>>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_warp_shuffle"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -163,7 +157,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
FInferType::FromNative<&InferTypeReturnArgType<1>>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_warp_shuffle_up"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -183,7 +176,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
FInferType::FromNative<&InferTypeReturnArgType<1>>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_warp_shuffle_down"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -204,7 +196,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
FInferType::FromNative<&InferTypeReturnArgType<1>>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_warp_shuffle_xor"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -219,7 +210,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::UInt(32))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_warp_activemask"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -240,7 +230,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_thread_allreduce"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -258,7 +247,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Int(32))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_dp4a"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -273,7 +261,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("stride", "The stride."), sig::arg("layout", "The
layout."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_load_matrix_sync"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kReadState));
}
@@ -291,7 +278,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("index_c", "The C fragment index."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_mma_sync"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -305,7 +291,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("index", "The index."), sig::arg("value", "The
value to use."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_fill_fragment"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -320,7 +305,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("stride", "The stride."), sig::arg("layout", "The
layout."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.gpu_store_matrix_sync"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
diff --git a/src/tirx/op/memory.cc b/src/tirx/op/memory.cc
index ed590a2937..7ab9034dd8 100644
--- a/src/tirx/op/memory.cc
+++ b/src/tirx/op/memory.cc
@@ -175,7 +175,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg("x", "The input value."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.reinterpret"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -191,7 +190,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeAddressOf>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.address_of"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -207,7 +205,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg("x", "The input value."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.isnullptr"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -222,7 +219,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg("ptr", "The pointer."), sig::arg<IntExpr>("rw", "The
read/write mode."),
sig::arg<IntExpr>("locality", "The locality hint."),
sig::arg<IntExpr>("cache_type", "The cache policy."))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -238,7 +234,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("byte_offset", "Offset in bytes."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.ptr_byte_offset"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -250,7 +245,6 @@ const Op& static_handle_op() {
TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.static_handle")
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kSpecialCallArg));
}
@@ -267,7 +261,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
ffi::String("tirx.handle_add_byte_offset"))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypePointerOffset<0,
-1>>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -280,7 +273,6 @@ const Op& atomic_add_op() {
TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.atomic_add")
.signature(sig::arg("ptr", "The pointer."), sig::arg("value", "The value
to use."))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kOpaque));
}
@@ -297,7 +289,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.assume_aligned"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kEmbedInfo));
}
@@ -312,7 +303,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Int(32))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.undef"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kReadState));
}
@@ -330,7 +320,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
FInferType::FromNative<&InferTypeMaskedLoad>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.masked_load"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kReadState));
}
@@ -348,7 +337,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>(tvm::op_attr::kFixedReturnType,
PrimType::Void())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.masked_store"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kUpdateState));
}
@@ -360,7 +348,6 @@ const Op& alloc_tensor_op() {
TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.alloc_tensor")
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeTensor<true>>())
.set_validator(ffi::reflection::NativeFunctionView<void(
@@ -382,7 +369,6 @@ const Op& decl_tensor_op() {
TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("tirx.decl_tensor")
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeTensor<false>>())
.set_validator(ffi::reflection::NativeFunctionView<void(
@@ -406,7 +392,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.signature(sig::arg("tensor", "The tensor variable."))
.set_attr<FInferType>(tvm::op_attr::kInferType,
FInferType::FromNative<&InferTypeTensorDataPtr>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
diff --git a/src/tirx/op/prim_metadata.cc b/src/tirx/op/prim_metadata.cc
index 6b0cca62b5..8bee3ac278 100644
--- a/src/tirx/op/prim_metadata.cc
+++ b/src/tirx/op/prim_metadata.cc
@@ -30,223 +30,179 @@ namespace tirx {
TVM_FFI_STATIC_INIT_BLOCK() {
OpDef("prim.likely")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.likely"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.likely"));
OpDef("prim.if_then_else")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.if_then_else"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.if_then_else"));
OpDef("prim.vscale")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.vscale"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.vscale"));
OpDef("prim.ceil")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.ceil"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.ceil"));
OpDef("prim.log2")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.log2"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.log2"));
OpDef("prim.clz")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.clz"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.clz"));
OpDef("prim.pow")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.pow"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.pow"));
OpDef("prim.fabs")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.fabs"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.fabs"));
OpDef("prim.fmod")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.fmod"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.fmod"));
OpDef("prim.floor")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.floor"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.floor"));
OpDef("prim.round")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.round"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.round"));
OpDef("prim.nearbyint")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.nearbyint"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.nearbyint"));
OpDef("prim.trunc")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.trunc"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.trunc"));
OpDef("prim.exp")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.exp"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.exp"));
OpDef("prim.exp2")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.exp2"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.exp2"));
OpDef("prim.exp10")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.exp10"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.exp10"));
OpDef("prim.erf")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.erf"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.erf"));
OpDef("prim.tanh")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.tanh"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.tanh"));
OpDef("prim.sigmoid")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.sigmoid"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.sigmoid"));
OpDef("prim.sqrt")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.sqrt"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.sqrt"));
OpDef("prim.rsqrt")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.rsqrt"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.rsqrt"));
OpDef("prim.log")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.log"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.log"));
OpDef("prim.log1p")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.log1p"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.log1p"));
OpDef("prim.log10")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.log10"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.log10"));
OpDef("prim.tan")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.tan"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.tan"));
OpDef("prim.cos")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.cos"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.cos"));
OpDef("prim.cosh")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.cosh"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.cosh"));
OpDef("prim.sin")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.sin"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.sin"));
OpDef("prim.sinh")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.sinh"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.sinh"));
OpDef("prim.asin")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.asin"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.asin"));
OpDef("prim.acos")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.acos"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.acos"));
OpDef("prim.atan")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.atan"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.atan"));
OpDef("prim.acosh")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.acosh"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.acosh"));
OpDef("prim.asinh")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.asinh"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.asinh"));
OpDef("prim.atanh")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.atanh"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.atanh"));
OpDef("prim.atan2")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.atan2"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.atan2"));
OpDef("prim.nextafter")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.nextafter"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.nextafter"));
OpDef("prim.hypot")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.hypot"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.hypot"));
OpDef("prim.copysign")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.copysign"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.copysign"));
OpDef("prim.ldexp")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.ldexp"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.ldexp"));
OpDef("prim.isnan")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.isnan"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.isnan"));
OpDef("prim.popcount")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.popcount"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.popcount"));
OpDef("prim.fma")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.fma"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.fma"));
OpDef("prim.assume")
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
- ffi::String("tirx.assume"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+ ffi::String("tirx.assume"));
}
} // namespace tirx
diff --git a/src/tirx/op/region.cc b/src/tirx/op/region.cc
index cbe8be5bc0..42a2a1aec5 100644
--- a/src/tirx/op/region.cc
+++ b/src/tirx/op/region.cc
@@ -62,8 +62,7 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<FRegionGetBodyParams>(tvm::op_attr::kRegionGetBodyParams,
FRegionGetBodyParams::FromNative<&LaunchThreadBodyParams>())
.set_attr<FRegionValidate>(tvm::op_attr::kRegionValidate,
-
FRegionValidate::FromNative<&ValidateBuiltinRegion>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+
FRegionValidate::FromNative<&ValidateBuiltinRegion>());
}
const Op& device_entry_op() {
@@ -91,8 +90,7 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<FRegionGetBodyParams>(tvm::op_attr::kRegionGetBodyParams,
FRegionGetBodyParams::FromNative<&RegionNoBodyParams>())
.set_attr<FRegionValidate>(tvm::op_attr::kRegionValidate,
-
FRegionValidate::FromNative<&ValidateDeviceEntry>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+
FRegionValidate::FromNative<&ValidateDeviceEntry>());
}
const Op& device_context_op() {
@@ -108,8 +106,7 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<FRegionGetBodyParams>(tvm::op_attr::kRegionGetBodyParams,
FRegionGetBodyParams::FromNative<&RegionNoBodyParams>())
.set_attr<FRegionValidate>(tvm::op_attr::kRegionValidate,
-
FRegionValidate::FromNative<&ValidateBuiltinRegion>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+
FRegionValidate::FromNative<&ValidateBuiltinRegion>());
}
const Op& compute_scope_op() {
@@ -125,8 +122,7 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<FRegionGetBodyParams>(tvm::op_attr::kRegionGetBodyParams,
FRegionGetBodyParams::FromNative<&RegionNoBodyParams>())
.set_attr<FRegionValidate>(tvm::op_attr::kRegionValidate,
-
FRegionValidate::FromNative<&ValidateBuiltinRegion>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+
FRegionValidate::FromNative<&ValidateBuiltinRegion>());
}
const Op& parallel_launch_op() {
@@ -142,8 +138,7 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<FRegionGetBodyParams>(tvm::op_attr::kRegionGetBodyParams,
FRegionGetBodyParams::FromNative<&RegionNoBodyParams>())
.set_attr<FRegionValidate>(tvm::op_attr::kRegionValidate,
-
FRegionValidate::FromNative<&ValidateBuiltinRegion>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+
FRegionValidate::FromNative<&ValidateBuiltinRegion>());
}
} // namespace tirx
diff --git a/src/tirx/op/vector.cc b/src/tirx/op/vector.cc
index 0070d08ca4..29661611d6 100644
--- a/src/tirx/op/vector.cc
+++ b/src/tirx/op/vector.cc
@@ -63,7 +63,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
FInferType::FromNative<&InferTypeVectorPart<false>>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.vector_high"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -80,7 +79,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
FInferType::FromNative<&InferTypeVectorPart<false>>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.vector_low"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -98,7 +96,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
FInferType::FromNative<&InferTypeVectorPart<true>>())
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.vector_combine"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
@@ -114,7 +111,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
sig::arg<IntExpr>("limit", "The limit value."))
.set_attr<TScriptPrinterName>(tvm::script::printer::op_attr::kScriptPrinterName,
ffi::String("tirx.get_active_lane_mask"))
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"))
.set_attr<TCallEffectKind>(tvm::op_attr::kCallEffectKind,
static_cast<int64_t>(CallEffectKind::kPure));
}
diff --git a/src/tirx/tile/dispatch.cc b/src/tirx/tile/dispatch.cc
index c0f8b65636..a5cccd7443 100644
--- a/src/tirx/tile/dispatch.cc
+++ b/src/tirx/tile/dispatch.cc
@@ -21,10 +21,13 @@
namespace tvm::tirx::tile {
Function Dispatch(const Call& call, const DispatchContext& context) {
- static auto dispatcher = ffi::Function::GetGlobal("tirx.f_op_dispatcher");
- TVM_FFI_ICHECK(dispatcher.has_value())
- << "Internal Error: tirx.f_op_dispatcher is not registered";
- Function implementation = dispatcher.value()(call, context).cast<Function>();
+ Op op = call->op.as_or_throw<Op>();
+ TVM_FFI_CHECK(Op::HasAttrMap(op_attr::kTileOpDispatch), ValueError)
+ << "No FTileOpDispatch registered for " << op->name;
+ static const auto& dispatchers =
Op::GetAttrMap<FTileOpDispatch>(op_attr::kTileOpDispatch);
+ TVM_FFI_CHECK(dispatchers.count(op), ValueError)
+ << "No FTileOpDispatch registered for " << op->name;
+ Function implementation = dispatchers[op](call, context);
TVM_FFI_ICHECK(implementation.defined()) << "TIRx dispatcher did not return
a Function";
return implementation;
}
diff --git a/src/tirx/tile/lower.cc b/src/tirx/tile/lower.cc
index 3df367cc0b..aaabf822d5 100644
--- a/src/tirx/tile/lower.cc
+++ b/src/tirx/tile/lower.cc
@@ -23,6 +23,7 @@
*/
#include <tvm/backend/cuda/attr.h>
+#include <tvm/ffi/reflection/accessor.h>
#include <tvm/ir/function.h>
#include <tvm/ir/op.h>
#include <tvm/ir/prim/op.h>
@@ -35,7 +36,6 @@
#include <tvm/tirx/op/gpu.h>
#include <tvm/tirx/op/memory.h>
#include <tvm/tirx/op/region.h>
-#include <tvm/tirx/op_attr_types.h>
#include <tvm/tirx/stmt.h>
#include <tvm/tirx/stmt_functor.h>
#include <tvm/tirx/tile/dispatch.h>
@@ -64,11 +64,10 @@ class NoOpCallVerifier : public Verifier<NoOpCallVerifier> {
using Verifier::Visit;
void Dispatch_(const CallNode* call, ffi::reflection::AccessPath path) final
{
- if (auto op = call->op.as<Op>()) {
- static const auto& categories =
- Op::GetAttrMap<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory);
- auto category = categories.get(op.value(), ffi::String(""));
- Verify(category != "tile_primitive" && category != "tile_composite")
+ if (auto op = call->op.as<Op>(); op &&
Op::HasAttrMap(tile::op_attr::kTileOpDispatch)) {
+ static const auto& dispatchers =
+
Op::GetAttrMap<tile::FTileOpDispatch>(tile::op_attr::kTileOpDispatch);
+ Verify(!dispatchers.count(op.value()))
<< "Unlowered tensor instruction " << op.value()->name << " at " <<
path;
}
Verifier::Dispatch_(call, path);
@@ -383,15 +382,21 @@ class TileDispatcher : public StmtExprMutator {
UnchangedOr<Stmt> Mutate_(const EvaluateNode* stmt, InplaceMode
inplace_mode) final {
const auto* op = stmt->value.as<CallNode>();
- if (!op || !op->op.as<Op>()) return StmtExprMutator::Mutate_(stmt,
inplace_mode);
- static const auto& categories =
Op::GetAttrMap<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory);
- auto category = categories.get(op->op.as_or_throw<Op>(), ffi::String(""));
- if (category != "tile_primitive" && category != "tile_composite") {
+ if (!op || !op->op.as<Op>() ||
!Op::HasAttrMap(tile::op_attr::kTileOpDispatch)) {
+ return StmtExprMutator::Mutate_(stmt, inplace_mode);
+ }
+ static const auto& dispatchers =
+ Op::GetAttrMap<tile::FTileOpDispatch>(tile::op_attr::kTileOpDispatch);
+ if (!dispatchers.count(op->op.as_or_throw<Op>())) {
return StmtExprMutator::Mutate_(stmt, inplace_mode);
}
op->op.as_or_throw<Op>().Validate(op);
- static auto get_scope =
ffi::Function::GetGlobalRequired("tirx.TensorCallScope");
- ExecScope scope = get_scope(ffi::GetRef<Call>(op)).cast<ExecScope>();
+ TVM_FFI_CHECK(op->attrs.has_value(), ValueError)
+ << "A tile instruction must have scope attributes";
+ auto scope_name =
+ ffi::reflection::FieldGetter(op->attrs->GetTypeKey(),
"scope")(op->attrs.value())
+ .cast<ffi::String>();
+ ExecScope scope(target_->kind->name, scope_name);
ffi::Map<ffi::String, ffi::Array<PrimExpr>> inter_map, intra_map;
ffi::String scope_kind = scope->name();
if (cuda_analysis_) {
diff --git a/src/tirx/transform/split_host_device.cc
b/src/tirx/transform/split_host_device.cc
index 829a927c9b..79e1780a10 100644
--- a/src/tirx/transform/split_host_device.cc
+++ b/src/tirx/transform/split_host_device.cc
@@ -67,8 +67,7 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<FRegionGetBodyParams>(tvm::op_attr::kRegionGetBodyParams,
FRegionGetBodyParams::FromNative<&RegionNoBodyParams>())
.set_attr<FRegionValidate>(tvm::op_attr::kRegionValidate,
-
FRegionValidate::FromNative<&ValidateDeviceScopeRegion>())
- .set_attr<TIRxOpCategory>(tvm::tirx::op_attr::kOpCategory,
ffi::String("builtin"));
+
FRegionValidate::FromNative<&ValidateDeviceScopeRegion>());
}
// Device-region annotation
diff --git a/tests/python/tirx/iket/test_iket_profiler.py
b/tests/python/tirx/iket/test_iket_profiler.py
index 15e046463b..d6e5e68de2 100644
--- a/tests/python/tirx/iket/test_iket_profiler.py
+++ b/tests/python/tirx/iket/test_iket_profiler.py
@@ -408,7 +408,7 @@ def test_public_interface_is_official_only():
)
def test_annotation_ops_are_cuda_owned(name):
op = tvm.ir.Op.get(f"tirx.cuda.iket_{name}")
- assert op.get_attr("TIRxOpCategory") == "device_intrin"
+ assert op.get_attr("FTileOpDispatch") is None
assert op.get_attr("TDeviceIntrinsicNamespace") == "cuda"
diff --git a/tests/python/tirx/test_op.py b/tests/python/tirx/test_op.py
index 396f8abbd8..7684758327 100644
--- a/tests/python/tirx/test_op.py
+++ b/tests/python/tirx/test_op.py
@@ -34,7 +34,7 @@ def test_instruction_is_a_void_call():
assert isinstance(call, Call)
assert call.ty == tvm.ir.PrimType("void")
assert call.op.get_attr("TCallEffectKind") == 3
- assert call.op.get_attr("TIRxOpCategory") == "tile_primitive"
+ assert callable(call.op.get_attr("FTileOpDispatch"))
assert call.attrs.scope == "warp"
assert call.attrs.vec_bits == 128
assert not hasattr(call, "config")
@@ -54,8 +54,7 @@ def test_roundtrip_and_exactly_one_evaluate(composite):
assert len(nodes) == 1
call = nodes[0].value
assert isinstance(call, Call)
- expected = "tile_composite" if composite else "tile_primitive"
- assert call.op.get_attr("TIRxOpCategory") == expected
+ assert callable(call.op.get_attr("FTileOpDispatch"))
parsed = tvm.script.from_source(func.script(), extra_vars={"T": T})
assert_structural_equal(func, parsed)
assert_structural_equal(func, load_json(save_json(func)))
diff --git a/tests/python/tirx/test_op_namespace_cleanup.py
b/tests/python/tirx/test_op_namespace_cleanup.py
index d6acb75cb7..dd07ea4589 100644
--- a/tests/python/tirx/test_op_namespace_cleanup.py
+++ b/tests/python/tirx/test_op_namespace_cleanup.py
@@ -36,7 +36,7 @@ def _tile_calls(func):
if (
isinstance(stmt, tvm.ir.Call)
and isinstance(stmt.op, Op)
- and stmt.op.get_attr("TIRxOpCategory") in {"tile_primitive",
"tile_composite"}
+ and stmt.op.get_attr("FTileOpDispatch") is not None
):
calls.append(stmt)
@@ -114,7 +114,7 @@ def
test_tensormap_encoding_accepts_attribute_keywords_and_defaults():
def test_kernel_replace_point_is_builtin_marker_not_tile_primitive():
- assert _op_attr("tirx.kernel_replace_point", "TIRxOpCategory") == "builtin"
+ assert _op_attr("tirx.kernel_replace_point", "FTileOpDispatch") is None
assert "tirx.tile.kernel_replace_point" not in Op.list_op_names()
assert hasattr(T, "kernel_replace_point")
assert not hasattr(T.cuda.tile, "kernel_replace_point")
@@ -177,7 +177,7 @@ def
test_device_intrinsic_namespaces_are_canonical_and_classified():
(call.op.name, _op_attr(call.op.name, "TDeviceIntrinsicNamespace"))
for call in calls
] == expected
for op_name, namespace in expected:
- assert _op_attr(op_name, "TIRxOpCategory") == "device_intrin"
+ assert _op_attr(op_name, "FTileOpDispatch") is None
assert _op_attr(op_name, "TDeviceIntrinsicNamespace") == namespace
@@ -296,7 +296,7 @@ def
test_device_intrinsic_printer_roundtrips_canonical_namespaces():
("tirx.metal.simd_shuffle_up", "metal"),
("tirx.metal.simd_shuffle_down", "metal"),
]:
- assert _op_attr(op_name, "TIRxOpCategory") == "device_intrin"
+ assert _op_attr(op_name, "FTileOpDispatch") is None
assert _op_attr(op_name, "TDeviceIntrinsicNamespace") == namespace
assert _op_attr(op_name, "TCallEffectKind") in (1, 3)
@@ -311,11 +311,8 @@ def
test_device_intrinsic_printer_roundtrips_canonical_namespaces():
assert_structural_equal(device_namespaces, reparsed)
-def test_registered_tirx_ops_have_exactly_one_category():
- if _op_attr("prim.sqrt", "TIRxOpCategory") is None:
- pytest.skip("TIRx op categories require a rebuilt C++ runtime")
-
- categories = {"builtin", "tile_primitive", "tile_composite",
"device_intrin"}
+def test_registered_tirx_ops_use_dispatch_attributes():
+ assert not Op.get("prim.sqrt").has_attr("TIRxOpCategory")
device_namespaces = {
"cuda",
"ptx",
@@ -351,38 +348,28 @@ def test_registered_tirx_ops_have_exactly_one_category():
"tirx.zero",
}
- missing = []
- invalid = []
lingering_flat_tile = []
for op_name in sorted(name for name in Op.list_op_names() if
name.startswith("tirx.")):
- category = _op_attr(op_name, "TIRxOpCategory")
+ dispatcher = _op_attr(op_name, "FTileOpDispatch")
device_namespace = _op_attr(op_name, "TDeviceIntrinsicNamespace")
- if category is None:
- missing.append(op_name)
- continue
- if category not in categories:
- invalid.append((op_name, category))
- continue
if op_name in flat_tile_only_names:
lingering_flat_tile.append(op_name)
- if category in {"tile_primitive", "tile_composite"}:
+ if dispatcher is not None:
+ assert callable(dispatcher), op_name
if not op_name.startswith(("tirx.cuda.tile.", "tirx.trn.tile.")):
lingering_flat_tile.append(op_name)
assert device_namespace is None, op_name
- elif category == "device_intrin":
+ elif device_namespace is not None:
assert device_namespace in device_namespaces, op_name
printer_name = _op_attr(op_name, "TScriptPrinterName")
assert printer_name is not None, op_name
assert printer_name.startswith("tirx." + device_namespace + "."),
op_name
assert _has_path(T, printer_name.removeprefix("tirx.")), op_name
else:
- assert category == "builtin"
- assert device_namespace is None, op_name
+ assert not op_name.startswith(("tirx.cuda.tile.",
"tirx.trn.tile.")), op_name
- assert not missing
- assert not invalid
assert not lingering_flat_tile
diff --git a/tests/python/tirx/tile/cuda/gemm/test_gemm_mma_m16n8k_.py
b/tests/python/tirx/tile/cuda/gemm/test_gemm_mma_m16n8k_.py
index 337912519e..1b56c1684e 100644
--- a/tests/python/tirx/tile/cuda/gemm/test_gemm_mma_m16n8k_.py
+++ b/tests/python/tirx/tile/cuda/gemm/test_gemm_mma_m16n8k_.py
@@ -379,7 +379,7 @@ def _lower(func):
def test_cuda_mma_sync_is_a_registered_instruction():
op = tvm.ir.Op.get("tirx.cuda.tile.mma_sync")
- assert op.get_attr("TIRxOpCategory") == "tile_primitive"
+ assert callable(op.get_attr("FTileOpDispatch"))
assert op.get_attr("TCallEffectKind") == 3
diff --git a/tests/python/tirx/tile/test_dispatcher.py
b/tests/python/tirx/tile/test_dispatcher.py
index 45364cd96a..56af11f507 100644
--- a/tests/python/tirx/tile/test_dispatcher.py
+++ b/tests/python/tirx/tile/test_dispatcher.py
@@ -20,8 +20,10 @@ from types import SimpleNamespace
import pytest
import tvm
+from tvm.ir import Call, Evaluate, Op, PrimType, Return, const, make_node,
register_op_attr
from tvm.script import tirx as T
-from tvm.tirx import decl_tensor
+from tvm.tirx import Function, decl_tensor
+from tvm.tirx.tile import DispatchContext
from tvm.tirx.tile.dispatch import run_dispatch
from tvm.tirx.tile.instruction import SPECS
@@ -77,3 +79,84 @@ def test_instruction_scope_contract(backend, scope):
raw = tvm.ir.Call(call.op, call.args, attrs=attrs, ty=call.ty)
with pytest.raises(ValueError, match=f"unsupported scope '{scope}'"):
raw.validate()
+
+
+def _custom_call(name):
+ op_name = f"test.tile_dispatch.{name}"
+ register_op_attr(op_name, "TFixedReturnType", PrimType("void"))
+ register_op_attr(op_name, "TCallEffectKind", 3)
+ op = Op.get(op_name)
+ op.set_signature(args=["token"])
+ op.set_attrs_type_key("tirx.tensor.ScopeAttrs")
+ return Call(op, [const(7)], attrs=make_node("tirx.tensor.ScopeAttrs"))
+
+
+def _lower(body):
+ func = Function([], body).with_attr("target", tvm.target.Target("cuda"))
+ return tvm.tirx.transform.TileDispatch()(tvm.IRModule({"main":
func}))["main"]
+
+
+def test_op_attribute_dispatches_without_python_instruction_spec():
+ # Initialize the pass's cached attribute view before adding a new Op.
+ _lower(Evaluate(0))
+ call = _custom_call("custom")
+ assert call.op.name not in SPECS
+ seen = []
+
+ @register_op_attr(call.op.name, "FTileOpDispatch")
+ def dispatch(actual_call, context):
+ assert actual_call.same_as(call)
+ assert isinstance(context, DispatchContext)
+ assert context.target.kind.name == "cuda"
+ assert context.exec_scope.backend == "cuda"
+ assert context.scope_kind == "thread"
+ seen.append(actual_call)
+ return Function([], Evaluate(23))
+
+ lowered = _lower(Evaluate(call))
+ assert len(seen) == 1
+ assert lowered.body.seq[0].value == 23
+
+ # The live native attribute map observes a replacement on the same Op.
+ register_op_attr(
+ call.op.name,
+ "FTileOpDispatch",
+ lambda actual_call, context: Function([], Evaluate(41)),
+ override=True,
+ )
+ assert _lower(Evaluate(call)).body.seq[0].value == 41
+
+
+def test_dispatch_recursively_expands_tile_implementations():
+ outer = _custom_call("outer")
+ inner = _custom_call("inner")
+ register_op_attr(
+ outer.op.name, "FTileOpDispatch", lambda call, context: Function([],
Evaluate(inner))
+ )
+ register_op_attr(
+ inner.op.name, "FTileOpDispatch", lambda call, context: Function([],
Evaluate(31))
+ )
+ assert _lower(Evaluate(outer)).body.seq[0].value == 31
+
+
+def test_op_without_dispatch_attribute_is_preserved():
+ call = _custom_call("ordinary")
+ assert call.op.get_attr("FTileOpDispatch") is None
+ assert _lower(Evaluate(call)).body.seq[0].value.same_as(call)
+
+
+def test_residual_tile_call_is_rejected():
+ call = _custom_call("residual")
+ register_op_attr(
+ call.op.name, "FTileOpDispatch", lambda call, context: Function([],
Evaluate(0))
+ )
+ # Dispatch expands statement-boundary Calls; other positions must be
rejected.
+ with pytest.raises(tvm.error.InternalError, match="Failed to lower the
TIRx program"):
+ _lower(Return(call))
+
+
+def test_dispatch_requires_function_result():
+ call = _custom_call("invalid_result")
+ register_op_attr(call.op.name, "FTileOpDispatch", lambda call, context:
Evaluate(0))
+ with pytest.raises(TypeError, match="tirx.Function"):
+ _lower(Evaluate(call))