[TIRX] Represent buffers as typed variables - #20062
Conversation
Make buffer identity an ordinary ir.Var carrying BufferType. The previous parallel Buffer object and pointer-typed data Var could diverge under generic IR substitution and rebuilding; BufferType is now the single source of truth, and buffer_data(buffer) is the explicit physical-pointer projection. This lets standard Var scoping, substitution, undefined-variable analysis, and identity maps handle buffers without a second object hierarchy. It also removes duplicate constructor state and representation-specific remapping from the common path. C++ migration: use BufferVar as a checked Var view, read logical metadata through buffer->..., use buffer.var() for identity, and use buffer.data() or builtin::buffer_data for the pointer projection. Metadata changes rebuild the BufferType and rebind the new Var through AllocBuffer or DeclBuffer. Python migration: constructors return tvm.ir.Var, value.ty carries BufferType, and is_buffer_var(value) is the runtime discriminator. Buffer remains a source-compatibility alias for imports and annotations, so isinstance(value, Buffer) must not be used to distinguish buffer variables.
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
|
@tvm-bot rerun |
072c9de to
81dc885
Compare
|
LLVM CI follow-up is published at The repair keeps Coverage adds a packed, parallel PrimFunc with parameter, declared, and allocated buffers. Validation includes an LLVM 18 build, all 377 tests in |
81dc885 to
52557a2
Compare
Keep physical-buffer ownership explicit after Buffer becomes a typed Var. Storage planning, vector type rewriting, cleanup, and all-reduce lowering now maintain pass-local alias-to-root maps only where liveness or allocation remapping requires them; simpler passes decode buffer_data projections locally. Replace superseded DeclBuffer bindings instead of retaining stale declarations, reject aliases whose physical source has not been registered, and repair merged tagged-memory children after their parent allocation is rebuilt. Restore the alias-lifetime and original-output regressions that exercise these invariants. Preserve the Python compatibility surface deliberately: Buffer remains an annotation/import alias, is_buffer_var is the runtime discriminator, legacy metadata properties reject non-buffer Vars with AttributeError, and dtype continues to return DataType. Validated with a clean C++ build, 239 focused passing tests (3 skipped), and the complete TIRx/S-TIR Python suite; remaining broad-suite failures require unavailable LLVM, CUDA, NKI, Torch, or target-feature support.
52557a2 to
dfa2012
Compare
This refactors TIRx buffers into ordinary
ir.Varidentities carrying animmutable
BufferType.Rationale
The old representation kept a standalone Buffer object, its logical metadata,
and a separate pointer-typed data Var. Generic Var substitution and
buffer-specific rebuilding could therefore let identity, metadata, and pointer
type drift apart. In this change,
BufferTypeis the single source of thelogical contract and
buffer_data(buffer)is the explicit physical-pointerprojection;
DeclBufferrecords a view's binding.Simplification
maps now apply directly to buffers.
BufferType, so the physical pointer andbuffer metadata cannot disagree.
constructor state, or a parallel buffer-only substitution mechanism.
at the replacing
AllocBufferorDeclBuffer.Physical-root tracking remains deliberately local to the passes whose
correctness depends on allocation ownership:
Each is a plain pass-local
Map<Var, Var>flattened when aDeclBufferisvisited. Parameters,
buffer_map, andAllocBufferseed roots; an alias to anunseen typed source is rejected rather than silently treated as a new root.
Simpler passes decode the one-step
buffer_dataprojection locally.Migration guide
C++
BufferVaras a checked view over an ordinaryVar.buffer->...; usebuffer.var()for identity.buffer.data()orbuiltin::buffer_data()only when a physical pointerexpression is required.
BufferType, create a fresh Var, and bind it atthe replacement definition site.
DeclBufferreplaces its superseded declaration consistently;it must not leave a stale declaration beside the new binding.
Python
tvm.ir.Var;.tycontainsBufferType.tvm.tirx.is_buffer_var(value)for runtime discrimination.tvm.tirx.Bufferremains an import/annotation compatibility alias fortvm.ir.Var, soisinstance(value, Buffer)matches every Var.tvm.tirxinstalls the legacy metadata properties on Var.Non-buffer Vars raise
AttributeError; buffer.dtypekeeps its historicalDataTyperesult.Behavior-preserving follow-up
The second commit restores the original LowerTIRx, FlattenBuffer, and BF16
outputs; restores the alias-lifetime regression; replaces superseded
declarations; keeps ownership logic pass-local; and fixes tagged shared-memory
children after their parent allocation is rebuilt.
Validation
USE_LLVM=OFF): passed.62 failed, 2248 passed, 1668 skipped, 11 xfailed, 1 xpassed,
1 warning, 10 collection errors in 290.09s.
were fixed and rerun green. The remaining failures and collection errors
require LLVM/target globals, CUDA, NKI, Torch, or target-feature/target-build
support unavailable on this node.
git diff --check: passed.