)]}'
{
  "log": [
    {
      "commit": "54bbcb5261f8ad3ceead7e57c78de70583b4857e",
      "tree": "3ae551dc5fab92ca5b854e29b092c86e006faae3",
      "parents": [
        "288a273f664ad5bc5f0038f3e992a7547ce70ddc"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Thu Nov 05 13:25:38 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 13:25:38 2026 -0500"
      },
      "message": "[Rust] Narrow primitive-expression APIs to PrimExpr (#205)\n\n# [Rust] Narrow primitive-expression APIs to PrimExpr\n\nFollow-up to #204. The Rust bindings now type primitive expressions the\nway C++ does. Where C++ takes or holds a `PrimExpr`, Rust now takes or\nholds a `PrimExpr` too, checked by the compiler instead of at run time.\nOperators apply only to primitive expressions, and a variable used in\narithmetic is a `PrimVar`, as in C++.\n\n## Changes\n\n- **`IntoExpr\u003cT\u003e` is one blanket over `IntoObjectRef\u003cT\u003e`.**\n- The impl is `impl\u003cT, S: IntoObjectRef\u003cT\u003e\u003e IntoExpr\u003cT\u003e for S`. tvm-ffi\ngenerates `IntoObjectRef\u003cT\u003e` for every upcast, so each subtype of `T`,\nowned or borrowed, is an `IntoExpr\u003cT\u003e` with no list to maintain.\n- The only per-target code is the literals\u0027 `IntoObjectRef` impls and\n`ExprResult`\u0027s `IntoExpr\u003cExpr\u003e` and `IntoExpr\u003cPrimExpr\u003e`.\n- This replaces #204\u0027s `ExprOutput`, which accepted any `Expr` as an\n`IntoExpr\u003cPrimExpr\u003e` and checked it at run time. `Expr`, `Var` and\n`Call` are no longer `IntoExpr\u003cPrimExpr\u003e`. Check them first with\n`downcast_ref` (borrowed, C++ `as`) or `try_cast` (owned, C++\n`as_or_throw`).\n- **New `PrimVar`.**\n- A typed view of a `Var` whose type is a `PrimType` (C++ `PrimVar`).\n`PrimVar::new(name, ty, loc)` cannot fail.\n- A `PrimVar` converts into `Var`, `PrimExpr` and `Expr` for free, and\ntakes part in arithmetic.\n- Its check, `type_str` and mismatch text follow C++\n`TypeTraits\u003cPrimVar\u003e`: it accepts a `Var`, not a subclass, and names the\ntype `ir.Var`.\n- `typed_expr_view!` now takes the viewed reference, the check and the\nmismatch description.\n- **Prim nodes.**\n- `Add`, ..., `Cast`, `Select`, `Let`, `Not`, `BitwiseNot`, `Ramp`,\n`Broadcast` and `Shuffle` hold `PrimExpr` operands and upcast to\n`PrimExpr`.\n- They are typed by a `PrimType`: `from_fields` takes one, so a node\nalways upcasts to a valid `PrimExpr`.\n  - Their `new` takes `impl IntoExpr\u003cPrimExpr\u003e`.\n  - `Range` holds `PrimExpr` bounds.\n- **Operators.**\n- `+ - * \u0026 | ^ \u003c\u003c \u003e\u003e`, unary `-`/`!` and `PrimOps` apply only to\nsubtypes of `PrimExpr`. `Expr`, `Var` and `Call` lose them.\n`def_expr_op_over_loads!` requires `Into\u003cPrimExpr\u003e`.\n- The functions of `prim::op` take `impl IntoExpr\u003cPrimExpr\u003e` or\n`Operand` and return `PrimExpr`. `convert` still returns `Expr`.\n- `ExprResult` drops its inherent `into_expr`, which shadowed the trait\nmethod. `PrimExpr::try_from` takes the expression out.\n- **sym.**\n- These take and return `PrimExpr`: the `Analyzer` methods, `IntSet`,\n`IntervalSet`, `deduce_bound`, the region bounds, the iterator-map\nfunctions and `pos_inf`/`neg_inf`.\n- The iterator and canonical forms (`IterMapExpr`, `IterSplitExpr`,\n`IterSumExpr`, `SplitExpr`, `SumExpr`) upcast to `PrimExpr`.\n- `IterMark`, the constraint fields and the split and sum getters are\n`PrimExpr`.\n- **Statements and tirx types follow C++.**\n  - `For` holds a `PrimVar` and `PrimExpr` bounds.\n- These are `PrimExpr`: the conditions of `If`, `While` and\n`AssertStmt`; the indices and value of `TensorStore`; `TensorType`\nshapes; layout `Iter` extents and strides; `IndexMap` final indices; and\n`DispatchContext` launch parameters.\n- `logaddexp`, `fast_erf_float_expr` and `gpu_thread_return` take and\nreturn `PrimExpr`.\n- **Kept as `Expr`, where C++ uses `Expr`:** `Evaluate.value`,\n`reinterpret`, `convert`, `LambdaExpr` bodies and `Subscript`.\n- **Docs and examples.** The Rust IR guide, `examples/ir_guides/rust`\nand `examples/extension_guides/rust` use `PrimVar` and `PrimExpr`.\n\nThe bindings are narrowed through stubgen `field`, `upcast` and\n`nullable` directives, and no generated block is edited by hand. #203\nwrote `use std::borrow::Borrow` lines into generated import sections,\nwhich regeneration would delete. They now come from `import-object`\ndirectives."
    },
    {
      "commit": "288a273f664ad5bc5f0038f3e992a7547ce70ddc",
      "tree": "f2eaedd344a83f06f989ffe792292c28e45b290c",
      "parents": [
        "3edd4f1d905481984a278ab56f24f10d80fe3878"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Nov 05 11:48:32 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 11:48:32 2026 -0500"
      },
      "message": "[Rust] Generalize IntoExpr to IntoExpr\u003cT\u003e on IntoObjectRef; bump tvm-ffi to 34fafd9e (#204)\n\nBumps `3rdparty/tvm-ffi` to 34fafd9e (apache/tvm-ffi#933,\n`IntoObjectRef\u003cT\u003e`) and rebuilds `IntoExpr` on it.\n\n- **`IntoExpr\u003cT \u003d Expr\u003e` on `IntoObjectRef`.** `IntoExpr` (the `Expr`\ntarget, so existing `impl IntoExpr` bounds are unchanged) is a blanket\nover `IntoObjectRef\u003cExpr\u003e`, which tvm-ffi generates for every upcast.\nEvery expression type converts, owned or borrowed, with no per-type\nlist. Rust literals implement `IntoObjectRef\u003cExpr\u003e` and convert the same\nway.\n- **`IntoExpr\u003cPrimExpr\u003e`.** The same values, checked as a `PrimExpr` in\nplace: an owned expression moves, a borrowed one (`\u0026Expr`, `\u0026Var`,\n`\u0026Add`, ...) borrows as `\u0026PrimExpr` without a reference-count change,\nand an expression of another type is a `TypeError`. `ExprResult`\nconverts directly. `TensorLoad::new` now takes its indices as `impl\nIntoExpr\u003cPrimExpr\u003e` instead of checking each with `PrimExpr::try_from`.\n- **`ExprResult::into_expr`.** It returns the `Expr`, so a direct call\non an operator\u0027s result needs no annotation now that the trait has a\ntarget parameter."
    },
    {
      "commit": "3edd4f1d905481984a278ab56f24f10d80fe3878",
      "tree": "9e45654d9bf564f9c1f4dc951ad1ca3b10d8a103",
      "parents": [
        "1527bc67f2f769015b809a7169b3752fe7afdba4"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Nov 05 10:16:58 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 10:16:58 2026 -0500"
      },
      "message": "[Rust] Borrow references in IntoExpr; bump tvm-ffi to a21f5fa7 (#203)\n\nBumps `3rdparty/tvm-ffi` to a21f5fa7, which brings in apache/tvm-ffi#930\n(borrowed upcasts through `AsRef`) and #931 (`downcast_ref`,\n`#[dispatch]` and `match_any!` borrowing reference types in place), and\nuses them in TIRx.\n\n- **`IntoExpr` borrows references.** The trait has an associated\n`Output: Borrow\u003cExpr\u003e + Into\u003cExpr\u003e`. An owned value or a literal\nconverts into an owned `Expr`, as before. A reference to an expression\ntype (`\u0026Expr`, `\u0026Var`, `\u0026PrimExpr`, ...) borrows as `\u0026Expr` with no\nreference-count change, so `analyzer.can_prove(\u0026cond, ..)` no longer\nclones. Read-only functions borrow with `.borrow()`. Constructors take\nownership with `into_owned_expr()`, which clones only a borrowed\nexpression. Owned values keep a blanket impl. References are listed per\nexpression type, because blanket impls over `T` and `\u0026T` overlap under\nRust\u0027s coherence rules.\n- **Typed views.** `typed_expr_view!` gives `PrimExpr` and `IntExpr` the\nin-place borrow impls that `#[derive(ObjectRef)]` generates\n(`downcast_ref`, `\u0026PrimExpr` handlers and `PrimExpr(ref x)` arms). The\nhand-written `AsRef\u003cPrimExpr\u003e for IntExpr` is removed in favor of the\none the upcast macro now generates.\n- **Examples.** The IR guide\u0027s `match_any!`, `#[dispatch]`, walk and\nvisit examples borrow reference types (`Add(ref add)`, `\u0026Add`, `\u0026For`,\n`\u0026If`) in place of object types, and the guard examples call\n`can_prove(\u0026branch.condition, ..)`."
    },
    {
      "commit": "1527bc67f2f769015b809a7169b3752fe7afdba4",
      "tree": "c259b66e1dde4c7eafe462e55cb1c3c947f27c24",
      "parents": [
        "391dec40a5cd667c7a40b7e963af3f7e7c411fba"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Nov 05 09:28:17 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 09:28:17 2026 -0500"
      },
      "message": "[Rust] Bump tvm-ffi to 55b4fad0 for the Rust API renames (#202)\n\nBumps `3rdparty/tvm-ffi` to 55b4fad0 (apache/tvm-ffi#929) and adapts the\nRust crate to its API changes:\n\n- `Array::new(items)` becomes `Array::from_vec(items)`; `Array::new()`\nnow creates an empty array.\n- `UnchangedOr::value_or` becomes `value_or_unchanged`.\n- `Map::contains_key` returns `Result\u003cbool\u003e`.\n- `Array` indexing now lends `\u0026T` in place, so `seq[i]` gives a `\u0026Stmt`."
    },
    {
      "commit": "391dec40a5cd667c7a40b7e963af3f7e7c411fba",
      "tree": "920e9d4ae97e04555105883902a792dea44b7841",
      "parents": [
        "a200af70cb0d9bb7961b813d09c7c32d86f90ada"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Thu Nov 05 09:17:44 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 09:17:44 2026 -0500"
      },
      "message": "[DOCS] Clarify programming guides and CUDA tile examples (#201)\n\nClarify the Programming Guides with consistent type notation and more\nexplicit examples.\n\n- Standardize dtype arguments on `T.*` types and show `T.float32x4`\nexplicitly in the vector-access example.\n- Add a `break`/`continue` example and improve introductory text.\n- Explain the differences between `tile.apply` and `tile.ewise`, their\noperand shapes, and equivalent add-one implementations."
    },
    {
      "commit": "a200af70cb0d9bb7961b813d09c7c32d86f90ada",
      "tree": "8af942ec4cb3fd93222766bc560670656c97351a",
      "parents": [
        "506a9686e2af0fb5d705885ff029059d44cb08c4"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Nov 05 00:09:48 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 00:09:48 2026 -0500"
      },
      "message": "[BUILD] Drop the packaging dependency and bump to 0.1.0b1 (#200)\n\nDrops the `packaging` runtime and test dependency and bumps the version\nto 0.1.0b1.\n\n- The Triton version checks in `tirx/script/ir_builder/triton.py` and\n`tests/python/codegen/test_triton.py` compare the leading `(major,\nminor)` integers directly.\n- The Pygments \u003e\u003d 2.4 check in the script printer is removed; 2.4 dates\nfrom 2019.\n- The crate publication workflow installs `packaging` for its own\nrelease-version check, which previously came in through\n`apache-tvm-tirx`.\n- Version 0.1.0b0 -\u003e 0.1.0b1 in `pyproject.toml`, `CMakeLists.txt`,\n`include/tvm/runtime/base.h`, `libinfo.py` and the LLVM targets wheel."
    },
    {
      "commit": "506a9686e2af0fb5d705885ff029059d44cb08c4",
      "tree": "3bd0291de29aea41521086ca38348f35d009a435",
      "parents": [
        "37e6ef030b87995be00520cc126fc0f5a6f65a99"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Wed Nov 04 22:35:42 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 22:35:42 2026 -0500"
      },
      "message": "[DOCS][Rust] Add std-style rustdoc to the TIRx Rust API (#199)\n\nRestyle the rustdoc of the TIRx Rust API after apache/tvm-ffi#926 and\nthe Rust Book. Each item has a one-sentence summary that names its\nparameters, and an Errors section only for a specific condition, checked\nagainst the C++ sources. Module docs and the key top-level APIs have\nrunnable examples.\n\n- Generated types cannot carry docs, so their examples are in the module\ndocs.\n- The crate has 63 doctests, up from 14, and the examples that were\nno_run now run.\n- Only comments change, plus the doc string literals that `binary_new!`\nand the `_at` operator macros turn into `#[doc]` attributes. The stubgen\nblocks are untouched."
    },
    {
      "commit": "37e6ef030b87995be00520cc126fc0f5a6f65a99",
      "tree": "48fb1c680723988123eab3e114ddd49f33b09448",
      "parents": [
        "9780ccbc3f778c3531b47c57ef7837d44dc743e4"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Wed Nov 04 20:30:13 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 20:30:13 2026 -0500"
      },
      "message": "[DOCS] Illustrate TIRx authoring layers with an HTML diagram (#196)\n\nThis PR replaces the authoring-layer table and ASCII flowchart in\nProgramming Guides with an embedded HTML/CSS diagram. It shows core\nlanguage constructs throughout one TIRx program, tile expansion into\ncore IR and backend calls, and a thin direct backend interface."
    },
    {
      "commit": "9780ccbc3f778c3531b47c57ef7837d44dc743e4",
      "tree": "6a9e0d83cf6d45b829577caa8105d43fec27fe70",
      "parents": [
        "dcc02de11f3880ca17171af5930283e4677c599f"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Nov 04 20:11:51 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 20:11:51 2026 -0500"
      },
      "message": "[Rust] Bump tvm-ffi, construct WalkResult::InterruptWith directly; link blog post in README (#197)\n\nThis PR bumps `3rdparty/tvm-ffi` to b94b787b, which brings:\n\n- apache/tvm-ffi#927, which removes `WalkResult::interrupt_with`.\n`WalkResult` is a plain enum, so the payload variant is built directly:\n`WalkResult::InterruptWith(value.into())`.\n- apache/tvm-ffi#926, which adds std-style rustdoc to the core Rust\nAPIs.\n\nThe Rust IR guide example, its doc and the constraint-context walk test\nmove to `WalkResult::InterruptWith`.\n\nIt also adds the blog post to the README link line, next to\nDocumentation and Quick Start."
    },
    {
      "commit": "dcc02de11f3880ca17171af5930283e4677c599f",
      "tree": "c2784a16cc1ca5af61b98f86e44c507324f005c6",
      "parents": [
        "24173d5ce4662fb12a2b78686704b39af4c27828"
      ],
      "author": {
        "name": "Bohan Hou",
        "email": "spectrometerh@gmail.com",
        "time": "Wed Nov 04 17:53:51 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 17:53:51 2026 -0500"
      },
      "message": "[DOCS] Link README to the compiler foundation blog post (#195)"
    },
    {
      "commit": "24173d5ce4662fb12a2b78686704b39af4c27828",
      "tree": "02732b72213a22cce72cbe240becfcac7d774f34",
      "parents": [
        "123543a6274f29685bdb09e813f8dc9ef41729ee"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Nov 04 16:22:34 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 16:22:34 2026 -0500"
      },
      "message": "[Rust] Update TVM FFI and use Result\u003cUnchangedOr\u003cAny\u003e\u003e map and mutate results (#194)\n\nThis PR updates TVM FFI to include apache/tvm-ffi#925, which makes\n`Result\u003cUnchangedOr\u003cAny\u003e\u003e` the result of Rust structural map and mutate\ndispatchers, and migrates TIRx to it.\n\n- The constraint-aware map and mutate adapters require dispatchers\nproducing `Option\u003cResult\u003cUnchangedOr\u003cAny\u003e\u003e\u003e`. The map adapter returns\nrecursion results directly and checks for the unchanged marker with\n`is_unchanged()`.\n- The constraint-aware mutation test, the IR guide and extension guide\nexamples, and their docs use `Result\u003cUnchangedOr\u003cAny\u003e\u003e` handlers.\nHandlers return `default_mutate` directly and keep a value with\n`Unchanged.into()`.\n- The TVM FFI update also brings in apache/tvm-ffi#920, #922, and #924."
    },
    {
      "commit": "123543a6274f29685bdb09e813f8dc9ef41729ee",
      "tree": "f95443a97e1b9333d1914869c45cfa8ee0bfefd8",
      "parents": [
        "d7347e6cc39453e2c4a115068400abed9e1f8101"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Wed Nov 04 16:07:43 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 16:07:43 2026 -0500"
      },
      "message": "[Fix][CUDA] Align device target architecture detection (#193)\n\nThis pr appends the architecture-specific suffix for detected CUDA\ndevices with compute capability 9.0 or later, matching the existing C++\ndefaults. Document the compatibility policy and cover both input forms,\narchitecture boundaries, and nonzero device indices."
    },
    {
      "commit": "d7347e6cc39453e2c4a115068400abed9e1f8101",
      "tree": "f0b951498a05db92b57c9333e65ff158715b7ad5",
      "parents": [
        "95518b05d2004e1b880a6916ced1025a6a2da026"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Nov 04 15:54:28 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 15:54:28 2026 -0500"
      },
      "message": "[FIX] Drop cancelled iterator-map splits before fusion (#191)\n\nDrop iterator splits whose combined scale is zero before fusion,\navoiding a divide-by-zero for predicates such as `i - i \u003e\u003d 0`.\n\nConstraints with no remaining iterator terms keep the existing\nnormalization failure: `detect_iter_map` returns an unsuccessful result,\nwhile `iter_map_simplify` retains its safe fallback. This change does\nnot add proof rules for empty constraints.\n\nAddresses apache/tvm#20843. Related: apache/tvm-tirx#127. The zero-scale\nremoval follows ShawnNotFound\u0027s change in that PR.\n\n---------\n\nCo-authored-by: ShawnNotFound \u003cssj13363381203@163.com\u003e"
    },
    {
      "commit": "95518b05d2004e1b880a6916ced1025a6a2da026",
      "tree": "b8f271604ed8559686acc731862786690a9be96b",
      "parents": [
        "74d2576bf841542aa92c6be7be3280cd4a73c2c2"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Nov 04 14:45:53 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 14:45:53 2026 -0500"
      },
      "message": "[DOCS][Rust] Add constraint-aware traversal and clarify visitors and mutators (#192)\n\nThis PR updates the Working with IR in Rust guide now that the Rust\nconstraint-aware structural utilities are available (#187, #189).\n\n- Add a Constraint-Aware Traversal section. It explains why the\nutilities collect facts for us, lists how facts reach the callback for\nthe walk, map, visit, and mutate versions, and uses a guarded `add_one`\nto show a walk that proves the bounds check and a map that removes it.\nThe Rust example crate gains `proven_guards` and\n`remove_redundant_guards`, called from the driver. This replaces the\nlong constraint-context note at the end of Visitors and Mutators.\n- Rewrite the opening of Visitors and Mutators to start from why a\ntraversal would control its own recursion, and explain the mutation\nexample after showing it, including `MutationView` and when a node is\nupdated in place.\n- Explain the `Pattern` and `Simple` definition kinds in Definitions and\nUses.\n- Add Quick Reference rows for `structural_visit`/`structural_mutate`\nand the constraint-aware utilities, and an intro bullet for the new\nsection."
    },
    {
      "commit": "74d2576bf841542aa92c6be7be3280cd4a73c2c2",
      "tree": "fb5932668f89cc44fa339959746c19ed1b2ce433",
      "parents": [
        "fc4ebf822e0bb3eaebfcc3e024d1477e1ea93b41"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Nov 04 13:58:02 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:58:02 2026 -0500"
      },
      "message": "[Rust] Add constraint-aware structural map and mutation (#189)\n\nAdd Rust constraint-aware structural map and mutation using the shared\ngeneric mutation engine. Ordered map callbacks and explicit mutation\nhandlers observe lexical binding, predicate, and range facts derived\nfrom rewritten values, with definition regions and scope restoration\npreserved.\n\nSeparate the native semantic base from engine-owned remap storage so\nRust can use the complete native-compatible context layout. Compose the\nnative factory and legacy mutator with the shared engine, and check live\nownership before specialized in-place descent."
    },
    {
      "commit": "fc4ebf822e0bb3eaebfcc3e024d1477e1ea93b41",
      "tree": "4b7cfddeff87868bb2e7544882d2c553e3162260",
      "parents": [
        "28071049d3a490387a657bfc3108066856028a7d"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Wed Nov 04 13:57:49 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:57:49 2026 -0500"
      },
      "message": "[REFACTOR] Rename examples/extension (#190)\n\n## Summary\n\nThis PR renames `examples/extension` to `examples/extension_guides`,\nmatching `examples/ir_guides`\nand `examples/programming_guides`, and splits the two versions of the\nextension into sibling\nPython projects, `rust/` and `python/`. Each has its own\n`pyproject.toml` and installs the same\ndistribution, `my-ext`, with the same package, `my_ext`, so\n`run_example.py` runs unchanged with\nwhichever one is installed.\n\n### Layout\n\n```text\nexamples/extension_guides/\n├── README.md\n├── run_example.py          # shared by both versions\n├── rust/                   # the extension in Rust\n│   ├── Cargo.toml, CMakeLists.txt, rustfmt.toml, .gitignore\n│   ├── pyproject.toml      # scikit-build-core, wheel.packages \u003d [\"my_ext\"]\n│   ├── src/lib.rs\n│   └── my_ext/__init__.py  # was python/my_ext/__init__.py\n└── python/                 # the same extension in Python\n    ├── pyproject.toml      # setuptools, pure Python\n    └── my_ext/__init__.py  # was my_ext_py/my_ext.py\n```\n\nAll files are moved as they were, except:\n\n- `rust/Cargo.toml`: the path dependencies on `rust/` and\n`3rdparty/tvm-ffi` gain one `../`.\n- `rust/pyproject.toml`: `wheel.packages` is `[\"my_ext\"]`.\n- `python/pyproject.toml` (new): a setuptools project with the package\n`my_ext`.\n- `python/my_ext/__init__.py`: the module docstring points to\n`rust/my_ext`.\n\nBecause both projects are named `my-ext`, installing one replaces the\nother. The Python version is\nnow installed instead of being put on `PYTHONPATH`:\n\n```bash\nuv pip install --no-deps ./examples/extension_guides/python\npython examples/extension_guides/run_example.py\n```"
    },
    {
      "commit": "28071049d3a490387a657bfc3108066856028a7d",
      "tree": "802fa078e9319ab7f954addfe585df7521600157",
      "parents": [
        "7e49a148b8f7ce00c0e0d5629d1b4c4d46d1c3f9"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Nov 04 13:54:29 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:54:29 2026 -0500"
      },
      "message": "[DOCS] Add a Writing Builder Code section with @T.function.builder (#188)\n\nThis PR adds a Writing Builder Code subsection to the Printing and\nParsing guide, now that `@T.function.builder` is available.\n\nThe subsection gathers the existing raw `IRBuilder` example and the\nexplanation of why builder code stays in the Python domain, which now\nnotes it is especially helpful for agents. It then shows\n`@T.function.builder` building `add_one` with the same signature as\n`@T.function`. The `line_trace_scope()` note becomes a sentence\ncontrasting raw `IRBuilder` code with the decorator, which records\nsource locations automatically."
    },
    {
      "commit": "7e49a148b8f7ce00c0e0d5629d1b4c4d46d1c3f9",
      "tree": "ad8e0559f5adf0b1f3a69138ce7140771050b212",
      "parents": [
        "60a0722f3028ea6aa6e2ad9e7db61fb32ab92f18"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Nov 04 11:58:52 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 11:58:52 2026 -0500"
      },
      "message": "[Rust] Add constraint-aware structural visit and walk (#187)\n\nRust constraint-aware visitors and walkers inspect the binding, range\nand guard facts active at each TIRx node. A complete native-compatible\nbase supplies constraint state and sparse native default hooks to the\nshared TVM-FFI visitor engine. Visit and walk reuse `IntoDispatcher` for\nowned or borrowed dispatchers, typed callbacks and nested callback\ntuples; the walk adapter adds context observation and pre/post control.\n\nThe actual `ConstraintContext` types mirror native parent and\ncaptured-prefix semantics. Clones remain live, snapshots capture\nprefixes, and typed analyzer synchronization consumes those contexts.\nInterior mutability covers native updates without retaining references\nacross recursive descent. Complete private layouts require matching\nnative headers and builds.\n\nThe dependency is merged TVM-FFI upstream\n`3e906bc685ea45624bc80e8d7b7d86497d492af3`, including shared dispatcher\nconversion and the safe borrowed type-attribute lookup. The C++ context\nconstructor parameter is renamed to `parent_prefix_size` to match the\nRust `with_parent_prefix_size` API."
    },
    {
      "commit": "60a0722f3028ea6aa6e2ad9e7db61fb32ab92f18",
      "tree": "93aa9e9d86760cf46896e28306dee40b5b8767bb",
      "parents": [
        "df86f98793888a9f4f92fc0d138345f58258e64f"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Wed Nov 04 11:41:47 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 11:41:47 2026 -0500"
      },
      "message": "[REFACTOR][RUST] refactor the rust files for readibility (#186)\n\n## Summary\n\nThis PR reorganizes the Rust bindings so that each file opens with the\ntypes it is about. It moves\ntwo groups of generated bindings into the files that the crate\u0027s layout\nrule assigns them, brings\nthe core types of `ir/prim/op.rs`, `ir/expr.rs` and six smaller files to\nthe top, and places the\nhand-written constructors and methods beside the generated blocks of\ntheir types.\n\nOnly the layout changes. Code moves as it was; the additions are section\nheaders, module docs, a\nnote on where `typed_expr_view!` is used, a comment on the literal\nconversions, one `binary_new!`\ninvocation per node, and the path `crate::r#macro::typed_expr_view!` at\nthe two typed views.\nPublic paths are unchanged through the existing re-exports\n(`sym::ConstraintContext`,\n`tirx::StructuralVisitorWithConstraintContext`, `ir::PrimExpr`,\n`ir::prim::ExprResult`, ...).\n\nSigned-off-by: Yuchuan \u003cyuchuan.7streams@gmail.com\u003e"
    },
    {
      "commit": "df86f98793888a9f4f92fc0d138345f58258e64f",
      "tree": "0486d8d32a3f206ef84ccc58f290b59f8045c7dd",
      "parents": [
        "00163899f872f413a0fd6678755fb4147f7b7372"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Wed Nov 04 00:17:26 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 00:17:26 2026 -0500"
      },
      "message": "[Rust] Update TVM FFI and rename rs_class to rs_object (#185)\n\n## Summary\n\nThis PR updates the TVM FFI submodule to the latest apache/tvm-ffi main\nand follows its rename\nof the attribute macro that defines an object type in Rust, from\n`#[rs_class]` to\n`#[rs_object]`. The macro\u0027s arguments and behavior are unchanged.\n\n### TVM FFI update\n\n`3rdparty/tvm-ffi` moves from `9c834da` to `afa8dce`, which adds:\n\n- apache/tvm-ffi#904: faster structural traversal checks and dispatch;\n- apache/tvm-ffi#908: `rs_class` renamed to `rs_object`.\n\n### Rename\n\nEvery use of `rs_class` now uses `rs_object`:\n\n- **Crate:** the crate docs in `rust/src/lib.rs` and the docs of\n`ir::register_type` in\n  `rust/src/ir/type_def.rs`, including their examples;\n- **Examples:** `rust/examples/define_ir.rs` and the complex-number\nextension in\n  `examples/extension/src/lib.rs`;\n- **Tests:** `rust/tests/ir/op_def.rs` and `rust/tests/ir/type.rs`;\n- **Docs:** `docs/advanced/defining_ir_extensions.rst`.\n\nThe generated bindings do not change: `tvm-ffi-stubgen --check` passes.\n\n## Testing\n\nVerified locally on Linux, with the `.venv` TVM FFI reinstalled from the\nnew submodule commit:\n\n- `cargo test --manifest-path rust/Cargo.toml`, doc tests included: all\npass.\n- `cargo doc --no-deps` with `RUSTDOCFLAGS\u003d\"-D warnings\"`: the links to\n`tvm_ffi::rs_object`\n  resolve.\n- `tvm-ffi-stubgen rust/src --target rust --dlls\nbuild/lib/libtvm_tirx_compiler.so --check`.\n- `pytest tests/python/ir/test_op_rust.py`: 7 passed, including the\nextension example.\n- The Sphinx HTML build with `-W`, using CI\u0027s Sphinx 8.1.3 and docutils\n0.21.2.\n- `cargo fmt --check` for both crates and pre-commit on the changed\nfiles."
    },
    {
      "commit": "00163899f872f413a0fd6678755fb4147f7b7372",
      "tree": "99a1d353ffc545068e0e73ba69206bd1b421f481",
      "parents": [
        "ad4a6794e6747b7e006ae1a7e58430900b5ec9af"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Tue Nov 03 20:57:25 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 20:57:25 2026 -0500"
      },
      "message": "[FIX][CUDA] Register void result types for several functions (#184)\n\n## Summary\n\nThis PR registers a void result type for six CUDA and NVSHMEM statement\nintrinsics. Without it,\ncalling them from Python under an IRBuilder without the parser silently\ndrops the statement.\n\n| Op | Same-file op that already registers void |\n| --- | --- |\n| `tirx.cuda.wait_until` | `tirx.nvshmem.wait_until` |\n| `tirx.cuda.timer_init` | `tirx.cuda.cluster_sync` |\n| `tirx.cuda.timer_start` | `tirx.cuda.cluster_sync` |\n| `tirx.cuda.timer_end` | `tirx.cuda.cluster_sync` |\n| `tirx.cuda.timer_finalize` | `tirx.cuda.cluster_sync` |\n| `tirx.nvshmem.getmem_nbi_block` | `getmem_nbi`, `getmem_nbi_warp` |\n\n### Why the statements were dropped\n\nAn op with no `TFixedReturnType` and no `FInferType` builds a Call whose\ntype is `Missing`.\n`MaybeEmitVoidCall` (`src/script/ir_builder/ir.cc`) emits a Call as an\n`Evaluate` only when its\ntype is void, and otherwise returns the Call to the caller. The\nTVMScript parser wraps expression\nstatements in `Evaluate` itself, so parsed functions were unaffected.\nPython code that calls the\nscript namespace directly under an IRBuilder (for example TIRx-lite in\ntirx-kernels) discards the\nreturned Call, so the statement never reaches the IR or the generated\nCUDA.\n\nFor `wait_until` this removes a cross-CTA wait: kernels that use it to\nwait for other CTAs (a\ngrid barrier, a publish flag) were compiled without the wait."
    },
    {
      "commit": "ad4a6794e6747b7e006ae1a7e58430900b5ec9af",
      "tree": "3bfa89ce43ef9f720603539277c77c5b8dab2cac",
      "parents": [
        "a23416382953b7a8cece2aaab77a7b2557901c1a"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Tue Nov 03 20:57:13 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 20:57:13 2026 -0500"
      },
      "message": "[DOCS] Show the complex multiplication formula as text (#181)\n\nThis PR shows the formula as text to avoid rendering issues."
    },
    {
      "commit": "a23416382953b7a8cece2aaab77a7b2557901c1a",
      "tree": "95291bb5ddb9d7db3e914d44a78e8584059e83a1",
      "parents": [
        "b1a06d67607b070c78464513e1a0124fe510fea4"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Tue Nov 03 20:57:01 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 20:57:01 2026 -0500"
      },
      "message": "[DOCS][Rust] Explain generic #[dispatch] in the Rust IR guide (#182)\n\nRewrite \"Dispatching on Node Types\" in the Rust IR guide to introduce\n`#[dispatch]` on its own, independent of the structural utilities:\n\n- Why it exists: dispatching over many kinds of IR nodes is common;\n`match_any!` provides the machinery and `#[dispatch]` builds the\ndispatcher from one method per node type.\n- A minimal three-handler `Printer` example that parenthesizes nested\nadditions, with its real output.\n- The simplified `match_any!` and `Dispatcher` code the attribute\nexpands to.\n- The rule that each handler takes the matched value plus a leading\nprefix of the remaining arguments.\n\nThe `#[dispatch(walk)]` `Counter` example moves into \"Structural Walk\",\nwhere it shows a dispatcher driving a walk and the fallback for node\ntypes without a handler. The constructs table and Quick Reference\ndescribe `#[dispatch]` as generating a match over the prefix methods."
    },
    {
      "commit": "b1a06d67607b070c78464513e1a0124fe510fea4",
      "tree": "d49319085dacb96ff190363513da06df3732beeb",
      "parents": [
        "e5342c3ab218310ef307ca82213d04170fd4d10e"
      ],
      "author": {
        "name": "Bohan Hou",
        "email": "spectrometerh@gmail.com",
        "time": "Tue Nov 03 20:40:55 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 20:40:55 2026 -0500"
      },
      "message": "[DOCS] Focus README emphasis on key phrases (#183)\n\nReduce bold formatting in the README introduction to emphasize three key\nphrases: the vision for agent-developed kernels, the question about\nanother compiler layer, and the minimal, stable, and extensible DSL and\ncompiler foundation."
    },
    {
      "commit": "e5342c3ab218310ef307ca82213d04170fd4d10e",
      "tree": "bb1be190ae36ad0cb6652f24c3aaa00bf2faf7c7",
      "parents": [
        "a28b1ea6b22cb2c44322920e76b74d270ffded3e"
      ],
      "author": {
        "name": "Bohan Hou",
        "email": "spectrometerh@gmail.com",
        "time": "Tue Nov 03 20:16:27 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 20:16:27 2026 -0500"
      },
      "message": "[DOCS] Refresh README positioning and features (#179)\n\nUpdate the README to explain TIRx\u0027s role as a minimal, stable, and\nextensible DSL and compiler foundation for agent-driven kernel\ndevelopment, analysis, and eventual correctness verification. Streamline\nthe feature descriptions and documentation section while retaining the\nproject tagline."
    },
    {
      "commit": "a28b1ea6b22cb2c44322920e76b74d270ffded3e",
      "tree": "ae0933db72f74c6736b88f580e79bcd9c529dfc5",
      "parents": [
        "30bc80aebfc09bed76fdc637574374fe064fb52e"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Tue Nov 03 19:11:10 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 19:11:10 2026 -0500"
      },
      "message": "[DOCS] Lead the extension tutorial with its goal and add a Python version (#180)\n\n## Summary\n\nThis PR reworks the \"Extending TIRx\" tutorial around its goal and adds a\nPython version of the\ncomplex-number extension, shown beside the Rust one. It also links\nsource files on GitHub instead\nof offering downloads, and points the quick start to further material.\n\n### Getting Started with Rust Extensions\n(`docs/advanced/extending_ir_in_rust.rst`)\n\n- **The case study comes first.** It states the goal: to show\n\"everything is a plugin\" with\ncomplex numbers that are written in TVMScript like built-in features and\ncompile with TIRx.\nThe page then shows the kernel, the scalar loop that compilation should\nproduce, and what the\nextension needs to get there: a type, operators, and a lowering pass,\nplus a note that an\n  extension can also add optimization passes.\n- **\"Why Rust\" moved** to a short note in the next chapter, where the\nPython and Rust versions\n  meet.\n- **Project setup** now says that an extension can also be written in\npure Python.\n\n### Defining Types, Operators, and Passes\n(`docs/advanced/defining_ir_extensions.rst`)\n\n- **Rust and Python tabs.** Each step (type, operator, type inference,\nrewrites, pass function,\nresult checks, pass) shows the Rust code and the Python code in group\ntabs, as the quick start\n  does for CPU and CUDA. The text compares the two versions.\n- **Python version.** The intro gives the command that runs the example\nwith it. A note explains\n  why Rust is preferred for extensions.\n- **Notes for the Rust macros.** `def_object_ref!` and\n`static_init_block!` are explained in\nnotes. Another note shows that one `static_init_block!` can register\nboth types and operators,\nand a see-also points `#[dispatch]` and `structural_map` to \"Working\nwith IR in Rust\".\n- The page follows #178: the excerpt and the text use\n  `#[dispatch(map, (AnyView\u003c\u0027_\u003e,), Result\u003cAny\u003e)]`.\n\n### Using and Compiling the Extension\n(`docs/advanced/using_ir_extensions.rst`)\n\n- The three lines that declare the `my_ext` module and load the library\nare explained one by\n  one.\n\n### Code\n\n- **`examples/extension/my_ext_py/my_ext.py`.** The extension in Python,\nwith the same names as the\n  Rust package, so `run_example.py` runs with either:\n  - the type is a `py_class`, published with `ir.expose_type`;\n- the operators are registered with `ir.Op.register`, with Python type\ninference;\n- the pass is a `structural_map` over `(type, callback)` entries,\nwrapped by\n    `tirx.transform.function_pass`.\n\nA Python operator only has the argument-count validator that its\nsignature generates, so the\nPython pass checks the types of calls with explicit result types before\nlowering them.\n- **`examples/extension/README.md`.** Mentions the Python version and\nhow to run it.\n\n### Docs site\n\n- **`docs/conf.py`.** The page header\u0027s download menu is replaced by a\nbutton that links the\npage\u0027s source file on GitHub, next to the fullscreen button. Pages\ngenerated during the build\n(`reference/python/generated/`, `reference/cpp/generated/`) have no\nsource in the repository\n  and get no button.\n- **Links instead of downloads.** The tutorial\u0027s `:download:` links to\n`src/lib.rs`,\n  `__init__.py` and `run_example.py` now point to the files on GitHub.\n- **`docs/get_started/quick_start.rst`.** Further Reading starts with\n[Modern GPU Programming for\nMLSys](https://mlc.ai/modern-gpu-programming-for-mlsys/), recommended\nfor learning to write programs with TIRx, and lists the extension\ntutorial.\n- **`docs/ir_guides/working_with_ir_in_rust.rst`.** Adds the labels\n`rust-dispatch` and\n  `rust-structural-utilities` for the tutorial\u0027s see-also.\n\n### Tests\n\n- **`tests/python/ir/test_op_rust.py`.**\n- The checks of explicitly typed invalid calls move to\n`VALIDATOR_CHECKS`, which only the Rust\n    package runs.\n- The new `test_extension_prototype` runs `run_example.py` and the\nshared checks with the\nPython version, plus `PROTOTYPE_CHECKS`: its argument-count validator,\nand the pass rejecting\n    explicitly typed invalid calls.\n\nVerified locally on Linux:\n\n- `tests/python/ir/test_op_rust.py`: all 7 tests pass on the base before\n#178. On the rebased\nbranch, `test_extension_prototype` passes. The Rust tests were not rerun\nafter the rebase,\nbecause the local build predates the TVM FFI update in #178; this PR\ndoes not change the Rust\n  code.\n- `PYTHONPATH\u003dexamples/extension/my_ext_py python\nexamples/extension/run_example.py` prints\n  `Complex multiplication matches NumPy.`\n- A merged type-and-operator `static_init_block!`, as the new note\nshows, builds and runs the\n  example.\n- The Sphinx HTML build with `-W`, using CI\u0027s Sphinx 8.1.3 and docutils\n0.21.2.\n- pre-commit on the changed files."
    },
    {
      "commit": "30bc80aebfc09bed76fdc637574374fe064fb52e",
      "tree": "899fbaca94c571247d21aefb25cb7ebce622fa5d",
      "parents": [
        "019da20b566d9b3e1118819f2d58530204289b2f"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Tue Nov 03 17:17:47 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 17:17:47 2026 -0500"
      },
      "message": "[Rust] Update TVM FFI and explicit dispatch contracts (#178)\n\nUpdate TVM FFI to the latest merged source and adapt the Rust examples\nto explicit dispatch argument/result contracts and managed interrupt\npayloads. Raise the minimum Rust version to 1.95, align documentation CI\nwith that requirement, and update the affected guide signatures and API\nlinks."
    },
    {
      "commit": "019da20b566d9b3e1118819f2d58530204289b2f",
      "tree": "3f60d46d3c9c98617e1160c632c1f73e4c4d0c7a",
      "parents": [
        "c8d0ae636c265bb5e03a427b6f2792f41629c172"
      ],
      "author": {
        "name": "Lei Wang",
        "email": "34334180+LeiWang1999@users.noreply.github.com",
        "time": "Wed Nov 04 02:48:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 13:48:47 2026 -0500"
      },
      "message": "[FIX][Codegen] Correct C emission and Target host serialization (#172)\n\nThis PR fixes three correctness issues in shared C code generation and\nTarget serialization.\n\n### Preserve string literal bytes\n\n`StringImm` currently writes its contents directly between quotes.\nEmbedded quotes, backslashes, or newlines can therefore produce invalid\nC source or change the string\u0027s contents. Route it through the existing\n`PrintEscapedCString` helper:\n\n| Input value, in Python notation | Previous C literal | Fixed C literal\n|\n| --- | --- | --- |\n| `\u0027a \"quoted\" message\u0027` | `\"a \"quoted\" message\"` | `\"a \\\"quoted\\\"\nmessage\"` |\n| `\u0027path\\\\to\\\\file\\\\\u0027` | `\"path\\to\\file\\\"` | `\"path\\\\to\\\\file\\\\\"` |\n| `\u0027first\\nsecond\u0027` | An actual newline inside the quoted literal |\n`\"first\\nsecond\"` |\n\nThe existing helper, also used for assertion messages, has a separate\nissue with numeric escape boundaries. C hexadecimal escapes consume all\nfollowing hexadecimal digits, and octal escapes consume up to three\noctal digits. The byte sequences below omit the terminating NUL:\n\n| Intended bytes | Previous helper output | Fixed output |\n| --- | --- | --- |\n| `00 37` — NUL followed by `7` | `\"\\07\"` | `\"\\0007\"` |\n| `01 46` — byte `0x01` followed by `F` | `\"\\x01F\"` | `\"\\001F\"` |\n| `C3 A9 46` — UTF-8 for `éF` | `\"\\xc3\\xa9F\"` | `\"\\303\\251F\"` |\n\nFor example, `\"\\x01F\"` represents one byte, `0x1F`, instead of the\nintended two bytes, `0x01` and `0x46`. Emitting exactly three octal\ndigits per numeric byte escape makes the boundary explicit, even when\nthe next character is another digit.\n\nThere is also a C11 trigraph case: `\"??\u003dabc\"` becomes `\"#abc\"` before\nstring literals are parsed. Emitting `\"\\?\\?\u003dabc\"` preserves the original\n`??\u003dabc` bytes. The helper now escapes question marks as well.\n\n### Emit initializer setup before tensor declarations\n\n`DispatchDeclTensor` starts writing the pointer declaration before\nprinting its initializer. However, printing an expression such as\n`stack_alloca` can itself emit setup statements. For example:\n\n```python\nlocal \u003d T.decl_tensor(\n    T.stack_alloca(\"shape\", 2),\n    ty_args\u003d[T.Tensor((2,), \"int64\")],\n)\n```\n\nPreviously, the stack declaration could be emitted in the middle of the\npointer initializer:\n\n```c\nint64_t* local \u003d ((int64_t*) TVMFFIAny stack[1];\n((int64_t*)stack));\n```\n\nGenerate the initializer expression text first, allowing its setup\nstatements to be emitted before starting the complete pointer\ndeclaration:\n\n```c\nTVMFFIAny stack[1];\nint64_t* local \u003d ((int64_t*)stack);\n```\n\n### Invalidate Target string caches when changing the host\n\nOnce a target\u0027s string representation has been cached, cloning it and\nchanging its host also copies the stale `str_repr_`. The resulting\nobject can have the correct host while its serialized string still\ndescribes the previous one.\n\nFor example, adding a host after populating the cache:\n\n```python\nfrom tvm_tirx.target import Target\n\noriginal \u003d Target({\"kind\": \"cuda\", \"arch\": \"sm_80\"})\nstr(original)  # Populate the cache before cloning.\nupdated \u003d Target(original, host\u003d\"c\")\nrestored \u003d Target(str(updated))\n\nassert updated.host.kind.name \u003d\u003d \"c\"\n# Before: restored.host is None.\n# After:  restored.host.kind.name \u003d\u003d \"c\".\n```\n\nThe same issue affects replacing and removing a host. In each row below,\n`str(original)` has already populated the cache:\n\n| Original host | Operation | Host recovered from the string before this\nfix | After this fix |\n| --- | --- | --- | --- |\n| None | `Target(original, host\u003d\"c\")` | None | `c` |\n| `c` | `original.with_host(\"llvm\")` | `c` | `llvm` |\n| `c` | `original.with_host(None)` | `c` | None |\n\nClear `str_repr_` on the new object in `WithHost`, and route the\nconstructor that takes a host and `WithoutHost()` through that same\npath. This keeps serialization consistent when adding, replacing, or\nremoving a host."
    },
    {
      "commit": "c8d0ae636c265bb5e03a427b6f2792f41629c172",
      "tree": "efcd5591f851ac10f7a71086a27e63f750ff71c2",
      "parents": [
        "7aa3ea86a3966b5fe148c7582a4070664a47d7fa"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Tue Nov 03 13:09:06 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 13:09:06 2026 -0500"
      },
      "message": "[DOCS][RUST] Polish the extension tutorial and example (#176)"
    },
    {
      "commit": "7aa3ea86a3966b5fe148c7582a4070664a47d7fa",
      "tree": "c0e962d2b23dc5d662a2459ccf1f3914b74d8c1e",
      "parents": [
        "1470dd0b9c99ad06b67d95ab29b2c25ef8973410"
      ],
      "author": {
        "name": "Lei Wang",
        "email": "34334180+LeiWang1999@users.noreply.github.com",
        "time": "Wed Nov 04 01:59:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 12:59:51 2026 -0500"
      },
      "message": "[Transform] Preserve view pointer types in LowerTensorLayouts (#169)"
    },
    {
      "commit": "1470dd0b9c99ad06b67d95ab29b2c25ef8973410",
      "tree": "bfb95fa5c82d69034706c3d2921cda996347d5a9",
      "parents": [
        "2025a90d459514fcb649705ecd73777824504bf2"
      ],
      "author": {
        "name": "Ruihang Lai",
        "email": "ruihangl@cs.cmu.edu",
        "time": "Tue Nov 03 12:52:59 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 12:52:59 2026 -0500"
      },
      "message": "[DOCS] Clarify guide structure and core concepts (#175)\n\nIntroduce TIRx\u0027s compiler foundation and plugin model, and explain how\nmetaprogramming generates and specializes kernels before execution.\nConsolidate region documentation and clarify variable scopes to reduce\nduplication between the IR guides.\n\nRename Language Basics to CUDA Functions and Launches and update its\nlinks. Prioritize loops in the control-flow guide, place CUDA\ntroubleshooting next to compilation, simplify tile guide headings, and\nclarify CUDA interface and API reference titles."
    },
    {
      "commit": "2025a90d459514fcb649705ecd73777824504bf2",
      "tree": "6bf9612b17159a0d08abfc4b96ed7717618fb927",
      "parents": [
        "16e90115a605c8ba8767a064e082ed51e17bf853"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Tue Nov 03 09:25:51 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 09:25:51 2026 -0500"
      },
      "message": "[Rust] Update FFI and migrate structural dispatch (#170)\n\nUpdate the TVM-FFI submodule to the current Rust dispatch APIs. Migrate\nstructural traversal examples and the IR type test to the shared\ndispatcher, keep traversal state on each dispatcher, and use scoped\nvisitor/mutator views for recursive descent. Align example dependencies\nand guide snippets with the pinned FFI source."
    },
    {
      "commit": "16e90115a605c8ba8767a064e082ed51e17bf853",
      "tree": "d9a5f4d8adb4b93cb9d8585cf1264167bce5ee1c",
      "parents": [
        "1c711624991329841bcc5e5bccae31b3c9b871f5"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Mon Nov 02 18:46:15 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 18:46:15 2026 -0500"
      },
      "message": "[FEAT][RUST] Add PrimExpr and IntExpr typed expression views (#167)\n\n## Summary\n\nC++ `PrimExpr` and `IntExpr` are typed views: an `Expr` whose `ty` is a\n`PrimType`, or a scalar\ninteger type for `IntExpr`. They have no node class of their own; the\ntype is checked where an\nexpression is converted into the view. The Rust crate bound C++\n`PrimExpr` fields as `Expr`,\nchecked the operand types inside each operator, and had `sig::PrimExpr`\nand `sig::IntExpr` as\nmarker types for operator signatures only.\n\nThis PR adds `tvm_tirx::ir::PrimExpr` and `IntExpr` as reference types.\nAn expression is checked\nonce, where it becomes a view, and the type then holds for every use.\n\nBefore:\n\n```rust\n// `index` may be any expression: the function checks its type, and so does every operator.\nfn next_index(index: \u0026Expr) -\u003e Result\u003c(Expr, DLDataType)\u003e {\n    let next \u003d Expr::try_from(index + 1)?;\n    let Some(ty) \u003d next.ty.as_node::\u003cPrimTypeObj\u003e() else {\n        return Err(Error::new(TYPE_ERROR, \"expected a PrimExpr\", \"\"));\n    };\n    let dtype \u003d ty.dtype;\n    Ok((next, dtype))\n}\n\nlet i \u003d Expr::from(var);\nlet load \u003d TensorLoad::new(\u0026a, [\u0026i], UNKNOWN_LOC)?; // load.indices: Array\u003cExpr\u003e\nlet (next, dtype) \u003d next_index(\u0026i)?;\n```\n\nAfter:\n\n```rust\n// The signature says what `index` is, and the operators build a `PrimExpr`.\nfn next_index(index: \u0026IntExpr) -\u003e Result\u003c(PrimExpr, DLDataType)\u003e {\n    let next \u003d PrimExpr::try_from(index + 1)?;\n    let dtype \u003d next.dtype();\n    Ok((next, dtype))\n}\n\nlet i: IntExpr \u003d Expr::from(var).try_into()?; // checked here, once\nlet load \u003d TensorLoad::new(\u0026a, [\u0026i], UNKNOWN_LOC)?; // load.indices: Array\u003cPrimExpr\u003e\nlet (next, dtype) \u003d next_index(\u0026i)?;\n```\n\nThe `?` on `PrimExpr::try_from(index + 1)` reports only the errors of\nthe operators, such as\nmismatched vector lanes; the type of the result needs no check."
    },
    {
      "commit": "1c711624991329841bcc5e5bccae31b3c9b871f5",
      "tree": "8e31c9a4e14711eedcf731d15487575876480367",
      "parents": [
        "32b4eee29741bc6a9c1c39502763ccbde8af27dc"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Mon Nov 02 15:12:34 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 15:12:34 2026 -0500"
      },
      "message": "[Fix][TIRx] Restore default Z3 fallback in tile lowering (#166)\n\nThis PR restores DEFAULT-strength Z3 fallback for the C++ TileDispatcher\nand CUDA pattern layout analyzer, removing the temporary opt-outs\nintroduced in #146 while retaining Analyzer reuse. ComposeLayout now\nuses existing layout bounds to classify address terms contained within\none swizzle atom before attempting atom-alignment proofs. The existing\ncarry checks, symbolic proof path, and full-swizzle fallback are\npreserved."
    },
    {
      "commit": "32b4eee29741bc6a9c1c39502763ccbde8af27dc",
      "tree": "0304251c6130cdf0010059907d00027014eebc70",
      "parents": [
        "3e67e126e8096349c57261ce891b8aa8051d2562"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Nov 02 15:12:02 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 15:12:02 2026 -0500"
      },
      "message": "[CI] Pin manylinux CUDA images to tlcpack mirror (#168)\n\nquay.io/manylinux_cuda rebuilds `2026.10.15-1`/`latest` weekly and\ndeletes the previous manifests, so digest pins into quay break (e.g.\n`485e71e…` disappeared on 2026-11-02, failing Jenkins on branches that\nstill pinned it).\n\nThis pins `ci_arm` and `ci_gpu` (and `ci_cpu` via alias) to\n`tlcpack/ci-manylinux-cuda13-1@sha256:659a10db…`, a multi-arch index\nwrapping the current quay manifests unchanged:\n\n- arm64:\n`sha256:84c3d68c69ff277332a1c5adafe89da11d9b48b131793e97b5e767d8d62c2d89`\n- amd64:\n`sha256:fc956755dd27491d7948d6d2974c59833e64c3c73564c0a577a39b8c2de86ebc`\n\n`common.groovy` now skips the tlcpack/tlcpackstaging lookup for\ndigest-pinned images, since the target-trusted helper only understands\n`name:tag` specs."
    },
    {
      "commit": "3e67e126e8096349c57261ce891b8aa8051d2562",
      "tree": "5458dde649dd1ff22212a26e5b731612b4148a09",
      "parents": [
        "c8f68749d1345066647b7260d6a7cbe006d80bfe"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Nov 02 14:01:54 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 14:01:54 2026 -0500"
      },
      "message": "[Rust] Update pinned FFI and migrate borrowed IR APIs (#165)\n\nUpdate the pinned TVM-FFI source and migrate Rust IR APIs to borrowed\ndowncasts, AnyView callbacks, and consuming MutationView traversal. Keep\nRust examples and native libraries on the checkout dependency, and\nupdate the matching and mutation guide examples.\n\nRefresh the pinned ARM64 and x86-64 CUDA manylinux images used by\nJenkins."
    },
    {
      "commit": "c8f68749d1345066647b7260d6a7cbe006d80bfe",
      "tree": "76f35760a8f67ec481879ef2409eac2e04ee046a",
      "parents": [
        "6ae00166ab8881f581278736afb398043ca721eb"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Mon Nov 02 12:34:57 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 12:34:57 2026 -0500"
      },
      "message": "[DOCS] Color sphinx-tabs with the theme in light and dark modes (#164)\n\nIn dark mode, the tabs of the documentation, such as the CPU and CUDA\ntabs of the Quick Start, keep a white panel and white selected tab, and\ntext inside a panel is light gray on white. The tabs now take their\ncolors from the theme, so they follow its light and dark modes."
    },
    {
      "commit": "6ae00166ab8881f581278736afb398043ca721eb",
      "tree": "5e0ff8cf601a5f80cf6c872bdf61a9472295e57e",
      "parents": [
        "f1961b9cc3123af37abab9f301138a1ea5bf7b17"
      ],
      "author": {
        "name": "Lei Wang",
        "email": "34334180+LeiWang1999@users.noreply.github.com",
        "time": "Tue Nov 03 00:04:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 11:04:08 2026 -0500"
      },
      "message": "[IR] Fix structural equality and hashing of function attributes (#163)\n\nFix structural equality and hashing for `Function` attributes that\nreference the\nfunction\u0027s parameters, including parameters used as map keys.\n\nA function with a parameter reference in its attributes currently\ncompares unequal\nto its own JSON round-trip:\n\n```python\nimport tvm_ffi\nfrom tvm_tirx import ir, tirx\n\nx \u003d ir.Var(\"x\", \"int32\")\nf \u003d tirx.Function([x], [ir.Return(x + 1)], ir.PrimType(\"int32\"))\nf \u003d f.with_attr(\"parameter\", x)\ng \u003d ir.load_json(ir.save_json(f))\n\nprint(g.attrs[\"parameter\"].same_as(g.params[0]))\nprint(tvm_ffi.structural_equal(f, g))\nprint(tvm_ffi.structural_hash(f) \u003d\u003d tvm_ffi.structural_hash(g))\n```\n\nBefore this change, the output is `True, False, False`. After the\nchange, all three\nresults are `True`. The first result shows that JSON deserialization\npreserves the\nreference from the attribute to the restored parameter.\n\nThe order matters because the `equal` callback carries variable-binding\nstate\nthrough the recursive comparison. In `FunctionObj::SEqual`, the calls\nhave two\ndifferent roles:\n\n- `equal(params, other-\u003eparams, true, \"params\")` compares parameter\ndefinitions.\nFor matching parameters, it establishes the correspondence between the\nvariables\non the two sides. This allows equivalent functions to use different\nvariable\n  objects and names.\n- `equal(attrs, other-\u003eattrs, false, \"attrs\")` compares attributes using\nthe current\nvariable correspondence. Under the default comparison policy, distinct\nvariable\nobjects without an established correspondence are treated as distinct\nfree\n  variables.\n\nPreviously, attributes were visited first. When an attribute referred to\na\nparameter, its counterpart in the restored function was a different\nobject, and\nthe parameter correspondence had not been established yet. The attribute\ncomparison returned `false`, and the `\u0026\u0026` expression stopped before\nvisiting the\nparameter definitions. Visiting parameters first establishes the\ncorrespondence\nthat the attribute comparison needs.\n\n`FunctionObj::SHash` has the same ordering requirement. A direct\nparameter reference\nvisited through attributes before its definition can be memoized with an\nidentity-based free-variable hash. Visiting parameters first assigns\ntheir\ndefinition-based hashes before attributes consume them. Object map keys\nalso\ndepend on the existing variable correspondence and hash memo.\n\nThis change visits `params` before `attrs` in both `SEqual` and `SHash`.\nAttributes\nstill participate in comparison and hashing, and free variables retain\ntheir identity semantics. Regression tests cover JSON round-trips,\nequivalent\nfunctions with renamed parameters, parameters used as map keys, and\nnegative cases\nfor different parameter positions and distinct same-name free variables."
    },
    {
      "commit": "f1961b9cc3123af37abab9f301138a1ea5bf7b17",
      "tree": "391c1e1535cc7d997a3c474e6a056f8348ad99b8",
      "parents": [
        "37b583953d693c232139d299d6b92ccc96c98475"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Nov 02 10:58:07 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 10:58:07 2026 -0500"
      },
      "message": "[DOCS] Shorten README title to fit one line (#162)\n\nDrop \"Open\" from the README title so it fits on one line. The intro\nsentence and `.asf.yaml` description keep \"open\"."
    },
    {
      "commit": "37b583953d693c232139d299d6b92ccc96c98475",
      "tree": "4e3999c9566fe3ad3e5c207f2a78fd8b39c8f444",
      "parents": [
        "7c19669ce1b5161fc112429fbf7cb76102da29f1"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Mon Nov 02 10:53:06 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 10:53:06 2026 -0500"
      },
      "message": "[REFACTOR][RUST] Look up operators with Op::get and remove OpHandle (#160)\n\n## Summary\n\nOperators defined in Rust are registered in\n`tvm_ffi::static_init_block!`s, which run when their\nlibrary loads, so `Op::get` finds them wherever C++ `Op::Get` would find\ntheirs. A pass looks its\noperators up with `Op::get` and tests a call with\n`call.op.same_as(\u0026op)`, as in C++:\n\n```rust\nlet cmul \u003d Op::get(\"my_ext.cmul\")?;\nif call.op.same_as(\u0026cmul) { ... }\n```\n\n`OpHandle`, the `static` handle that looked an operator up on first use,\nis removed. The extension\nexample and its tutorial use `Op::get`."
    },
    {
      "commit": "7c19669ce1b5161fc112429fbf7cb76102da29f1",
      "tree": "478b60919f19a2e2c791c65f40b9962c01c45ccd",
      "parents": [
        "03cb4822cfd2e859717725c2768263c8adc6cf38"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Nov 02 10:18:37 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 10:18:37 2026 -0500"
      },
      "message": "[DOCS] Concise README, native Rust layout note, and .asf.yaml homepage (#161)\n\nReplace the title-only README with a concise overview of TVM TIRx: links\nto the documentation and Quick Start, a one-sentence introduction, the\nfeature list, and links to the main documentation sections. The ASF\nlicense header is kept.\n\nIn the Rust guide (Objects and Managed References), note that `AddObj`\nhas the same memory layout as its C++ counterpart, so `add.a` is a\ndirect field read, as efficient as in C++.\n\nUpdate `.asf.yaml`: the GitHub homepage now points to\nhttps://tvm.apache.org/tirx and the description reads \"Open ML Compiler\nFoundation for the Agentic Era\"."
    },
    {
      "commit": "03cb4822cfd2e859717725c2768263c8adc6cf38",
      "tree": "48c757c7e371e678ed46e7fc3ec858a155d9652f",
      "parents": [
        "3ad801cb8e489b9d5b32c2ce6085ba2f296eb2b8"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Mon Nov 02 08:12:09 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 08:12:09 2026 -0500"
      },
      "message": "[Fix][TIRx] Verify small tile domains before symbolic proof (#159)\n\nThis PR moves complete finite-domain verification ahead of symbolic\nproof in CUDA tile-pattern Context.require, while retaining native\nsimplification as the first step. Descriptor validation previously could\nissue thousands of inconclusive Z3 queries before successfully checking\nthe same conditions by enumeration. When the remaining variables have\ncomplete known finite domains, every value combination is now checked\nfirst, without a point-count threshold. If enumeration is unavailable or\ninconclusive, symbolic proof is still attempted so that accepted\npremises can establish the condition. The pattern verifier’s DEFAULT Z3\nfallback is enabled again, while the separate layout analyzer retains\nits existing opt-out. The existing per-element descriptor validation\nremains in place. A local compile-only run of the native GEMM reproducer\ncompleted in approximately 4.08 seconds with both context fallbacks\nenabled and generated identical CUDA source."
    },
    {
      "commit": "3ad801cb8e489b9d5b32c2ce6085ba2f296eb2b8",
      "tree": "b443335c06e7b0b2dc709400a50b75cd1d5d5b36",
      "parents": [
        "501635debfd322189116b5ffe0113aa55cb349f2"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 22:12:33 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 22:12:33 2026 -0500"
      },
      "message": "[BUILD][Rust] Use TVM FFI sources and pin registry dependencies at release (#158)\n\nRust development builds use TVM FFI directly from the initialized\nsubmodule, allowing unreleased source changes to be tested together.\n\nRelease preparation resolves the submodule commit to an exact Apache TVM\nFFI release tag and rewrites the dependency to a registry-only exact\nversion before Cargo packaging and publishing. A check-only composite\naction exposes the detected version; locally runnable Python commands\nunder ci/wheel perform detection and rewriting while the workflow\nretains shared metadata preparation. Missing or ambiguous release tags\nfail validation. Source-build guidance describes the submodule\ndependency."
    },
    {
      "commit": "501635debfd322189116b5ffe0113aa55cb349f2",
      "tree": "ca347f47a487af2b268be0c90da40f7710dbc7bb",
      "parents": [
        "558c3b9335d7695469e3a8b4ee41024a9fb57d92"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 22:12:10 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 22:12:10 2026 -0500"
      },
      "message": "[FEAT] Add Rust primitive expression operator overloads (#157)\n\nAdd `def_expr_op_over_loads!(Type)` for existing Rust reference\nwrappers, with owned and borrowed operators, contextual scalar operands,\nand named operations. Register native primitive-expression counterparts\nplus `Expr`, `Var`, and `Call` explicitly in `rust/src/ir/expr.rs`,\npreserving object layouts, allocation, and ancestor conversions.\n\nRename the fallible operator result to `ExprResult`, remove `ex()` and\n`.expr()`, and support standard `TryFrom\u003cExprResult\u003e for Expr`\nextraction. Update examples and the Rust guide to use expression\noperators directly while retaining ordinary Rust borrowing."
    },
    {
      "commit": "558c3b9335d7695469e3a8b4ee41024a9fb57d92",
      "tree": "a8ba75f3ca0f59554f881082655d97237aaeb518",
      "parents": [
        "5d3ac392b1f6306c670d9102855d6ecd86625561"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 20:13:00 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 20:13:00 2026 -0500"
      },
      "message": "[DOCS] Add the TVM-FFI Object System sections to the Rust and C++ guides (#156)\n\nThis PR adds a TVM-FFI Object System section to the Working with IR in\nRust and Working with IR in C++ guides. Each section explains why TIRx\nIR nodes are TVM-FFI objects (dynamic extension first, cross-language\nuse second) and introduces the constructs for working with them in that\nlanguage, one concept at a time on an `x * 2 + 1` expression that the\nexamples build themselves.\n\nRust guide:\n- New section after Setting Up, replacing Accessing and Creating IR\nNodes, with a key-constructs table and five subsections:\n  - Constructing Objects: `Var::new` and `ex()`.\n- Objects and Managed References: the underlying object and its named\nmanaged reference (`AddObj` / `Add`), why the reference is a named type,\nidentity, and immutability.\n  - Casts: `.into()` and `.try_cast()`, including a failed cast.\n- Matching Node Types: `match_any!`, with the `_` arm as what keeps\nexisting code working when node types are added.\n- Dispatching on Node Types: a `#[dispatch(walk)]` struct; unhandled\ntypes fall back to the default traversal.\n- The intro, Structural Utilities, Visitors and Mutators, and Quick\nReference describe the Rust forms on their own terms; API links point at\nthe site\u0027s Rust reference.\n\nC++ guide:\n- New section after Setting Up, replacing Accessing and Creating IR\nNodes, with a key-constructs table and five subsections:\n  - Constructing Objects: `PrimVar` and `PrimExpr` operators.\n- Objects and Managed References: `AddObj` / `Add`, why the reference is\na named class, identity, and `CopyOnWrite()`.\n- Casts: implicit upcasts and `as\u003cT\u003e()` / `as_or_throw\u003cT\u003e()`, including\na failed cast.\n- Typed Views: `PrimExpr`, `IntExpr`, and `PrimVar`, which constrain an\nexpression by its type rather than its object class.\n- Dispatching on Node Types: an `ExprFunctor` with one `Dispatch_`\noverload per node class and `DispatchDefault_` for the rest.\n- The intro, Structural Utilities, Visitor and Mutator Classes, and\nQuick Reference describe the C++ forms on their own terms; Quick\nReference gains rows for typed views, `CopyOnWrite()`, and the functors.\n\nThe example crate and C++ source replace the `add_one`-based object\nexamples with argument-free functions that build their own IR, and the\ndrivers call them first."
    },
    {
      "commit": "5d3ac392b1f6306c670d9102855d6ecd86625561",
      "tree": "6aa7d630fee76d9a2d60ad5feba57c4eb508e81a",
      "parents": [
        "e45a49da0bd7141f4c7ba6c6a827ab56f641b022"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 18:45:41 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 18:45:41 2026 -0500"
      },
      "message": "[CI] Use Ninja for Windows and bump version to 0.1.0b0 (#155)"
    },
    {
      "commit": "e45a49da0bd7141f4c7ba6c6a827ab56f641b022",
      "tree": "e3a9ceee679abc340b0cb4ac6e56071cffc2ebac",
      "parents": [
        "e2e48f3f8fcb5dfd76c72712d7ff34c412b2f62f"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Sun Nov 01 15:30:15 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 15:30:15 2026 -0500"
      },
      "message": "[Fix][TIRx] Make layout analysis state explicit and reusable (#146)\n\n`Layout.apply` creates temporary Analyzers while evaluating coordinate\nmappings, including additional instances inside nested helpers. When\nqueries fall back to Z3, these instances may each initialize their own\nsolver and context. Frequent layout evaluation therefore pays repeated\nsetup costs.\n\nThis change requires callers to provide an Analyzer at the C++, FFI, and\nRust layout-application entrypoints. C++ helpers borrow `AnalyzerObj*`\nand reuse it throughout the evaluation. CUDA tile lowering shares a\ndedicated layout analyzer across each instruction’s address queries,\nseparate from the bounded verifier’s assumptions.\n`AnalyzerObj::SetZ3DefaultFallback(bool)` controls DEFAULT-strength Z3\nfallback through a private per-instance setting, disabled by default and\npreserved by cloning. `StmtExprMutatorWithConstraintContext` explicitly\nenables it for its owned analyzer, including constructors used by\nsubclasses. Native analysis still runs first; explicit stronger queries\nand Z3-specific APIs retain their existing behavior. Z3Prover is\nunchanged.\n\n\nZ3 fallback enabled, this can produce many inconclusive SMT queries.\nOptimizing that proof strategy will be handled separately from this\nchange to analysis-state ownership and reuse.\n\n---------\n\nCo-authored-by: LeiWang1999 \u003cleiwang1999@outlook.com\u003e"
    },
    {
      "commit": "e2e48f3f8fcb5dfd76c72712d7ff34c412b2f62f",
      "tree": "30ff3d085a77ee7de813d833713c9449c697bb18",
      "parents": [
        "043ace5f1045097ff122606df80e022db62ef15d"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 14:17:02 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 14:17:02 2026 -0500"
      },
      "message": "[DOCS] Add Working with IR in C++ and Rust chapters (#152)"
    },
    {
      "commit": "043ace5f1045097ff122606df80e022db62ef15d",
      "tree": "908e48d9c584620fce3d48f5b0d3353ef987facb",
      "parents": [
        "82bf83eb84eb6152ff6b7151402d27427045cd35"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 13:25:05 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 13:25:05 2026 -0500"
      },
      "message": "[REFACTOR] Require sequence bodies and mark function declarations (#153)"
    },
    {
      "commit": "82bf83eb84eb6152ff6b7151402d27427045cd35",
      "tree": "bc97ce4e055eafd2918f31cd008b9dff8813ca3d",
      "parents": [
        "906463bd663b192df55a8c93fcdadc987f9fa46f"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 12:50:01 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 12:50:01 2026 -0500"
      },
      "message": "[DOCS] Restructure IR Guides for scanning: tables, notes, shorter paragraphs (#151)\n\nThis PR restructures the IR Guides for scanning without removing\nnarrative content: long paragraphs are split to one idea each, parallel\nitems become tables, subtleties move into notes, and key points are\nbolded sparingly.\n\n- **Structural Traversal, Rewriting, and Comparison**: condensed\nDefinitions and Uses opening; definition region kinds as a table (Kind /\nMeaning / In `add_one`); `DEF_PATTERN` details in a note; a bold-led\nparagraph on how the utilities keep definitions and uses consistent. A\ntable of walk callback return values; \"a map callback must return a\nnode\" and free variables (`map_free_vars`) as notes; a shorter Equality\nopening; Visit and Mutate splits the why from the how, with the \"return\n`default_visit`\u0027s result\" rule as a note.\n- **Printing and Parsing**: the `[n]` / Python 3.12 type-parameter\ndetail, `save_json`, and `line_trace_scope` become notes; the section\nthat duplicated the page title is renamed; the predictability principle\nmoves to the start of How the Parser Works as a list; a\nTVMScript-to-builder table replaces the mapping prose; region syntax\ngets its own subsection.\n- **Symbolic Integer Analysis**: the \"False means not proved\" and \"last\nsynchronized context\" points become notes; one table lists the four\n`*_with_constraint_context` utilities.\n- **IR Overview**: split the intro paragraph; collapse the `prim.*`\nlines of the class hierarchy into categories; a namespace table (`ir` /\n`ir.prim` / `tirx`); source locations as a note; the chapter map\nmentions comparing IR.\n- **Functions and Modules**: output blocks for `add_one.ty` and the\nprinted `T.func_attr`; a shorter Attributes paragraph; `GlobalVar` name\nvs. `global_symbol` as a table.\n- **Types and Expressions, Statements**: remove forward cross-references\nto later chapters; keep a one-sentence version of \"rewrites keep\ndependent types consistent\".\n- **Consistency**: \"chapter\" instead of \"guide\" in body pages; remove\nunreferenced labels; `@T.ir_module` in the `ir.transform` example;\nStructural Hooks and pass selection rules as tables in the reference."
    },
    {
      "commit": "906463bd663b192df55a8c93fcdadc987f9fa46f",
      "tree": "150274d7f5f6a1779d5ef1a8238e59f9530e2cf4",
      "parents": [
        "116f52072150e14dd5a53ed1d77f4153229f752d"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 12:09:00 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 12:09:00 2026 -0500"
      },
      "message": "[DOCS] Rewrite Symbolic Integer Analysis, move pass guidance to the reference (#150)\n\nThis PR rewrites the Symbolic Integer Analysis chapter, drops the\nWriting Passes chapter in favor of a fuller pass reference, and\nsimplifies CUDA launch configurations in tests.\n\nDocs (`[DOCS]` commit):\n- `docs/ir_guides/symbolic_integer_analysis.rst`: a focused chapter on\n`Analyzer.simplify`, `Analyzer.can_prove`, `ConstraintContext` and\n`sync_constraint_context`, built around a two-dimensional `add_one` and\nits flattened form. It ends with\n`structural_walk_with_constraint_context` and\n`structural_map_with_constraint_context` finding and removing a\nredundant bounds check. Bounds, iteration maps, regions and proof\nstrength are left to the `tvm_tirx.sym` reference.\n- `examples/ir_guides/symbolic_integer_analysis.py`: runnable source for\nevery snippet, added to `examples/ir_guides/run_all_cpu.sh`.\n- Remove `docs/ir_guides/writing_passes.rst` and its index and IR\nOverview entries. Passes are an optional, thin wrapper; the guidance now\nlives in the reference.\n- `docs/reference/python/ir.transform.rst`: a short overview of what a\npass is and when to use one, with an example that wraps a function,\ncomposes it with a built-in pass in `Sequential`, and prints the program\nbefore and after.\n- Expand the docstrings of `Pass`, `PassInfo`, `PassContext`,\n`Sequential`, `PassInstrument`, `pass_instrument` and\n`tirx.transform.function_pass` with their semantics and short examples.\nDocstring-only; no behavior change.\n- `docs/ir_guides/structural_utilities.rst`: link the structural API\nnames to their reference entries.\n\nTests (`[TEST]` commit):\n- Replace single-element tuple launch configurations such as\n`T.cuda.LaunchConfig(grid\u003d(1,), block\u003d(32,))` with scalars (`grid\u003d1,\nblock\u003d32`) in 37 test files. `LaunchConfig` normalizes both forms\nidentically; multi-dimensional tuples are unchanged."
    },
    {
      "commit": "116f52072150e14dd5a53ed1d77f4153229f752d",
      "tree": "e70fd96e157e1c37ce1b44547891f56e4547c36b",
      "parents": [
        "46824afeb95a61929aea4fb57089784a77925371"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 11:11:35 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 11:11:35 2026 -0500"
      },
      "message": "[DOCS] Reorganize IR Guides and rewrite the structural traversal chapter (#149)\n\nThis PR merges the \"IR Walkthrough\" and \"Working with IR\" sidebar\nsections into one section, \"IR Guides\".\n\n- Move every chapter from `docs/ir/` and `docs/compiler/` into\n`docs/ir_guides/`. In the sidebar, the chapters run from understanding\nthe IR (Overview, Types and Expressions, Statements,\nOperators/Calls/Regions, Functions and Modules, Printing and Parsing) to\nworking with it (Structural Traversal, Rewriting, and Comparison;\nSymbolic Integer Analysis, Writing Passes).\n- Rename \"Writing and Debugging Passes\" to \"Writing Passes\". The file\nnames stay the same.\n- Replace the IR Overview\u0027s \"What to Read Next\" with \"How This Guide Is\nOrganized\". The new section divides the guide into two parts,\nUnderstanding the IR and Working with IR, and gives each chapter a\none-line description.\n- Update the `:doc:` references in Quick Start, Compiling, and the IR\nOverview to use the new paths.\n- Rename `examples/ir_walkthrough/` to `examples/ir_guides/` to match,\nand update the `literalinclude` paths, `pyproject.toml`, and\n`tests/scripts/task_minimal_examples_cpu.sh`.\n\nIt also rewrites the structural utilities chapter (formerly \"Traversing\nand Transforming IR\"), now titled \"Structural Traversal, Rewriting, and\nComparison\", around the Quick Start `add_one` function. It also adds a\nPython reference page for the TVM-FFI structural utilities.\n\n- `docs/ir_guides/structural_utilities.rst`: a narrative chapter\norganized by concept: Structural Walk, Structural Map, Structural\nEquality and Hashing, Definitions and Uses, and Advanced Control: Visit\nand Mutate. It ends with a short remark that hand-written visitors and\nmutators remain possible. It replaces the four parallel API sections.\nThe intro explains why and links to the hooks reference. Every snippet\nis a literalinclude, followed by its real output.\n- `docs/ir_guides/overview.rst`: one sentence stating that IR objects\nare immutable and that transformations build new trees that share the\nunchanged parts.\n- `examples/ir_guides/structural_utilities.py`: a new runnable source\nfor every snippet, with asserts on the shown results. It is added to\n`examples/ir_guides/run_all_cpu.sh`.\n- `docs/reference/python/ffi.structural.rst` (`tvm_ffi.structural`): a\nnew reference page that lists the walk/map/visit/mutate functions,\n`structural_equal`, `structural_hash`, `get_first_structural_mismatch`,\nand related classes such as `StructuralKey`, under their `tvm_ffi`\nnames. It also has a short Structural Hooks section. The page is linked\nfrom the Python API index, with a seealso back-link from\n`tvm_tirx.tirx.structural` in `tirx.rst`."
    },
    {
      "commit": "46824afeb95a61929aea4fb57089784a77925371",
      "tree": "5dfa1b43899f5b7244a995d97f420aa895bccd24",
      "parents": [
        "de910cb7df3ff2c6927ab77cc108f71a6a6a7a10"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Nov 01 09:37:53 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 09:37:53 2026 -0500"
      },
      "message": "[CI] Unify Jenkins builds around pinned manylinux wheels (#148)\n\nConsolidate ARM, CUDA build/test/docs, and alternate GPU backend builds\nin one Jenkins pipeline. Use pinned ARM64 and x86 CUDA-manylinux images,\npreserve logical image names with ci_cpu sharing ci_gpu, and keep EXTRA\non the legacy backend image. Share build-scoped wheel artifacts, run the\nLinux Rust unit suite on ARM, retain x86 Rust binding checks, and\npreserve gated documentation deployment. Enable automatic Sphinx/Doxygen\ninput parallelism in the docs task. Scope negation-pattern bindings to\ntheir rewrite paths."
    },
    {
      "commit": "de910cb7df3ff2c6927ab77cc108f71a6a6a7a10",
      "tree": "79001ee0bd4705353187feba967df393c002f142",
      "parents": [
        "139f56f146810100449d8a00d1f2f3132c57fe99"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Oct 31 20:15:53 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 20:15:53 2026 -0400"
      },
      "message": "[FEAT] Render structural callback failures as underlined TVMScript (#147)\n\nStructural callback failures now append an underlined TVMScript location\nthrough the concrete root IR type\u0027s FFI error hook. The shared renderer\nresolves exact and prefix access paths against the supplied traversal\nroot, preserves the original error and traceback, and consumes visit\ncontext after successful rendering.\n\nRegister enrichment alongside repr through `RegisterScriptRepr`, with\nboth redirect helpers in `tvm::script::printer` and declared in\n`support.h`. Share the renderer with pass error handling while\npreserving its module/function selection and normal function-pass\nexecution.\n\nThis pins current `tvm-ffi` main\n(`69be48a2931505255733bfc5a18d6e0e5cc1a033`) for exact-type hooks and\ncontainer-aware paths. A supporting published FFI runtime is still\nrequired for packaged use: the latest `apache-tvm-ffi\u003d\u003d0.1.15.post2`\ndoes not invoke these hooks. Source builds must install the pinned FFI\nsource; the package minimum will need to be raised when a supporting\nrelease is available."
    },
    {
      "commit": "139f56f146810100449d8a00d1f2f3132c57fe99",
      "tree": "677af66f9b77f466518717f8bc3defa34408af34",
      "parents": [
        "fef2d09e14c0274dabe6de7ab1efd56204f1dc49"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Oct 31 19:10:26 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 19:10:26 2026 -0400"
      },
      "message": "[FEAT] Add T.function.builder for explicit Python construction (#145)\n\nAdd `@T.function.builder` for explicit IR construction with Python\nassignments, control flow and ordinary calls. It shares signature\ndeclarations, unquoted and postponed source annotations, and\nmixed-module forward declarations with `@T.function`; IR function calls\nuse `T.call_global_var_(callee, args)`. Decorator registration\nexplicitly selects its definition kind: FUNCTION by default, BUILDER for\n`T.function.builder`.\n\nOne internal SCRIPT/HOST/BUILDER traversal mode separates script\nlowering, host expressions and builder bodies. Builder bodies use\nordinary statement traversal with expression locations; explicit frames,\nvoid emissions and ordinary helpers may have unknown locations because\nno statement scopes are injected. Prescan collects header facts and\nidentifiers for generated-name hygiene, and compiled body helpers retain\ntheir original Python globals and closure cells.\n\nSugar `@T.function` rejects explicit control-flow frames with a\nsource-located diagnostic directing users to sugar syntax or builder\nmode. Public stores and region operations remain available, and both\nmodes print ordinary TVMScript IR."
    },
    {
      "commit": "fef2d09e14c0274dabe6de7ab1efd56204f1dc49",
      "tree": "6217f315f745de82335afccee2e59ba30d770037",
      "parents": [
        "3c40ca478c700a01e9f60d4aa616eec442dfd436"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Oct 31 17:54:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 17:54:39 2026 -0400"
      },
      "message": "[FIX] Preserve division semantics in canonical comparisons (#141)\n\nCanonical comparison simplification reconstructs split remainders with\nfloor operations. Require positive split factors and floor-compatible\ndivision, or a proven nonnegative index, so truncating remainders keep\ntheir semantics when the index may be negative.\n\nFixes https://github.com/apache/tvm-tirx/issues/137."
    },
    {
      "commit": "3c40ca478c700a01e9f60d4aa616eec442dfd436",
      "tree": "3a2142016cd33730cc24ba8195a3f992a1effab3",
      "parents": [
        "b2a992e0dd624f13b86b1ff6f9887f737e689496"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Oct 31 11:01:18 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 11:01:18 2026 -0400"
      },
      "message": "[DOCS][IR] Restructure Functions and Modules around a two-function module and GlobalVar (#144)\n\nRestructure the IR Walkthrough\u0027s Functions and Modules chapter around a\ntwo-function module and `GlobalVar`.\n\n- Open with why programs need several functions, and show the module in\nTVMScript (`@T.ir_module` with a public `add_one` that calls a private\n`add_one_scalar`).\n- Functions: what `params`, `ret_type`, and `body` hold; the shared\n`attrs`, `ty`, and `loc`; attributes such as `global_symbol`, set with\n`T.func_attr` or `with_attr`.\n- Modules: what `functions`, `attrs`, and `global_infos` hold.\n- Global Variables: how a call refers to another function through a\n`GlobalVar`, reference versus definition, and module name versus\nexported symbol.\n- Code comes from the runnable `examples/ir_walkthrough`.\n- Types and Expressions: add `ir.GlobalVar` to the expression table,\nlink its Call example to the new section, and write the module with\n`@T.ir_module`."
    },
    {
      "commit": "b2a992e0dd624f13b86b1ff6f9887f737e689496",
      "tree": "12d2a0a40b854fc3c42ee5c615900e1c9a2ed43b",
      "parents": [
        "4a76fe3f96dd717766b292449d447c5ba05a6b45"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Oct 31 10:51:08 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 10:51:08 2026 -0400"
      },
      "message": "[DOCS][IR] Rewrite Printing and Parsing around why, the parser, and the builder (#143)\n\nRewrite the IR Walkthrough\u0027s Printing and Parsing chapter around why\nTVMScript exists and how the parser works.\n\n- Open with why: every program at any stage can be written as TVMScript,\nwhich serves as the DSL frontend, the IR constructor for tests, and the\ndiagnostic printer.\n- Printing and parsing `add_one` and a module, including the Python 3.12\n`[n]` symbol syntax.\n- How the parser works: transpilation onto the IR builder with the real\ngenerated builder program, metaprogramming, direct builder construction,\nregion syntax, and predictability over sugar.\n- Extending the syntax, and the parser protocol as an advanced topic.\n- Diagnostics: printing at a stage and highlighting objects.\n- Code comes from a new runnable `examples/ir_walkthrough`, added to the\nCPU minimal-examples run.\n- New reference page for `script.ir_builder.parser_protocol`.\n- Writing Passes now compares against an inline expected module and no\nlonger saves IR as TVMScript, which is not a serialization format."
    },
    {
      "commit": "4a76fe3f96dd717766b292449d447c5ba05a6b45",
      "tree": "9182701ce4c45d0694ec3b29d9d035fd56a4d0dc",
      "parents": [
        "7fae5ca9ec367647df518a13f7107c6ddbe0da01"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Oct 31 10:51:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 10:51:00 2026 -0400"
      },
      "message": "[FIX] Respect unsigned subtraction underflow in constant bounds (#142)\n\nReturn the full unsigned range when subtraction may underflow and\nAllowUIntAsIndex is disabled. Preserve ordinary interval arithmetic\nunder the caller\u0027s no-underflow assumption when the flag is enabled."
    },
    {
      "commit": "7fae5ca9ec367647df518a13f7107c6ddbe0da01",
      "tree": "cd78903607ee64630d99e8218dd9951e65e85dda",
      "parents": [
        "8d5a72066f670eaa2283ceadc9a1dae98347f01f"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Oct 31 10:50:34 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 10:50:34 2026 -0400"
      },
      "message": "[FIX] Count assertions in automatic unroll cost (#140)\n\nCount AssertStmt as one step in the automatic unroll budget so\nassertion-only serial loops respect the configured step limit."
    },
    {
      "commit": "8d5a72066f670eaa2283ceadc9a1dae98347f01f",
      "tree": "2c546d2bb9498c1eb6cb8052355979304c305d28",
      "parents": [
        "a63362c4b6cce8d6d923d59cf55d43996bc6ab0b"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Oct 31 10:49:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 10:49:39 2026 -0400"
      },
      "message": "[FIX] Preserve loop enum formatting on Python 3.10 (#139)\n\nConstruct `ForKind` directly when formatting reflected loop kinds,\npreserving unknown values as integers. This keeps enum names available\non Python 3.10 and 3.11, where raw-value enum containment raises\n`TypeError`."
    },
    {
      "commit": "a63362c4b6cce8d6d923d59cf55d43996bc6ab0b",
      "tree": "ca369cf650745f5f0fe2fdc007c517d8445df6d4",
      "parents": [
        "ace4cc05ce3860ea7291ab56f27242e91719d7ff"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Oct 30 21:49:28 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 21:49:28 2026 -0400"
      },
      "message": "[DOCS][IR] Operators, Calls, and Regions; Op.register; enum display in format_tree (#136)\n\nThis PR rewrites `docs/ir/operators_and_calls.rst` around operators as\nthe main extension point of TIRx, and adds `ir.Op.register` so Python\ncode can define an operator without the internal FFI function.\n\n**API**\n- `ir.Op.register(name, doc)` adds an operator to the global registry\nand returns it. The operator starts with an empty signature and no\nattributes. Registering a name twice raises `AttributeError`. A test is\nadded in `tests/python/ir/test_attrs.py`.\n- `ir.format_tree` renders enums as `EnumType(NAME)`. FFI enums such as\n`MemoryScope` used to print their private fields\n(`MemoryScope(_int_index\u003d1, _str_index\u003d\u0027shared\u0027)`) and now print\n`MemoryScope(shared)` on the parent\u0027s line. `For.kind` used to print as\nan int (`kind\u003d3`) and now prints `ForKind(UNROLLED)`. Unknown loop kinds\nstill print as ints. One test is added and two loop-kind assertions are\nupdated.\n\n**Docs** (new title: Operators, Calls, and Regions)\n- `ir.Op`: a named, shared operator, and how a call uses it.\n- Operator Attributes: attributes are named maps from operators to\nvalues, and they are extensible. Passes find operators through\nattributes, so a new operator works with existing passes and a new pass\ncan add attributes to existing operators. Includes a table of common\nkeys.\n- Defining an Operator: a brief `Op.register` example with a signature,\neffect kind, and type rule, plus `expose()`. A note points to the Rust\nextension guide for the full example.\n- Regions: region operators via\n`FRegionGetBodyParams`/`FRegionValidate`, using `tirx.device_entry` and\nits launch configuration as the example.\n- Call fields, `ty_args`, `attrs`, and function calls are now covered in\nTypes and Expressions (#135). The overview\u0027s description of this chapter\nis updated.\n\nAll 6 snippets run against `apache-tvm-tirx` 0.1.0a6 with this `op.py`,\nand the 5 printed outputs match the page. `tests/python/ir` passes (87\npassed, 6 skipped)."
    },
    {
      "commit": "ace4cc05ce3860ea7291ab56f27242e91719d7ff",
      "tree": "35cb96dca8d062e7f6b16158fc117b912a710ef4",
      "parents": [
        "ee3c8fc27d9b4e87fdcbe53a541a3f26e33a4039"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Oct 30 21:02:03 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 21:02:03 2026 -0400"
      },
      "message": "[DOCS] Restructure Statements and complete Types and Expressions (#135)\n\nThis PR restructures `docs/ir/statements.rst` in the same style as #134,\nand completes `docs/ir/types_and_expressions.rst`.\n\n**Statements**\n- Opens with what the guide introduces and the add-one statement tree,\nfollowed by a table of all statement classes.\n- Sections: Sequences, Bindings, and Stores (including `Evaluate`);\nLoops; Branches; Loop Exits; Assertions and Returns (how `message_parts`\nkeep error messages compact); Regions, the main place for extensions,\nwith a note linking Operators and Calls, Region Syntax, and the\nextension tutorial.\n\n**Types and Expressions**\n- Expressions now starts with a table of expression classes, and\nPrimitive Expressions starts with its node table. The table now has a\nTVMScript syntax column that includes `\u003d\u003d`, `!\u003d`, `and`, `or`, and\n`not`.\n- The Call section covers `ty_args`, `attrs`, and function calls through\na `GlobalVar`.\n- What to Read Next is replaced by notes linking Operators and Calls and\nthe extension tutorial.\n\nExamples are TVMScript functions inspected with `format_tree`. All\nsnippets run on `apache-tvm-tirx` 0.1.0a6, and every printed output\nmatches the page: 9 in Statements and 14 in Types and Expressions."
    },
    {
      "commit": "ee3c8fc27d9b4e87fdcbe53a541a3f26e33a4039",
      "tree": "ae58fe8d1777c6b00dba94a6e41ee061f9b632fe",
      "parents": [
        "5ac16828f31b2f4687a1a30b8f1d8a914f7e7cda"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Oct 30 20:34:43 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 20:34:43 2026 -0400"
      },
      "message": "[DOCS] Restructure Types and Expressions around expression types (#134)\n\nThis PR restructures the Types and Expressions chapter around expression\ntypes.\n\nThe chapter now leads with what an expression is and the type every\nexpression carries in its `ty` field. It then introduces types briefly,\nwith a `TensorType` subsection, followed by expressions (`Var`,\nconstants, primitive expressions, tensor reads, tuples, calls),\ndependent types, and customization. Examples use `format_tree` and are\nself-contained."
    },
    {
      "commit": "5ac16828f31b2f4687a1a30b8f1d8a914f7e7cda",
      "tree": "85e155d6bcf54bc4abbff2d9460011a1bcebedb8",
      "parents": [
        "614169214c88a889ba0104e76e97772dd9a13835"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Oct 30 20:31:03 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 20:31:03 2026 -0400"
      },
      "message": "[DOCS] Introduce IR tree display before the class hierarchy (#133)"
    },
    {
      "commit": "614169214c88a889ba0104e76e97772dd9a13835",
      "tree": "7eae92c74664840b206010632573a0e7e12a6167",
      "parents": [
        "47ceb5d3fa7ede221ee6eac2cbffa6bb73b7fc12"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Fri Oct 30 19:18:17 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 19:18:17 2026 -0400"
      },
      "message": "[DOCS] Add guides for working with IR (#109)\n\nThis PR adds a **Working with IR** section with runnable examples for\nanalyzing, transforming, and debugging TIRx programs.\n\n- Explain structural walk, map, visit, and mutate through examples\ncovering callbacks, traversal order, variable definitions and uses,\nshared objects, and copy-on-write.\n- Introduce the core symbolic-analysis types, then demonstrate scoped\nfacts, index simplification, bounds, proofs, iteration mappings, and\naccessed regions.\n- Walk through writing a function pass, composing a pipeline, checking\nthe resulting IR, inspecting intermediate stages, and saving an input to\nreproduce a transformation independently.\n\nThe guides explain each example’s purpose, show its output, and connect\nthe result to the next step."
    },
    {
      "commit": "47ceb5d3fa7ede221ee6eac2cbffa6bb73b7fc12",
      "tree": "d22c0ec55655c47d5da2844ae3ceb11e82a41947",
      "parents": [
        "041dd6d7031f1764b8c9eecbfc88d43966f6e545"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Fri Oct 30 09:14:13 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 09:14:13 2026 -0400"
      },
      "message": "[DOCS][RUST] Use the published tvm-tirx crate in the extension example (#130)\n\n## Summary\n\n`tvm-tirx` 0.1.0-alpha.5 is now on crates.io, so the extension example\ndepends on the published\ncrate instead of `rust/` by path. Building the example no longer needs a\nsource build of TIRx:\n`pip install ./examples/extension` installs `apache-tvm-tirx` from PyPI,\nwhich provides the native\nlibraries the crate links, and builds the extension against it."
    },
    {
      "commit": "041dd6d7031f1764b8c9eecbfc88d43966f6e545",
      "tree": "d81863d120d064cfd8f3673cd212297fbdb10fb6",
      "parents": [
        "b83c5c033be1e92353f80a301c166a79cc013749"
      ],
      "author": {
        "name": "Lei Wang",
        "email": "34334180+LeiWang1999@users.noreply.github.com",
        "time": "Fri Oct 30 21:03:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 09:03:43 2026 -0400"
      },
      "message": "[Sym] Enable Z3 fallback for default proof queries (#132)\n\nThe default `Analyzer::CanProve` path can miss proofs that were\navailable through TileLang\u0027s TVM fork because it only reaches Z3 at\n`SYMBOLIC_BOUND` strength. For example, native analysis cannot prove\n`x*x + y*y \u003e\u003d 2*x*y`, although the existing Z3 prover can establish it\nunder the signed-index arithmetic model.\n\nUse Z3 as the final fallback at every proof strength, including\nrecursive default queries, after native analysis has not established the\nresult. Keep symbolic-bound analysis separately gated by\n`SYMBOLIC_BOUND`, and retain the existing solver limits and conservative\nhandling of unknown results. Call sites use the default policy without\nan additional option.\n\nUpdate the existing Z3 tests for the default policy and add coverage for\nthe nonlinear inequality, its strict-inequality counterexample,\nconstraint-scope cleanup, cloned resource limits, and builds without Z3.\nThe unsigned-index scope test now observes native rewriting directly,\nsince a successful default proof can also come from Z3."
    },
    {
      "commit": "b83c5c033be1e92353f80a301c166a79cc013749",
      "tree": "724a9cbc4d91a14e88930f2f834dd3d6582bb104",
      "parents": [
        "c562a0b498d32acba7d655ab054acb7985ea422a"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Fri Oct 30 08:30:05 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 08:30:05 2026 -0400"
      },
      "message": "[Bump] Bump version to 0.1.0a6 (#131)\n\nBump the version from `0.1.0a5` to `0.1.0a6` to prepare a wheel release\ncontaining the persistent scheduler parsing fix in #129."
    },
    {
      "commit": "c562a0b498d32acba7d655ab054acb7985ea422a",
      "tree": "48541cde60a64d51dded7cb62888132a6141bf2a",
      "parents": [
        "960a2b2ac1b0e018b8b11767f67e1556edd6992d"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Thu Oct 29 21:02:46 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 21:02:46 2026 -0400"
      },
      "message": "[Fix] Select persistent scheduler ordering at parse time (#129)\n\n`ClusterPersistentScheduler2D` fails to parse with the default\n`serpentine\u003dFalse`: an ordinary TVMScript `if` parses both branches and\naccesses the uninitialized `_M_BLOCKS` field.\n\nThis pr use `T.constexpr` to parse only the selected ordering.\nScheduling formulas and public APIs remain unchanged."
    },
    {
      "commit": "960a2b2ac1b0e018b8b11767f67e1556edd6992d",
      "tree": "2e15e75e14c86788a3e19b1146e59ba5fc269a3b",
      "parents": [
        "436f2a720d8f19a66a92a47b111888416d70ef53"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Thu Oct 29 19:24:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 19:24:14 2026 -0400"
      },
      "message": "[FEAT][RUST] Prepare the tvm-tirx crate and add the ci (#128)\n\n## Summary\n\nThis PR prepares the `rust/` crate for its first crates.io release as\n`tvm-tirx` 0.1.0-alpha.5,\nthe counterpart of `apache-tvm-tirx` 0.1.0a5. The crate now depends on\nthe crates.io release of\ntvm-ffi, its build script supports documentation builds on docs.rs, and\na manual workflow,\n`publish_crate.yml`, verifies the crate on every wheel platform and\npublishes it. The workflow\nfollows `publish_wheel.yml` for its inputs and platforms, and tvm-ffi\u0027s\n`publish_crates.yml` for\nits dry run and upload."
    },
    {
      "commit": "436f2a720d8f19a66a92a47b111888416d70ef53",
      "tree": "dfdc4d690966f013af6e833dd90ef395c363821a",
      "parents": [
        "4ed8610024d33892e2d5c4ee74f4853352f1bc0e"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Thu Oct 29 17:48:46 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 17:48:46 2026 -0400"
      },
      "message": "[DOCS][RUST] Add a tvm-tirx extension tutorial (#122)\n\n## Summary\n\nThis PR adds a tutorial on extending TIRx from Rust, in a new\ndocumentation section, \"Extending\nTIRx: everything is a plugin\". One running example, complex numbers,\ncovers the whole path:\n\n- **Rust.** A Rust library defines a complex IR type, four operators,\nand a pass that lowers them to\n  scalar arithmetic.\n- **Python.** Python loads the library and writes a kernel with the new\ntype in TVMScript. It\ncompiles the kernel with LLVM through a pipeline that runs the pass, and\nchecks the result\n  against NumPy.\n\nThis PR is based on #121, which lets an `rs_class` type be constructed\nwithout a `Placeholder`.\nUntil #121 merges, its commit also shows in this PR\u0027s diff.\n\n### Chapters\n\n- **Getting Started with Rust Extensions**\n(`docs/advanced/extending_ir_in_rust.rst`)\n- **Why Rust.** The C++ core stays stable, and an extension iterates on\nits own. The extension\nis a separate Rust library built on the `tvm-tirx` crate. It defines\ntypes, operators and\npasses on the same IR objects as C++ and Python, and loads without\nrebuilding TIRx.\n- **Setting up the project.** A `cdylib` crate that depends on\n`tvm-tirx` by path, built with\n    `uv run --no-sync cargo build`.\n- **The case study.** The kernel that multiplies two arrays of complex\nnumbers.\n- **Defining Types, Operators, and Passes**\n(`docs/advanced/defining_ir_extensions.rst`)\n- **The type.** `ComplexType`, an `rs_class` type registered with\n`register_type`.\n- **The operators.** `complex`, `cmul`, `real` and `imag`, defined as\n`OpDef` chains with Rust\n    type inference and validators.\n  - **The pass.** `LowerComplex`, built from three parts:\n- a `#[dispatch(map)]` rewriter that `structural_map` runs over the\nfunction;\n    - a second walk that rejects any complex value left over;\n    - `FunctionPass::new`, which wraps the function as a pass.\n- **Using and Compiling the Extension**\n(`docs/advanced/using_ir_extensions.rst`)\n- **Loading.** The script loads the library and declares the `my_ext`\nmodule for the builders.\n- **Compiling.** The script registers a pipeline that runs the pass\nbefore the default\nlowering. Compiling with the default pipeline instead fails in LLVM code\ngeneration.\n  - **Checking the result.** The script compares the outputs with NumPy."
    },
    {
      "commit": "4ed8610024d33892e2d5c4ee74f4853352f1bc0e",
      "tree": "c1bef9114c6bad2a15a480d106ff760e519def9c",
      "parents": [
        "bc7565391e4bd622e037ee30a0d7d64359eea783"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Thu Oct 29 15:00:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 15:00:44 2026 -0400"
      },
      "message": "[DOCS] Use format_tree for interactive IR walkthrough examples (#126)\n\nThis pr replaces hand-drawn program structure diagrams with runnable\nir.format_tree examples and actual output. Introduce the API in IR\nOverview with a standalone expression and examples of expanding and\nfolding fields.\nUse complete TVMScript functions for control-flow examples, explain how\nto retrieve the relevant IR objects, and improve transitions between\nsource code, inspection code, and output."
    },
    {
      "commit": "bc7565391e4bd622e037ee30a0d7d64359eea783",
      "tree": "dfde143e9c97bdb979b72b791440ff6a59da61ea",
      "parents": [
        "b40bf2d23fc9d60de2b10a30cd901d73ca55239c"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Oct 29 12:35:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 12:35:14 2026 -0400"
      },
      "message": "[DOCS] Restructure and polish programming guides (#124)\n\nRestructure the CUDA/PTX programming guides into a single \"Programming\nGuides\" section, and polish the overview, Control Flow, and\nMetaprogramming pages.\n\n- **Layout:**\n- All guides move to `docs/programming_guides/`, one level deep. Tile\noperations are the one exception and keep their own `tile/` folder.\n- Sidebar order: Programming Overview, Language Basics, Control Flow,\nTypes, Tensors, and Memory, Metaprogramming, Calling CUDA and PTX, Data\nLayout, Tile Operations, Compiling and Inspecting, Profiling with IKET.\n- The CUDA backend source guide and PTX TableGen move to the developer\nmanual as `dev/cuda/` (\"CUDA Backend Development\").\n- **Programming Overview (new):** design philosophy and programming\nmodel, adapted from the Apache TVM TIRx overview. It is reframed around\ndirect, hardware-native primitives, with tile operations and layouts as\nan optional convenience layer. It also covers the authoring-layers table\nand the lowering diagram.\n- **Control Flow:** a new page with `if`, `for` (`range`, `T.unroll`,\n`T.grid`), `while`, `break`/`continue`, and early thread exit\n(`T.gpu_thread_return()`). The examples are real kernels: ReLU, row sum,\ntranspose, and sorted search.\n- **Metaprogramming:** a new page with kernels parameterized by captured\nvalues, `@T.inline` fragments, and `@T.jit` specialization.\n- **Examples:** the code for Control Flow and Metaprogramming lives in\n`examples/programming_guides/` and is included with `literalinclude`.\n- **Other changes across the guides:**\n- Calling CUDA and PTX now covers the synchronization and warp\nintrinsics.\n  - Page titles and section headings use Title Case.\n  - Pages open with \"This guide ...\" instead of \"In this chapter\".\n  - CUDA launches use `grid\u003dT.ceildiv(n, 256), block\u003d256`.\n- Cross-reference text matches the new titles. This includes the API\nreference pages and two docstrings in `backend/cuda/tile/patterns`."
    },
    {
      "commit": "b40bf2d23fc9d60de2b10a30cd901d73ca55239c",
      "tree": "07f0632d91ca1a4fa6625ba7b40f0bffbc15ebf7",
      "parents": [
        "27396987961331a98a24943136c977f1804042cc"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Oct 29 12:25:16 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 12:25:16 2026 -0400"
      },
      "message": "[FIX] Preserve void error-call types during lowering (#125)\n\nUse the declared void result type for throw_last_error calls introduced\nby packed API and workspace lowering. This preserves structural\nTVMScript round-trips for CUDA host wrappers."
    },
    {
      "commit": "27396987961331a98a24943136c977f1804042cc",
      "tree": "41a2cb0fcac87c3e881e88bbedc9c4f62fb47c67",
      "parents": [
        "1760c7287e76243b37a5aa6b190f64eaf11b24e3"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Thu Oct 29 10:22:56 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 10:22:56 2026 -0400"
      },
      "message": "[DOCS] Make the IR walkthrough self-contained and expand examples (#123)\n\nThis PR makes each IR Walkthrough chapter readable independently by\nincluding the program definitions it uses and explaining how source\nconstructs map to IR objects.\n\nalso adds examples for branches, loops, assertions, returns, pointer and\ntuple types, boolean operations, and casts. Expand the printing\ndiagnostic example, improve transitions, and reduce repeated\nexplanations and prerequisite cross-references."
    },
    {
      "commit": "1760c7287e76243b37a5aa6b190f64eaf11b24e3",
      "tree": "3950ce054c7ef22bbc973af8d4b72275e8d472d6",
      "parents": [
        "b65b88a91b44ba3b1d1438b6fd4f30b1a3dc4687"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Thu Oct 29 10:14:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 10:14:52 2026 -0400"
      },
      "message": "[REFACTOR][RUST] Replace the Placeholder of IR types with the Unsafeinit (#121)"
    },
    {
      "commit": "b65b88a91b44ba3b1d1438b6fd4f30b1a3dc4687",
      "tree": "f69e62c3ced86f40c358ac526085f1da975b24af",
      "parents": [
        "34b8f22118228ce9264bf42883ac907e8281ca8b"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Oct 28 22:22:17 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 22:22:17 2026 -0400"
      },
      "message": "[DOCS] Polish IR Overview (#120)\n\nRewrite the IR Overview as a short narrative introduction to TIRx IR.\n\n- **IR Overview:**\n- Opens with the design goal: developers and agents can access every\nstage of compilation in the same way.\n- Introduces IR nodes and TVMScript, and shows the CUDA `add_one`\nexample.\n- Lists the main elements (types, expressions, statements, functions,\nmodules) with links to their API classes.\n- Class hierarchy: compact layout that fits the page width, `prim.*`\nlabels that give each operation\u0027s Python operator, and a paragraph on\nthe `ir`, `ir.prim`, and `tirx` namespaces and how downstream projects\nextend the IR.\n- A short note on source locations, and a bullet list for What to Read\nNext.\n- **Source locations:** the detailed walkthrough moves from Types and\nExpressions to Printing and Parsing, merged with the parser `filename`\nsection there.\n- **Quick Start:** the see-also link now says \"IR Overview\", matching\nthe page title.\n\nValidation:\n- The docs build passes with `-W`.\n- pre-commit passes.\n- The source-location output was checked against the examples."
    },
    {
      "commit": "34b8f22118228ce9264bf42883ac907e8281ca8b",
      "tree": "602178f89020b9744012103fa41d945fb2026882",
      "parents": [
        "0d2205f2530843eef1e396b2680a37633ff97150"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Oct 28 22:22:08 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 22:22:08 2026 -0400"
      },
      "message": "[FEAT] Add reflected IR tree inspection (#119)\n\nAdd `tvm_tirx.ir.format_tree` to inspect IR and extension objects\nthrough inherited FFI reflection. Class-aware fold, expand, and hide\nrules partially override a small default profile; folded callbacks\ncustomize leaf text while expansion exposes structure. Definition\nmetadata distinguishes variable declarations from references, and\nstructural comparison omits reflected defaults.\n\nDeclare typed loop defaults in native reflection, expose separate\ndefault selector collections and folded formatters, and use the API in\nQuick Start."
    },
    {
      "commit": "0d2205f2530843eef1e396b2680a37633ff97150",
      "tree": "9f428a9879553f80cd3d65789f4b459fbcc3eedd",
      "parents": [
        "4d894c4e7e2985653adbc6bd8ca2eb006069a7c0"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Oct 28 15:13:28 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 15:13:28 2026 -0400"
      },
      "message": "[CI] Split minimal example runners and cover Windows and macOS (#115)\n\nRun the quick-start examples through separate argument-free CPU and CUDA\ntask scripts, each retaining an explicit example list. Update the\nexisting Jenkins unit-test calls and run the CPU examples in the\nexisting Windows and macOS/Metal test steps.\n\nUse the native MSVC ABI and installed FFI import library for standard\nWindows module exports. Extend the Windows CPU runner to build and run\nthe C++ loader with CMake, including multi-config output placement and\nruntime DLL discovery. Use the runtime tensor allocator for portable\nalignment, remove the redundant Linux linker workaround, and update the\nadjacent example documentation."
    },
    {
      "commit": "4d894c4e7e2985653adbc6bd8ca2eb006069a7c0",
      "tree": "d6098fe2bb0c06aaf02f0e7f6f415a3fe75d50be",
      "parents": [
        "59a7b0246b596316d56f8108ad15eb1ecefb3b80"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Wed Oct 28 15:13:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 15:13:14 2026 -0400"
      },
      "message": "[FEAT][RUST] Complete OpDef chains when they are dropped (#116)\n\n## Summary\n\nEvery `OpDef` chain had to end in `.op()?`, which returns the error of a\nfailed step and requests\nthe operator\u0027s APIs through `ir.expose_op`. In a\n`tvm_ffi::static_init_block!`, where the operator\nis only defined, the `.op()?` carried nothing but those two duties, and\nforgetting it left the\noperator unexposed and its error unreported (only `#[must_use]` warned).\nC++ needs no such call:\nan `OpDef` completes as its statement ends.\n\nThis PR completes a chain when it is dropped, at the end of its\nstatement:\n\n```rust\ntvm_ffi::static_init_block! {\n    OpDef::new(\"my_ext.clamp\", \"Clamp an index to the range `[0, bound)`.\")\n        .signature((sig::arg::\u003cIntExpr\u003e(\"index\", \"\"), sig::arg::\u003cIntExpr\u003e(\"bound\", \"\")))\n        .set_infer_type(index_type)\n        .set_attr(CALL_EFFECT_KIND, CallEffectKind::Pure);\n    register_type::\u003cPairType\u003e()?;\n}\n```\n\n`.op()` stays for code that needs the `Op` or wants the `Result`: it\ncompletes the chain at once,\nand the drop then does nothing. Every existing chain that ends in\n`.op()?` compiles and behaves as\nbefore."
    },
    {
      "commit": "59a7b0246b596316d56f8108ad15eb1ecefb3b80",
      "tree": "411ea5f6128b65d1b4bc84529b5b6a88b9dac27a",
      "parents": [
        "52e6142a1db212ec1bcd2444e85c80a956ba11f7"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Oct 28 13:05:28 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 13:05:28 2026 -0400"
      },
      "message": "[FIX] Defer eager generic tensor annotations (#114)"
    },
    {
      "commit": "52e6142a1db212ec1bcd2444e85c80a956ba11f7",
      "tree": "e35ea4199d3de7a6f8706fe04dfb20d26cfdae67",
      "parents": [
        "bf804cbf8fa44ad97257b8613d0f477efa1bcc8e"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Oct 28 13:05:04 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 13:05:04 2026 -0400"
      },
      "message": "[CI] Run minimal examples in CPU and GPU unit tests (#113)"
    },
    {
      "commit": "bf804cbf8fa44ad97257b8613d0f477efa1bcc8e",
      "tree": "d29ae835680d33b669b77b0cfd299685f981ee1b",
      "parents": [
        "2c9ee25297ab04bc29daa566a8021fd1c9a51d98"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Oct 28 11:57:50 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 11:57:50 2026 -0400"
      },
      "message": "[DOCS] Polish Quick Start and landing page; bump to 0.1.0a5 (#112)"
    },
    {
      "commit": "2c9ee25297ab04bc29daa566a8021fd1c9a51d98",
      "tree": "f4431472c409008a4a15ca89deddb13b2738f316",
      "parents": [
        "cf0d8fb7e8e2ecc3ff37588ffb1e49b5f5a38267"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Wed Oct 28 11:56:25 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 11:56:25 2026 -0400"
      },
      "message": "[DOCS][RUST] Add the Rust API reference to the documentation site (#91)\n\n## Summary\n\nThe documentation site has a Python and a C++ API reference, but the\nRust crate in `rust/` had no\npage: its `cargo doc` had to be built and browsed by hand. This adds a\n*Rust API* entry next to the\nother two, generated by `cargo doc` the way the C++ reference is\ngenerated by Doxygen, and turns\nit on in the GPU pipeline that publishes the docs.\n\n`docs/conf.py` builds the reference when `BUILD_RUST_DOCS\u003d1`, as\n`BUILD_CPP_DOCS\u003d1` builds the\nC++ one. It runs `cargo doc --no-deps` on `tvm-tirx` and on `tvm-ffi`,\nthe crate it re-exports as\n`tvm_tirx::tvm_ffi`, so the links between the two stay inside the site\ninstead of pointing at\ndocs.rs; it clears `rust/target/doc` first, so pages of removed items do\nnot linger, except under\n`sphinx-autobuild`, where cargo\u0027s incremental documentation is kept.\nAfter the Sphinx build the\npages are copied under `reference/rust/generated` of the HTML output.\nRustdoc runs with\n`-D warnings` unless `RUSTDOCFLAGS` is set, so a broken intra-doc link\nfails the build as a\nbroken Sphinx reference does. The crate\u0027s build script links\n`libtvm_tirx_compiler` through\n`tvm-tirx-config`, so the package must be installed, which `uv run`\nalready arranges.\n\nThe new `docs/reference/rust/index.rst` introduces the crate, maps its\nmodules onto the Python\nnamespaces, and lists the two generated crates. `docs/dev/doc_build.rst`\nand `docs/README.md`\ndocument the switch, the `--watch rust/src` autobuild invocation, and\nthe cleanup of\n`rust/target/doc`.\n\n`tests/scripts/task_python_docs.sh` installs cargo through\n`task_install_rust.sh`, as the Rust CI\ntasks do, and sets `BUILD_RUST_DOCS\u003d1`, so the published docs carry the\nRust reference.\n\n`rust/src/lib.rs` moves the `tirx_register_ops` export into a\n`#[doc(hidden)]` module. The\nsymbol is exported by `#[no_mangle]` from wherever it is, and the\nmacro\u0027s expansion otherwise\nshowed up as an item at the crate root in the generated reference.\n\nSigned-off-by: Yuchuan \u003cyuchuan.7streams@gmail.com\u003e"
    },
    {
      "commit": "cf0d8fb7e8e2ecc3ff37588ffb1e49b5f5a38267",
      "tree": "7a6f8bf4f9facfa3e6b3888dadabfaf49fbda239",
      "parents": [
        "354c069262a0042786a67eece63f49962cfed9ba"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Oct 28 11:09:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 11:09:24 2026 -0400"
      },
      "message": "[FEAT] Expose tvm_tirx.compile as the canonical build API (#111)\n\nExpose `tvm_tirx.compile` as a direct alias of the existing TIRx\ncompiler, preserving `tvm_tirx.tirx.compile` as the implementation entry\npoint and retaining compiler-only import behavior.\n\nUpdate Python test callers, examples, API references and compile-related\ndocumentation to use the root entry point."
    },
    {
      "commit": "354c069262a0042786a67eece63f49962cfed9ba",
      "tree": "8c2ca2e767ec5a303614d0effe5828a9df6d6cc1",
      "parents": [
        "8afa23043008b576f526bd2187a7b5e031585ad4"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Oct 28 11:08:22 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 11:08:22 2026 -0400"
      },
      "message": "[FIX] Accept generic function decorators on Python 3.13 (#110)\n\nRecognize Python 3.13 generic function construction when validating\ndefinition-site decorators. Skip the PUSH_NULL call opcode while\npreserving the existing function-code and decorator-source checks."
    },
    {
      "commit": "8afa23043008b576f526bd2187a7b5e031585ad4",
      "tree": "f9a95a4900144ece3146a19e84d797ac16df2c38",
      "parents": [
        "9b5ae0b0e0e6618c56986986f959cd588baab9f9"
      ],
      "author": {
        "name": "Linzhang Li",
        "email": "yuchuan.7streams@gmail.com",
        "time": "Wed Oct 28 08:35:04 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 08:35:04 2026 -0400"
      },
      "message": "[REFACTOR][RUST] Define operators and types in tvm_ffi::static_init_block! (#105)\n\n## Summary\n\nThis PR defines Rust operators and types the way C++ does. The\ndefinitions are ordinary items, and\na `tvm_ffi::static_init_block!` registers them when the library loads,\nthe counterpart of\n`TVM_FFI_STATIC_INIT_BLOCK`. The crate\u0027s own `register_ops!` and\n`register_types!` macros, and the\nregistry behind them, are removed.\n\n```rust\n/// The type of a pair of values, printed as `my_ext.Pair(first, second)`.\n#[rs_class(\"my_ext.PairType\", final)]\npub struct PairTypeObj {\n    base: TypeObj,\n    pub first: Type,\n    pub second: Type,\n}\ndef_object_ref!(pub PairType, Type, PairTypeObj);\n\nimpl Placeholder for PairTypeObj {\n    fn placeholder() -\u003e Self {\n        Self::new(TypeObj::placeholder(), Type::placeholder(), Type::placeholder())\n    }\n}\n\ntvm_ffi::static_init_block! {\n    OpDef::new(\"my_ext.clamp\", \"Clamp an index to the range `[0, bound)`.\")\n        .signature((sig::arg::\u003cIntExpr\u003e(\"index\", \"\"), sig::arg::\u003cIntExpr\u003e(\"bound\", \"\")))\n        .set_infer_type(index_type)\n        .op()?;\n    register_type::\u003cPairType\u003e()?;\n}\n```\n\nSigned-off-by: Yuchuan \u003cyuchuan.7streams@gmail.com\u003e"
    },
    {
      "commit": "9b5ae0b0e0e6618c56986986f959cd588baab9f9",
      "tree": "a0daeb1a6e158d40c5009e6b984bd5891505f58d",
      "parents": [
        "bed8a865f47bf9ac382c7eb07b30577c5a882c07"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Wed Oct 28 08:33:11 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 08:33:11 2026 -0400"
      },
      "message": "[Fix] Allow host-side GPU tensor addresses in VerifyMemory (#108)\n\nTMA descriptor initialization forms GPU tensor addresses on the host\nusing `address_of(A_view[index])`. After #97 added parameter-view\nresolution, VerifyMemory incorrectly treated the TensorLoad operand as a\nhost-side GPU data read.\n\nThis pr visits the addressed operand’s source and indices without\ntreating the addressed element as a value load and checks for actual GPU\nreads/writes, masked accesses, and GPU reads inside address indices\nremain intact."
    },
    {
      "commit": "bed8a865f47bf9ac382c7eb07b30577c5a882c07",
      "tree": "382bcdcff579704092ad65e4ecf579d6740c9b6e",
      "parents": [
        "22e7ea33d09b8c9251c85eba8da8644e1e230d48"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Oct 28 08:32:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 08:32:41 2026 -0400"
      },
      "message": "[FIX] Omit loop constraints for zero extents (#107)\n\nSkip range and positivity constraints when a loop has zero extent. This\navoids invalid loop-variable bounds while traversing unreachable bodies"
    },
    {
      "commit": "22e7ea33d09b8c9251c85eba8da8644e1e230d48",
      "tree": "5ae060d9b33a065c863d8c5df93f398a43d56149",
      "parents": [
        "900bc34770e5efa3f5b87e3144e7d63b04ab4f98"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Wed Oct 28 07:09:55 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 07:09:55 2026 -0400"
      },
      "message": "[DOCS] Add CUDA/PTX programming guides adapted from Apache TVM (#94)\n\nThis PR adds CUDA/PTX programming guides adapted from Apache TVM,\npreserving the original tutorial structure, layout derivations, and\nexamples while updating them for the standalone `tvm_tirx` APIs."
    },
    {
      "commit": "900bc34770e5efa3f5b87e3144e7d63b04ab4f98",
      "tree": "feaffc13a51f7e225598188f42a2ca4ac6020397",
      "parents": [
        "6e2a74133cd3ed26b0baacfc0f3620b143cb11b7"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Tue Oct 27 21:23:34 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 21:23:34 2026 -0400"
      },
      "message": "[REFACTOR] Bind parser source locations to individual names (#103)\n\nBind generated parser source locations to individual fresh names instead\nof indexing a shared location list. Reuse each binding for repeated\nsource coordinates and preserve collision avoidance through the existing\nname allocator.\n\nUpdate parser comments and examples to match the generated names."
    },
    {
      "commit": "6e2a74133cd3ed26b0baacfc0f3620b143cb11b7",
      "tree": "2d91603552fbc4d7d663b49603acf628b0de59d9",
      "parents": [
        "77b1ee5fd4754c707e9364ce3033762545f78782"
      ],
      "author": {
        "name": "Godai Takashina",
        "email": "52688583+sankantsu@users.noreply.github.com",
        "time": "Tue Oct 27 20:59:21 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 20:59:21 2026 -0400"
      },
      "message": "[FIX] Resolve tensor views of parameters in VerifyMemory (#97)\n\n`LowerTensorLayouts` and `FlattenTensor` rebind tensor parameters as\n`decl_tensor(tensor_data_ptr(X))` views, which `VerifyMemory` could not\ntrace back to the parameter. As a result, host-side accesses to GPU\ntensor arguments (e.g. a CUDA function without thread bindings) passed\nverification and segfaulted at runtime instead of failing with \"Did you\nforget to bind?\".\n\nThis resolves such views to their base tensor before the existing\nargument check; the `abi_field_get` path is unchanged.\n\nThe two new tests fail without the fix. The other tests under\n`tests/python/backend/cuda/codegen`, `tests/python/codegen`,\n`tests/python/tirx/transform`, `test_compilation_pipeline.py`, and\n`test_cuda_launch.py` have the same outcomes with and without it."
    },
    {
      "commit": "77b1ee5fd4754c707e9364ce3033762545f78782",
      "tree": "cd74d3d211fae79dbde0d74678648a3bb6728cbb",
      "parents": [
        "336af73223991bd5586efe528bd59f888c0efc46"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Tue Oct 27 19:56:46 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 19:56:46 2026 -0400"
      },
      "message": "[REFACTOR] Publish explicit IR APIs to registered destinations (#99)\n\nCompleted operator and type definitions select APIs explicitly through\ndestination-neutral exposure helpers. Shared `ir/_expose_api.py` retains\nselected definitions and resolved destinations, allowing raw and script\nsurfaces to initialize independently with their own wrapping policies.\nC++, Python and Rust use the same exposure contract; string-based native\nhelpers are private, with completed `OpDef` definitions and the public\ntype template providing explicit entry points.\n\nPublication fills missing bindings and preserves existing callables,\nincluding an earlier type constructor after later class registration.\nExplicit destination re-registration refreshes the namespace and replays\nselected definitions. Four typed selection and destination collections\nreplace namespace copying, generated alias recovery, priority tracking\nand reentrancy bookkeeping. Shared helpers document their parameters,\npublication behavior and error contracts; `_set_api_and_export` assigns\nan attribute and updates only an existing export list.\n\nExtension modules explicitly declare their op/type API destinations.\nExposure no longer creates default parser roots: imported extension\nobjects work through Python scope, while text parsing receives them\nthrough source imports, `extra_vars` or explicit\n`parser.register_namespace`. `T.expose_script_op/type` publish to\ndeclared destinations before returning; built-in prefixes retain their\nscript binding result, while custom roots return `None` and callers read\ntheir declared module. Explicit `T.register_script_namespace` bindings\nremain available independently of parser defaults.\n\nIKET private helper patch targets resolve the owning module while public\nnamespace checks retain the forwarding alias."
    },
    {
      "commit": "336af73223991bd5586efe528bd59f888c0efc46",
      "tree": "9e9a4b6a5c2b185273faf5cd18e2fabc1deab18b",
      "parents": [
        "eab49d73fc70fe825c7e84a5570843285dd5019d"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Tue Oct 27 15:45:55 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 15:45:55 2026 -0400"
      },
      "message": "[FIX] Fold float64 literals and require LLVM 17 (#95)\n\nKeep C++ and Rust float64 literal folding consistent and restore the\nfolded ceil-log2 expectation. Require LLVM 17 or newer, retaining the\ndeclared packaged LLVM toolchain for CPU and GPU builds.\n\nRemove the ARM popcount instruction-count test."
    },
    {
      "commit": "eab49d73fc70fe825c7e84a5570843285dd5019d",
      "tree": "5ba1fe63f867b091510124d6e78aff992e140b60",
      "parents": [
        "6404161197ee4ad59f8598f0f96be7d7a5bff481"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Tue Oct 27 15:39:34 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 15:39:34 2026 -0400"
      },
      "message": "[FEAT] Expose registered ops and types at definition sites (#96)\n\nAdd definition-site script exposure for registered operators and IR\ntypes through `Op::ExposeScript`, `Type::ExposeScript`, and canonical\nRust and Python completion hooks.\n\nStable Python receivers defer early native requests until the script\nbuilder initializer connects the exposure callbacks. Completed\ndefinitions publish operator exports and type aliases without global\nregistry scans, preserving explicit builders and raw backend operator\nconstruction. Native helpers cache an optional receiver on first use so\nstandalone compiler loading also works without Python callbacks."
    },
    {
      "commit": "6404161197ee4ad59f8598f0f96be7d7a5bff481",
      "tree": "672960f9b993c594a33fd1c8c121157a93316c0c",
      "parents": [
        "783ccba996c6529f5047284fe0fe768ebbc878f1"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Tue Oct 27 15:35:43 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 15:35:43 2026 -0400"
      },
      "message": "[DOCS] Introduce Symbolic Integer Analysis (#57)\n\nAdd a brief **Symbolic Integer Analysis** overview under Compiler\nInternals. Describe its role in reasoning about shapes, loop bounds, and\nindices, introduce `sym.Analyzer`, and link to the current API\nreference. The overview stays concise while the analysis infrastructure\nand its APIs are under active development."
    },
    {
      "commit": "783ccba996c6529f5047284fe0fe768ebbc878f1",
      "tree": "dd167b5cf5875a2e3617561489210d5679d22728",
      "parents": [
        "86152703b09734ef7600b3edd2f6deac3a54af2d"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Mon Oct 26 22:42:54 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 22:42:54 2026 -0400"
      },
      "message": "[DOCS] Reuse Quick Start examples throughout the IR walkthrough (#82)\n\nRename the introductory tutorial to Quick Start and reuse its CPU/GPU\nadd-one programs throughout the IR walkthrough. Add field diagrams to\nexplain how IR nodes relate, with supplementary vector and sigmoid\nexamples for concepts beyond the base program.\n\nClarify Call construction, type inference, validation, statement bodies,\nvariable scope, and TVMScript region syntax.\n\nValidation:\n- Pre-commit checks passed.\n- Sphinx HTML build passed with warnings treated as errors.\n- Companion examples passed IR/type checks, print/parse round trips, and\nCPU numerical checks using LLVM and C.\n\n---------\n\nSigned-off-by: tlopex \u003c820958424@qq.com\u003e\nSigned-off-by: Yuchuan \u003cyuchuan.7streams@gmail.com\u003e\nCo-authored-by: Yuchuan \u003cyuchuan.7streams@gmail.com\u003e"
    },
    {
      "commit": "86152703b09734ef7600b3edd2f6deac3a54af2d",
      "tree": "d2f3b16099b3bad3c8232f8883e122311b1a8d2a",
      "parents": [
        "a821c08826b4721d47122ee9b1dced7f3b88e738"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Oct 26 22:20:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 22:20:58 2026 -0400"
      },
      "message": "[FIX][TARGET] Skip Arm target tags when LLVM lacks Arm backends; bump to 0.1.0a4 (#93)\n\nTags with an Arm LLVM target or host (Arm CPU boards, Raspberry Pi,\nJetson boards with an LLVM host, Apple Metal) are parsed when `tvm_tirx`\nis imported. On a native-only LLVM, such as the base wheel without the\n`all-targets` add-on, parsing them prints Arm feature warnings and\ninvalid `-mcpu` errors.\n\nThis PR adds `codegen.llvm.backend_enabled(mtriple)` next to\n`get_targets()` and builds it on that function: `aarch64`/`arm64`\ntriples need the `aarch64` backend, and `arm`/`thumb` triples need the\n`arm` backend. Arm-hosted tags register only when the matching backend\nis enabled. Builds without LLVM still register them as before. The Metal\ntags now use this check instead of CPU-name validation. The tag files\nimport `codegen.llvm` inside the registering function, which avoids an\nimport cycle with `tvm_tirx.target`. The Jetson AGX Thor tag test is\nskipped when the AArch64 backend is unavailable.\n\nThis PR also bumps the version from 0.1.0a3 to 0.1.0a4 in CMake, the\nruntime header, both Python package metadata files, and `libinfo`."
    },
    {
      "commit": "a821c08826b4721d47122ee9b1dced7f3b88e738",
      "tree": "d269071533c36644347c16f7fd220a61291d3497",
      "parents": [
        "75b9411b5a176b67342211a0368ac0a53ff5109e"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Oct 26 19:05:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 19:05:39 2026 -0400"
      },
      "message": "Bump version to 0.1.0a3 (#92)\n\nBump the TIRx version from 0.1.0a2 to 0.1.0a3 everywhere it is defined:\nCMake, the C++ header, the Python package and libinfo, and the\nllvm-targets wheel (including its exact pin on apache-tvm-tirx).\n\nThe Rust crate (rust/Cargo.toml, 0.1.0-alpha.1) keeps its own version\nfor now."
    }
  ],
  "next": "75b9411b5a176b67342211a0368ac0a53ff5109e"
}
