)]}'
{
  "log": [
    {
      "commit": "52b9376d3f224ab624cc0d5f5df1b35e0161d9f7",
      "tree": "1a33aded871265a8b1ef300e7a4c297570967d7c",
      "parents": [
        "277ae41efa503f899359b3a581f7c54b4b87d197"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Thu Jul 23 20:02:48 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 20:02:48 2026 -0400"
      },
      "message": "[Fix][TIRx] Ignore statement spans in structural identity (#20043)\n\nThis PR excludes `tirx::StmtNode::span` from structural equality and\nstructural hash calculations.\n\nSource locations are diagnostic metadata and should not affect the\nstructural identity of a TIRx statement. Other TIRx nodes with spans\nalready follow this behavior, but `StmtNode::span` was missing the\n`SEqHashIgnore` field flag.\n\nA regression test is added to verify that two otherwise identical\nstatements with different spans are structurally equal and produce the\nsame structural hash."
    },
    {
      "commit": "277ae41efa503f899359b3a581f7c54b4b87d197",
      "tree": "0a7f4d39af1bf1803aad7a39bd72e103e5ab6697",
      "parents": [
        "5b2693d96e06a3b635c5fdeb6e044d2fa13a0349"
      ],
      "author": {
        "name": "Guan-Ming Chiu",
        "email": "105915352+guan404ming@users.noreply.github.com",
        "time": "Fri Jul 24 03:31:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 15:31:55 2026 -0400"
      },
      "message": "[Relax] Legalize grouped conv with symbolic channels (#20039)\n\n- `LegalizeOps` skips grouped `conv1d/2d/3d` when channel size is\nsymbolic\n- The only blocker is `topi.nn.conv`\u0027s divisibility `assert`s, which\nfail on symbolic `PrimExpr`; the grouped compute already handles\nsymbolic dims\n\n## How\n\n- Skip the divisibility check when the channel size is not a constant\nint\n- Remove the symbolic-channel guards from the conv legalize functions"
    },
    {
      "commit": "5b2693d96e06a3b635c5fdeb6e044d2fa13a0349",
      "tree": "72dcc569c16ae2b3a13c381d50b5df38901f7d8c",
      "parents": [
        "bac59afa0d646be7dd9ff938dd7a371b8fa9bfd1"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Jul 23 21:43:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 09:43:09 2026 -0400"
      },
      "message": "[CI] Verify packed uint1 tvm-ffi revision (#20041)\n\nAdvance the `3rdparty/tvm-ffi` submodule to the latest merged `main`,\nwhich includes the scalar `uint1` packing correction. This keeps TVM CI\npinned to the current dependency contract."
    },
    {
      "commit": "bac59afa0d646be7dd9ff938dd7a371b8fa9bfd1",
      "tree": "5dcbc04f371dc2496c9789427ea79539626d3fb2",
      "parents": [
        "828d117ebdb90e4474e5b7a9ead4e88b35865a58"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Wed Jul 22 15:57:35 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 15:57:35 2026 -0400"
      },
      "message": "[TIRx] Improve BufferStore cast warning context (#20038)\n\nThis PR improves the precision-loss warning emitted while building a\n`BufferStore`.\n\nBefore this change, the warning only displayed the LHS and RHS dtypes,\nmaking it difficult to identify the failing kernel when many kernels\nwere built together:\n\n```text\nWarning: Casting in BufferStore may lose precision:\nLHS is `T.int32`, RHS is `T.float32`, indexing lanes: 1\n```\n\nAfter this change, the warning also displays the current kernel name and\nthe complete `BufferStore` node:\n\n```text\nWarning: Casting in BufferStore may lose precision:\nLHS is `T.int32`, RHS is `T.float32`, indexing lanes: 1,\nkernel: `warning_kernel`\n\nBufferStore:\nA \u003d T.Buffer((4,), \"int32\")\nB \u003d T.Buffer((4,))\ni \u003d T.int32()\nA[i] \u003d T.Cast(\"int32\", B[i] + T.float32(0.5))\n```"
    },
    {
      "commit": "828d117ebdb90e4474e5b7a9ead4e88b35865a58",
      "tree": "597f76e800b129ff123c86ca3aa5000697035e5b",
      "parents": [
        "551be33ed3026ebde5bfe8399940c42c91373e96"
      ],
      "author": {
        "name": "Akaash Parthasarathy",
        "email": "43900735+akaashrp@users.noreply.github.com",
        "time": "Tue Jul 21 17:31:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 17:31:05 2026 -0700"
      },
      "message": "[Web] Expose RNG state for deterministic restore (#20034)\n\nExpose tvmjs RNG state so callers can save and restore deterministic\nsampling progress. Adds the following:\n- `RNGState` as the exported state type for\n`LinearCongruentialGenerator`\n- `LinearCongruentialGenerator.getState()`\n- `LinearCongruentialGenerator.setState(state)`\n- `Instance.getRNGState()`\n- `Instance.setRNGState(state)`"
    },
    {
      "commit": "551be33ed3026ebde5bfe8399940c42c91373e96",
      "tree": "b72b4facd06d5b5c92fcaa66aa4250ba4411c88a",
      "parents": [
        "1a4e037bbbec85634b1fcae1dd55e136fcb8b416"
      ],
      "author": {
        "name": "Václav Haisman",
        "email": "vhaisman@gmail.com",
        "time": "Mon Jul 20 10:57:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 16:57:07 2026 +0800"
      },
      "message": "[Vulkan] Fix SPIR-V 1.4+ entry-point interfaces (#20028)\n\n## What changed\n\nThis updates Vulkan code generation for targets requesting SPIR-V 1.4 or\nnewer:\n\n- propagate `max_spirv_version` into `SPIRVSupport` and emit that\nversion in the SPIR-V header;\n- track storage-buffer arguments, uniform buffers, push constants, and\nother module-scope variables;\n- include those variables in the `OpEntryPoint` interface list for\nSPIR-V 1.4+;\n- retain TVM\u0027s historical SPIR-V 1.0 output for older targets.\n\n## Why this is necessary\n\nSPIR-V 1.4 changed the `OpEntryPoint` contract: every module-scope\nvariable used by an entry point must be listed in its interface\noperands. TVM previously listed only built-in variables.\n\nTVM also always emitted a SPIR-V 1.0 header, even when the Vulkan target\nadvertised SPIR-V 1.5. That caused validation to use the older rules and\nmasked the incomplete interface list. Reassembling a generated\nstorage-buffer kernel as SPIR-V 1.5 and validating it for Vulkan 1.2\nproduced:\n\n```text\nInterface variable id \u003c4\u003e is used by entry point \u0027main_kernel\u0027 id \u003c2\u003e,\nbut is not listed as an interface\n%A_ptr \u003d OpVariable ... StorageBuffer\n```\n\nLocal validation used the smallest useful kernel, `B[0] \u003d A[0] + 1`. Its\ngenerated instructions were reassembled with `spirv-as --target-env\nspv1.5` and independently validated with `spirv-val --target-env\nvulkan1.2`. This external-tool validation is intentionally not part of\nthe Python test suite.\n\nAfter the fix, its entry point contains both storage buffers:\n\n```text\nOpEntryPoint GLCompute ... \"main_kernel\" %BuiltInLocalInvocationId %A_ptr %B_ptr\n```\n\n## Validation\n\n- Built TVM\u0027s Vulkan and LLVM-enabled compiler successfully.\n- Ran the complete repository lint suite:\n\n  ```text\n  pre-commit run --all-files\n  All hooks passed\n  ```\n\n- Ran the complete Vulkan codegen test module:\n\n  ```text\n  30 passed, 24 skipped\n  ```\n\n- Confirmed `git diff --check` passes."
    },
    {
      "commit": "1a4e037bbbec85634b1fcae1dd55e136fcb8b416",
      "tree": "921becff5c02e0ba09d209a9acb156c5ca792f1a",
      "parents": [
        "a6c7377bae6d721880a23afce9642f3676292ab4"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Jul 20 14:26:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 14:26:46 2026 +0800"
      },
      "message": "[CI] Bump tvm-ffi with compatible Python wrappers (#20032)\n\n## Summary\n\n- bump tvm-ffi and include the device definition where its `DLDevice`\ntraits are instantiated\n- keep only the required Tensor wrapper layout fix and register\n`ir.Type` before reflected `Expr` fields can materialize a fallback\nwrapper\n- preserve `BaseFunc.with_attr` callers by moving only method-private\nresults, never the canonical `self` wrapper\n\n## Rationale\n\nThe tvm-ffi lifetime update requires a replacement wrapper to fit the\nlayout already registered for the same type index. `runtime.Tensor`\nreplaces the core `ffi.Tensor` wrapper, so it must use empty slots. The\nordinary TVM mixins are first-registered with their concrete descendants\nand may safely retain normal Python dictionaries; the additional mixin\nand explicit-dictionary slot changes are not required.\n\nObject tying also means `BaseFuncCopy(self)` may return `self`. Passing\nthat wrapper through `_move()` invalidates the caller. The first update\nnow passes the alias as an lvalue, forcing native copy-on-write to\ncreate a private result. Only later dictionary updates move a result\nthat is not `self` and has not escaped the method.\n\n## Validation\n\n- built an exact CPython 3.12 wheel from tvm-ffi `21e30c3b1d` and\nrebuilt TVM against it\n- direct Type/function/detach regressions: 3 passed\n- complete IR plus focused Relax coverage: 111 passed\n- prior Relax failure set: 157 passed, 9 skipped\n- runtime probe for `relax.Function`, `relax.ExternFunc`, and\n`tirx.PrimFunc`: original wrappers preserved; single- and\nmulti-attribute results distinct and valid\n- all touched-file pre-commit hooks passed\n\n---------\n\nCo-authored-by: Yaxing Cai \u003ccaiyaxing666@gmail.com\u003e"
    },
    {
      "commit": "a6c7377bae6d721880a23afce9642f3676292ab4",
      "tree": "3fb0d3a739f4cfb96dca9eaaa798438a9349bbdd",
      "parents": [
        "a82b34dc9f545b95b4645e9741379157dcf5b1ce"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Jul 20 06:21:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 06:21:51 2026 +0800"
      },
      "message": "[REFACTOR][TIRx] Keep AttrStmt node values unboxed (#20030)\n\nAttrStmt.node is an ffi::Any field, so converting POD arguments to\nPrimExpr makes its representation depend on the caller rather than the\ndeclared container type.\n\nThis change preserves values passed through AttrStmt and T.attr, uses\nraw zero sentinel nodes consistently, and updates the printer\ncanonicalization."
    },
    {
      "commit": "a82b34dc9f545b95b4645e9741379157dcf5b1ce",
      "tree": "1834113f9fb9cb922cf2be842c0faceaea5c4a48",
      "parents": [
        "d02a68e403eb1b473844bd1b36302f44ac66dc32"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Sat Jul 18 17:16:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 05:16:31 2026 +0800"
      },
      "message": "[Tests] Reduce redundant ONNX and PyTorch integration tests (#20026)\n\nThis PR reduces repeated Relax frontend and integration test work while\npreserving distinct coverage. It reworks ONNX ConvTranspose tests into\ndirect importer checks plus 11 numerical cases covering all ranks,\nasymmetric padding, grouping, bias, dilation, and output padding.\nTargeted runtime improves from 17.97s to 3.55s.\n\n- removes duplicate ONNX Pow, unused dynamic Squeeze parameterizations,\nand irrelevant Resize ROI value permutations.\n- consolidates overlapping PyTorch integration tests while preserving\nsymbolic shapes, TIR, I.pyfunc, and packed-function coverage.\n- removes the redundant BasePyModule aggregate suite, moves its unique\noutput-only call_tir case into the DLPack test, and removes a DLPack\ntest that swallowed all exceptions."
    },
    {
      "commit": "d02a68e403eb1b473844bd1b36302f44ac66dc32",
      "tree": "3e021259388b4969c01562f7a4ea4ed4994a45b2",
      "parents": [
        "396dd349460ffbfd1e46d9308ca7d67997d0ad23"
      ],
      "author": {
        "name": "Hamza Qureshi",
        "email": "63870077+hamzaqureshi5@users.noreply.github.com",
        "time": "Sat Jul 18 10:10:32 2026 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 01:10:32 2026 -0400"
      },
      "message": "[Relax][Frontend][ONNX] Support dynamic index for Gather on shape (#19968)\n\nThe ONNX importer\u0027s Gather converter asserted that indices must be a\nconstant whenever the data operand is a ShapeExpr, raising \"Only\nconstant indices supported for shape gather.\" for any runtime-computed\nindex. Detection post-processing graphs such as FasterRCNN feed a\ndynamic index into a Gather whose data comes from a Shape node, so\nimport failed before compilation could start.\n\nKeep the fast path for a single constant index, which resolves one\ndimension to a PrimValue and preserves shape-specialized handling\ndownstream. Any other index (dynamic, or a constant selecting multiple\ndimensions) materializes the shape as an int64 tensor via\nshape_to_tensor and gathers from it at runtime, reusing the existing\nnegative-index normalization.\n\nAdds a regression test that gathers a dimension out of a Shape result\nusing a non-constant index, covering positive and negative indices, and\nchecks it against onnxruntime.\n\nFixes part of #19965."
    },
    {
      "commit": "396dd349460ffbfd1e46d9308ca7d67997d0ad23",
      "tree": "1116545ad7b3d13e352daeda8a99c27497f07845",
      "parents": [
        "3a5b4d4e64707a1528146e28c0fb75f45da99dd7"
      ],
      "author": {
        "name": "Kryptonite",
        "email": "oalazizi75@gmail.com",
        "time": "Sat Jul 18 07:14:55 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 00:14:55 2026 -0400"
      },
      "message": "[Fix][Relax][ONNX] Preserve ONNX Squeeze axes attribute for opset \u003c 13 (#19966)\n\n## Summary\nBefore opset 13, ONNX `Squeeze` specifies `axes` as a node attribute\nrather than a tensor input. The Relax ONNX importer only implemented\n`_impl_v13`, which reads axes from the second input, so for opset \u003c 13\nmodels, the attribute was silently ignored (`axis` defaulted to `None`)\nand the importer squeezed every size-1 dimension instead of only the\nrequested one. This produced tensors with the wrong rank, breaking\ndownstream ops like `Transpose` whose `perm` no longer matched the\ninput\u0027s actual rank.\n\nAdded `_impl_v1` to read `axes` from the node attribute for opset \u003c 13,\nand factored the existing squeeze logic into a shared `_squeeze` helper\nused by both `_impl_v1` and `_impl_v13`.\n\n## Test plan\n- Added `test_squeeze_axes_attribute` to\n`tests/python/relax/test_frontend_onnx.py`, covering an opset-11\n`Squeeze` node with `axes` as an attribute.\n- Ran `pytest tests/python/relax/test_frontend_onnx.py -k squeeze`. All\n21 tests pass.\n- Verified against the real-world model that triggers this bug,\n[PaddlePaddle/PP-OCRv6_tiny_rec_onnx](https://huggingface.co/PaddlePaddle/PP-OCRv6_tiny_rec_onnx)\n(opset 11, uses attribute-based `Squeeze`): import fails on `main` with\n`Transpose: number of axes in perm attribute (3) must equal the number\nof input tensor dimensions (-1)`, and succeeds with this fix.\n\n## Real-world reproduction\n\n```python\nimport urllib.request\n\nimport onnx\n\nfrom tvm.relax.frontend.onnx import from_onnx\n\n# PaddlePaddle/PP-OCRv6_tiny_rec_onnx (opset 11, uses attribute-based Squeeze)\nurl \u003d \"https://huggingface.co/PaddlePaddle/PP-OCRv6_tiny_rec_onnx/resolve/main/inference.onnx\"\npath \u003d \"pp_ocrv6_tiny_rec.onnx\"\nurllib.request.urlretrieve(url, path)\n\nmodel \u003d onnx.load(path)\nprint(\"opset:\", [(o.domain, o.version) for o in model.opset_import])\n\nfor node in model.graph.node:\n    if node.op_type \u003d\u003d \"Squeeze\":\n        axes_attr \u003d [a for a in node.attribute if a.name \u003d\u003d \"axes\"]\n        print(node.name, \"inputs\u003d\", list(node.input), \"axes_attr\u003d\", axes_attr)\n\n# Fails on main with:\n#   ValueError: Transpose: number of axes in perm attribute (3) must equal the number of input tensor dimensions (-1)\n# Succeeds with this fix.\nmod \u003d from_onnx(model)\nprint(\"Import succeeded\")\n```\n\nFixes (partially) #19965. The shape-Gather and dynamic-TopK issues\nreported in that issue are separate and not addressed here."
    },
    {
      "commit": "3a5b4d4e64707a1528146e28c0fb75f45da99dd7",
      "tree": "0496dec4b0a4f9d766c7da4102936e02277aa228",
      "parents": [
        "d33a44702c23dccb8d9f850032d703f22a35af4a"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Jul 18 04:19:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 16:19:30 2026 -0400"
      },
      "message": "[S-TIR] Remove unused meta-schedule annotation constants (#20022)\n\nThis removes two declaration-only meta-schedule annotation families from\nthe S-TIR header.\n\nThese constants have no producers or consumers, so the change only\nremoves dead C++ compile-time names and does not alter generated IR or\nlowering behavior.\n\nValidation:\n- exact identifier and literal absence searches\n- git diff --check\n- changed-file pre-commit and clang-format\n- fresh full configured CPU CMake/Ninja build"
    },
    {
      "commit": "d33a44702c23dccb8d9f850032d703f22a35af4a",
      "tree": "bf334643ff472d9977b425cf8b47b3c761de58ea",
      "parents": [
        "80648af29f0902a7b02883dc280226695c58bc10"
      ],
      "author": {
        "name": "Syeam Bin Abdullah",
        "email": "49330057+sbinabdullah@users.noreply.github.com",
        "time": "Sat Jul 18 00:14:25 2026 +0930"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 10:44:25 2026 -0400"
      },
      "message": "[Tests] Update test_adaptive_pooling_window expected IR for const-int-bound fix (#20023)\n\nFollowup to #19978: the const-int-bound modular-set fix correctly\nprevents the simplifier from over-folding the adaptive pool window\nextent. The previous expected IR used the simplified closed form `(v_ax2\n% 3 * 4 + 16) // 12 + 1`, which was only reachable because the buggy\nbound let `CanProve` prove an invalid predicate. After the fix the\ngenerated IR retains the correct `T.Select` form, so update the expected\nIR to match and remove the `xfail` marker that was added in #19978.\n\nThis branch is based on current main so the `xfail` removal is explicit\n(addressing feedback from @tlopex on the previous attempt in #19995)."
    },
    {
      "commit": "80648af29f0902a7b02883dc280226695c58bc10",
      "tree": "1fa88027ccfa83b6f196e985e9ea4556e0bdf128",
      "parents": [
        "9f1e1980c1442652df69d64f506c5e5e70efdebe"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Jul 17 17:08:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 17:08:13 2026 +0800"
      },
      "message": "[REFACTOR][TIR] Remove buffer type and axis separators (#20019)"
    },
    {
      "commit": "9f1e1980c1442652df69d64f506c5e5e70efdebe",
      "tree": "36e74fecb7ba1ec083a927a0ebb324b074267bf6",
      "parents": [
        "9bfefb7e4b2f13f92b59ed4755bc83d856369c40"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Thu Jul 16 23:06:12 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 23:06:12 2026 -0400"
      },
      "message": "[Tests][Frontend] Remove redundant PyTorch frontend tests (#20021)\n\nThis PR:\n- Removes duplicate module/functional, alias, positional-argument, and\nno-op cases from the PyTorch ExportedProgram tests.\n- Consolidates the four GRU configurations into a table-driven loop\nwithout removing any configurations.\n- Removes duplicated FX cases already covered through the same shared\nconverters.\n- Restores FX scalar tensor constant coverage and TFLite\nconstant-parameter Gather and static broadcast/MUL coverage."
    },
    {
      "commit": "9bfefb7e4b2f13f92b59ed4755bc83d856369c40",
      "tree": "45f2d748a68e8c5177135a1bffb91de160adc83a",
      "parents": [
        "302aaf9f961a6e0a2c5cc23dc87e51fbaabd1e42"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Jul 17 05:34:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:34:50 2026 -0400"
      },
      "message": "[TIRx] Introduce first-class Return statement (#20018)\n\nReturn is control flow, but TIRx currently represents it as an\nEvaluate-wrapped intrinsic call. This prevents return values from\nparticipating naturally in statement traversal and requires special-case\nhandling across the pipeline.\n\nThis change introduces a reflected tirx.Return statement carrying an\nExpr, wires it through TVMScript, statement visitors and mutators,\nlowering, storage planning, and C/LLVM code generation, and removes the\nlegacy tirx.ret and T.ret surfaces."
    },
    {
      "commit": "302aaf9f961a6e0a2c5cc23dc87e51fbaabd1e42",
      "tree": "dea868292addd052f65d58041fc15649dd727121",
      "parents": [
        "e6d5252f25ba0a7283a12c46c142796cba6eeb68"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Jul 17 05:34:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 05:34:31 2026 +0800"
      },
      "message": "[IR] Rename Var name_hint field to name (#20016)\n\nRename the reflected local `Var` field from `name_hint` to `name` and\nupdate its typed C++ consumers. Preserve distinct named-node APIs and\nthe Python constructor keyword compatibility path, while making `.name`\nthe sole stored Var property. Upgrade legacy compact JSON records for\ncurrent and pre-unification Var schemas.\n\nValidation: full runtime/compiler build, focused C++ Var copy-helper\ntest, focused Python IR/Relax/TIRx/script tests, Vulkan codegen syntax\nbuild, touched-file pre-commit checks, and `git diff --check`."
    },
    {
      "commit": "e6d5252f25ba0a7283a12c46c142796cba6eeb68",
      "tree": "ed913322fa4250f78a25017135e383afe4c493b3",
      "parents": [
        "5012012df720ab7eb58b6a8e76c742228b0f17a9"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Jul 17 05:27:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:27:07 2026 -0400"
      },
      "message": "[REFACTOR][TIR] Phase out redundant TIRx attr names (#20017)\n\nTIRx currently re-declares many attributes that are owned by S-TIR,\nalong with several legacy attributes that no longer have consumers.\nKeeping duplicate names makes ownership ambiguous and lets consumers\naccidentally depend on transitive declarations.\n\nThis change leaves TIRx with only the attributes needed by low-level\nlowering and code generation, removes unused legacy declarations, moves\n`buffer_bound` to S-TIR, and updates the remaining cross-layer consumers\nto include and use the S-TIR declarations explicitly. Attribute string\nvalues remain unchanged."
    },
    {
      "commit": "5012012df720ab7eb58b6a8e76c742228b0f17a9",
      "tree": "6940dffa14ee0ed1179da0fecd03844809da4031",
      "parents": [
        "eafcba1c44fffbb881bb5f838ad72e0cfafa9ce5"
      ],
      "author": {
        "name": "Akaash Parthasarathy",
        "email": "43900735+akaashrp@users.noreply.github.com",
        "time": "Thu Jul 16 14:23:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 05:23:42 2026 +0800"
      },
      "message": "[Web] Link TVMFFIHandleInitOnce into WASM runtime (#20020)\n\nGenerated LLVM modules now use TVMFFIHandleInitOnce to initialize cached\npacked-function handles. The WASM runtime did not include the\ncorresponding implementation, causing Emscripten to emit it as an\nunresolved env import. Include `init_once.cc` in the WASM runtime so the\nsymbol is linked into generated model libraries."
    },
    {
      "commit": "eafcba1c44fffbb881bb5f838ad72e0cfafa9ce5",
      "tree": "6fa04ab9389da5aa618eeff6cf827e8692630e75",
      "parents": [
        "d8d4b841cbc2ab88aaabc5b5099b61ec16bb9451"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Thu Jul 16 15:57:40 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 15:57:40 2026 -0400"
      },
      "message": "[Relax][TensorRT] Fix YOLO BYOC offload and partitioning gaps (#19998)\n\nFixes #19887.\n\nThis PR fixes several Relax TensorRT BYOC issues exposed by YOLO-style\nmodels:\n\n- adds TensorRT support for SiLU and resize2d\n- preserves operand and TupleGetItem ordering during codegen\n- fixes cyclic and unsafe Tuple/TGI region merging\n- handles static Shape bindings and nested packed-function outputs\n- normalizes PrimType dtype arguments passed to relax.arange\n\nWith these changes, yolo11n-seg can be merged into a single TensorRT\nregion, while yolo11n can be imported and partitioned successfully."
    },
    {
      "commit": "d8d4b841cbc2ab88aaabc5b5099b61ec16bb9451",
      "tree": "3903e995e40a39e4f48e034abe62c1b24093fe31",
      "parents": [
        "453070e1bb4babb7d6bc2b28f976368146d76ec8"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Thu Jul 16 15:54:04 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 15:54:04 2026 -0400"
      },
      "message": "[Tests][Frontend] Remove redundant ONNX and TFLite tests (#20012)\n\nThis PR removes redundant and misleading Relax ONNX and TFLite frontend\ntests.\n\nFor ONNX, it removes numerical tests already covered more systematically\nby the official ONNX backend suite, duplicate/subset IR checks,\nredundant NMS cases, and unused test parameters/helpers.\n\nFor TFLite, it removes tests that TensorFlow 2.19 rewrites into\nalready-covered operators, exact duplicates, no-op models, and checks\nsuperseded by stronger retained tests."
    },
    {
      "commit": "453070e1bb4babb7d6bc2b28f976368146d76ec8",
      "tree": "08bf452f7f314171827cb35d9f253fbea7b255fc",
      "parents": [
        "91fb997563e61ba21550357e11862468b6ec3336"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Jul 16 10:37:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 10:37:35 2026 +0800"
      },
      "message": "[REFACTOR] Remove redundant defensive code guaranteed by IR invariants (#20011)\n\nCleanup pass that relies on IR invariants instead of re-checking\nalready-guaranteed conditions. No new features; this is a\nconsolidation/cleanup pass only.\n\n## Changes\n\n- **docsifier (`python_doc_printer.cc`)**: the `ExprStringDoc` escape\nscope always wraps the printer\u0027s fixed in-memory `ostringstream` sink,\nwhich never short-writes and never enters a fail state. Drop the\nstreambuf-general short-write reporting in `xsputn`, the ctor `good()`\nICHECK, the dtor `rdstate`/`setstate` dance, and the redundant\npost-render `good()` ICHECK; keep the one-line `saw_newline()` contract.\n- **relax diagnostics (`well_formed.cc`, `block_builder.cc`)**: the ty\ndiagnostics test `ty.IsMissing()` on a now non-nullable `Type`, so word\nthem as \"is missing\" rather than \"is nullptr\".\n- **relax numeric-gradient tests**: derive the device from the build\ntarget via `tvm.device_from_target` inside the helpers instead of\nthreading a redundant `dev` argument that duplicates `target` at every\ncall site; annotate the numpy inputs as `np.ndarray`.\n- **target/printer tests**: drop assertions that re-check a condition an\nearlier assertion in the same test already guarantees."
    },
    {
      "commit": "91fb997563e61ba21550357e11862468b6ec3336",
      "tree": "4f3ee5f2d49d94dd14d831e31d8aeef3d41281ae",
      "parents": [
        "0e75b43a62c31d0f14aa6619462fa845d2c5b5a3"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Jul 16 07:43:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 07:43:00 2026 +0800"
      },
      "message": "[REFACTOR][IR] Use CamelCase Var copy helpers (#20008)"
    },
    {
      "commit": "0e75b43a62c31d0f14aa6619462fa845d2c5b5a3",
      "tree": "8ddfcbe980fc63214dc89ef6a643a8fbf071a1fc",
      "parents": [
        "1a764d799316c7d73123750a0a3f7ce40c7d5cba"
      ],
      "author": {
        "name": "Balint Cristian",
        "email": "cristian.balint@gmail.com",
        "time": "Thu Jul 16 01:57:27 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 18:57:27 2026 -0400"
      },
      "message": "[Fix][Relax][ONNX] Relax op normalization for onnx subgraphs (#20010)\n\n### Summary\nOnnx subgraph imports should also normalize and generate ty_info for its\nops, this is broken since #19853 refactor.\n\n### Issue\n\n```\ntests/python/relax/test_frontend_onnx.py:11581: in test_if_subgraph\n    tvm_model \u003d from_onnx(model, keep_params_in_input\u003dTrue)\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n/usr/lib/python3.15/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py:6283: in from_onnx\n    return g.from_onnx(graph, opset)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n/usr/lib/python3.15/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py:5823: in from_onnx\n    self._construct_nodes(graph)\n/usr/lib/python3.15/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py:5969: in _construct_nodes\n    then_expr \u003d self._convert_subgraph(self.bb, attr[\"then_branch\"])\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n/usr/lib/python3.15/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py:6166: in _convert_subgraph\n    op \u003d self._convert_operator(op_name, inputs, attr, self.opset)\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n/usr/lib/python3.15/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py:6117: in _convert_operator\n    sym \u003d op_function(self.bb, inputs, attrs, [self._nodes, self._params])\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n/usr/lib/python3.15/site-packages/tvm/relax/frontend/onnx/onnx_frontend.py:1882: in _impl_v11\n    ndim \u003d len(inputs[0].ty.shape)\n               ^^^^^^^^^^^^^^^^^^\nE   AttributeError: \u0027Type\u0027 object has no attribute \u0027shape\u0027\n```\n\n### Fix\n\nAdd conversion check, normalize and populate the final relax op with\nty_info regardless of the graph context."
    },
    {
      "commit": "1a764d799316c7d73123750a0a3f7ce40c7d5cba",
      "tree": "92f93b15786d0ab8b0a045d539fbfd5b7fe81bb0",
      "parents": [
        "d0002f3c6a63b39477d2c129e805e8267f79c43f"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Wed Jul 15 18:07:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 06:07:20 2026 +0800"
      },
      "message": "[Tests] Reduce runtime of slow Python tests (#20006)\n\nThis PR reduces the runtime of several slow Python test groups:\n\n- Parameterize LLVM division and CUDA vectorized-cast cases so\npytest-xdist can schedule them independently.\n- Replace exhaustive ONNX execution with structural importer checks plus\nrepresentative numerical cases, and avoid registering unsupported\nbackend cases.\n- Reuse compiled paged-attention kernels across compatible test cases.\n\nTargeted measurements showed:\n\n- LLVM division: 25.34s → 19.87s\n- CUDA vectorized casts: 142.85s → 108.40s\n- Paged-attention CPU: 316.32s → 192.50s\n- ONNX Conv: 25.84s → 1.81s\n- ONNX Reduce: 20.66s → 4.04s\n\nThis PR also fixes a latent CUDA Graph cleanup bug that could leave\n`cudaErrorStreamCaptureInvalidated` in the worker thread and cause\nunrelated subsequent GPU tests to fail."
    },
    {
      "commit": "d0002f3c6a63b39477d2c129e805e8267f79c43f",
      "tree": "2f03a99d884dbbe6b6cdfc16ad9522966002570b",
      "parents": [
        "c717c5b217f5360c52f55f1ff0eb5be4c209b2b3"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Jul 16 05:02:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 05:02:36 2026 +0800"
      },
      "message": "[RELAX] Unify call_tir primitive arguments (#20009)"
    },
    {
      "commit": "c717c5b217f5360c52f55f1ff0eb5be4c209b2b3",
      "tree": "85f210141110b869b6e36f31314ee2527d30406c",
      "parents": [
        "22ee81e56917cb35685bf41dd1cf30146d2720ee"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Jul 15 17:12:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 17:12:40 2026 +0800"
      },
      "message": "[IR][Relax][TIRx] Unify Var identity (#20004)"
    },
    {
      "commit": "22ee81e56917cb35685bf41dd1cf30146d2720ee",
      "tree": "06685d73e75c97a06b7a71cf453701d7230dc2b7",
      "parents": [
        "e479a5dbe724aa4aa86f301c8d5ad1a5a05a58e3"
      ],
      "author": {
        "name": "Vic Wen",
        "email": "vicwen@apache.org",
        "time": "Wed Jul 15 07:36:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 19:36:41 2026 -0400"
      },
      "message": "[Fix][Relax][ONNX] Preserve integer Div truncation during import (#19975)\n\nONNX integer Div uses truncating division, rounding toward zero. The\nRelax ONNX frontend already special-cased integer Div to detect zero\ndivisors, but its PrimExpr folding path could still use NumPy\nfloating-point division when one of the inputs was a shape-derived\nPrimExpr.\n\nThat behavior can produce floating-point TIR values for integer\nshape/index computations. For example, a `Shape -\u003e Gather -\u003e Div -\u003e\nSlice` subgraph can produce `T.float64(128.666...)` as a Slice bound,\nwhich Relax rejects because strided_slice expects integer PrimExpr\nbounds.\n\nThis patch handles scalar integer Div inputs that contain a PrimExpr\nusing TIR `truncdiv`, preserving ONNX semantics while keeping shape\ncomputations in TIR instead of routing them through NumPy. Constant\ntensor Div continues to use the existing generic binary constant-folding\npath.\n\nThe regression tests cover:\n\n- integer constant folding with negative values to distinguish\ntruncation from floor division\n- a shape-derived PrimExpr Div used as a Slice bound\n- integer zero-divisor error handling\n\nVerification:\n\n- `python -m pytest\ntests/python/relax/test_frontend_onnx.py::test_div_integer_constant_zero_divisor_raises_valueerror\ntests/python/relax/test_frontend_onnx.py::test_div_integer_constant_folding_truncates_toward_zero\ntests/python/relax/test_frontend_onnx.py::test_div_integer_primexpr_folding_truncates_toward_zero\n-q`\n\nFixes #19974\n\nSigned-off-by: viiccwen \u003cvicwen@apache.org\u003e"
    },
    {
      "commit": "e479a5dbe724aa4aa86f301c8d5ad1a5a05a58e3",
      "tree": "519bfcab2929bb301ea935508f9d4930ca8916f4",
      "parents": [
        "fa903cf4f759b73a776cfb7946ded56c3ae7e425"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Jul 15 05:34:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 05:34:21 2026 +0800"
      },
      "message": "[RUNTIME][PYTHON] Add explicit Target device conversion (#20005)\n\n## Summary\n\nCompiler Targets can carry device-type semantics that runtime\ndevice-name parsing does not preserve.\n\n- add `tvm.device_from_target` for canonical Target-to-Device\ntranslation\n- use explicit runtime constructors where the device kind is fixed\n- update target-derived utilities, tests, and documentation to use the\nexplicit boundary"
    },
    {
      "commit": "fa903cf4f759b73a776cfb7946ded56c3ae7e425",
      "tree": "5a228c755ad500025dfb21c0f2bc30d2da9b28e3",
      "parents": [
        "0cc110ecd25f1befaa928dd5935f1d64663c6974"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Tue Jul 14 17:31:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 05:31:41 2026 +0800"
      },
      "message": "[Tests][TIRx] Localize hardware test gates (#19985)\n\nThis PR removes the suite-wide TIRx compute-capability gate and\nlocalizes hardware skips to CUDA codegen and tile-primitive tests. It\nkeeps the original test parameterization unchanged, allowing parser,\nprinter, IR, transform, and other non-hardware TIRx tests to run in\nregular CI while device-dependent cases are skipped when SM100 hardware\nis unavailable. CUDA codegen helpers use explicit target architectures\nwhere needed, and the run-only benchmark utility tests retain a local\nSM100 gate.\n\nThis intentionally avoids adding separate compile/run parameter cases. A\nfollow-up PR can audit slow frontend execution tests and define a\nfocused runtime regression budget for real TIRx kernels.\n\nLocal validation:\n\n- `pytest -n auto -m \"not gpu\" tests/python/tirx`: 486 passed, 79\nskipped.\n- `pytest -n auto -m gpu tests/python/tirx` without matching hardware:\n1509 skipped.\n- Pre-commit passed on all changed files."
    },
    {
      "commit": "0cc110ecd25f1befaa928dd5935f1d64663c6974",
      "tree": "5f34cca024b55e67961a1cfb613275776e37d121",
      "parents": [
        "262a5644858b9d92cd0906f3ee6cdb3dd5f6f03b"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Tue Jul 14 17:27:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 17:27:00 2026 -0400"
      },
      "message": "[CI] Bump CI at the Ubuntu 24.04 images and re-enable USE_Z3 (#19911)\n\nThis pr switches CI to the Ubuntu 24.04 (noble) images. Bump ci_tag in\nci/jenkins/docker-images.ini to 20260629-192919-24bbfd2e -- the images\nbuilt from #19893 (ci_cpu/ci_arm/ci_wasm/ci_gpu on Ubuntu 24.04, whose\ndefault g++ is gcc-13, giving full C++20 support).\n\nAlso, this pr re-enables Z3 (AUTO). #19828 temporarily set USE_Z3\u003dOFF\n(in CMakeLists.txt and the pyproject wheel build) to dodge a z3-static\nbuild failure. The CI image now ships z3-static (#19835), so this\nrestores USE_Z3\u003dAUTO: the Z3-backed Analyzer proving is enabled when\nz3-static is available and silently skipped otherwise.\n\nWhile Z3 stayed disabled, PrimExprNode::ty became a method, leaving two\nstale field accesses in z3_prover.cc\u0027s IsZ3SupportedExpr (only compiled\nunder TVM_USE_Z3). Fixed expr-\u003ety -\u003e expr-\u003ety().\n\nVerification:\n- The Ubuntu 24.04 images (#19893) built successfully for ci_cpu/ci_arm/\nci_wasm/ci_gpu (the GPU image includes ROCm 6.4.4 and the CUDA 24.04\nbase).\n- Re-enabling Z3 was validated with a build-only wheel run: all four\nwheels (Linux x86_64/aarch64 manylinux_2_28, macOS arm64, Windows) build\ngreen with z3-static compiled and linked, confirming the earlier\nz3-static link concern is resolved on the current toolchain."
    },
    {
      "commit": "262a5644858b9d92cd0906f3ee6cdb3dd5f6f03b",
      "tree": "b3de23ba7c8eb100b907bd4adf79e9a6328a4a86",
      "parents": [
        "1729c726bf068011fec4a921b9d1ffff5014ec12"
      ],
      "author": {
        "name": "Vic Wen",
        "email": "vicwen@apache.org",
        "time": "Tue Jul 14 20:44:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 08:44:56 2026 -0400"
      },
      "message": "[Fix][Relax][ONNX] Recover ConstantOfShape initializer shape (#20002)\n\n`ConstantOfShape` uses its input tensor as shape metadata. When that\ninput is an initializer and `keep_params_in_input\u003dTrue`, the Relax ONNX\nfrontend should recover the initializer value from `params` instead of\ntreating the input as an opaque runtime value.\n\nThis patch applies `get_constant` to the `ConstantOfShape` shape input\nbefore shape handling. It also guards the constant-shape folding path so\nit only calls `len(shape)` on `relax.ShapeExpr` values.\n\nThe regression test covers an initializer-backed shape input imported\nwith `keep_params_in_input\u003dTrue` and checks that the resulting Relax\nfunction has the expected output shape and dtype.\n\nA separate lint follow-up commit removes stale `F821` suppressions from\ntwo DLight files so the repository-wide CI lint is clean.\n\nVerification:\n\n- `python -m pytest\ntests/python/relax/test_frontend_onnx.py::test_constantofshape_initializer_shape_with_keep_params_in_input\n-q`\n- `pre-commit run --all-files`\n\nFixes #20001.\n\n---------\n\nSigned-off-by: viiccwen \u003cvicwen@apache.org\u003e"
    },
    {
      "commit": "1729c726bf068011fec4a921b9d1ffff5014ec12",
      "tree": "bd01592ad00e59f7fa75cbea0ae76d8f312e8dcd",
      "parents": [
        "a540271e619bc6bf3f09079fd4634336fab8cec1"
      ],
      "author": {
        "name": "Ronald Nap",
        "email": "ronaldnap17@gmail.com",
        "time": "Mon Jul 13 15:11:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 18:11:42 2026 -0400"
      },
      "message": "[Relax][Frontend][ONNX] Support Modern QDQ opset attributes (#19993)\n\n## Summary\n\nAdds support for newer `QuantizeLinear` and `DequantizeLinear`\nattributes in the Relax ONNX frontend.\n\nThis includes `output_dtype`, `saturate`, and newer opset behavior,\nwhile rejecting unsupported blocked quantization and `precision` cases.\n\nFor `QuantizeLinear` and `DequantizeLinear`, opsets 24 and 25 use the\nexisting converter for currently supported types. Support for\n`float8e8m0`, `int2`, and `uint2` are outside this PR’s scope.\n\n## Testing\n\nAdded structural and rejection tests for opsets 19, 21, 23, 24, and 25."
    },
    {
      "commit": "a540271e619bc6bf3f09079fd4634336fab8cec1",
      "tree": "b4b4b187ddea191b77027c3a1ded9f0870650e03",
      "parents": [
        "af4c3f4d505d27aae8cdf208e2304d67d20ac2cf"
      ],
      "author": {
        "name": "Nanmur",
        "email": "106384509+Nanmur@users.noreply.github.com",
        "time": "Tue Jul 14 02:43:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 14:43:12 2026 -0400"
      },
      "message": "[DLight][CUDA] Fix undefined TX in GEMV broadcast epilogue (#19970)\n\nThis PR fixes an undefined `TX` reference in the DLight GPU GEMV\ninner-reduction schedule.\n\nThe broadcast epilogue path splits fused epilogue loops and binds the\ninner loop to `threadIdx.x`, but it referenced `TX`, which is not\ndefined in the surrounding scope or passed into the helper. This PR uses\nthe existing `TR` tile factor, which is already used for the\n`threadIdx.x` direction in this schedule.\n\nA regression test is added to cover the GEMV broadcast epilogue path.\n\nFixes #19969\n\nTests:\n- `python -m pytest tests/python/s_tir/dlight/test_gpu_gemv.py -q`\n- `python -m pytest tests/python/s_tir/dlight/test_gpu_low_batch_gemv.py\n-q`\n- `python -m pytest tests/python/s_tir/dlight/test_gpu_reduction.py -q`\n\nNote: The branch is based on `apache/tvm:main`. Local main-branch test\nexecution on this Windows machine could not be completed because the\navailable compiled TVM library is from a v0.25 build and does not match\nthe latest Python sources; the same tests passed in the matching local\nv0.25 environment before rebasing the patch to main."
    },
    {
      "commit": "af4c3f4d505d27aae8cdf208e2304d67d20ac2cf",
      "tree": "5ba254b5f1875c6d26f7b2242676971db9d7fc69",
      "parents": [
        "60c6ad7e29c52455dba73907903b119b3e16e8f5"
      ],
      "author": {
        "name": "Vic Wen",
        "email": "vicwen@apache.org",
        "time": "Tue Jul 14 02:42:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 14:42:15 2026 -0400"
      },
      "message": "[Fix][Relax][ONNX] Preserve rank-expanding Expand (#19992)\n\n### What changed\n\nRecord the original input rank before `Expand` left-pads the input shape\nfor broadcast validation. The no-op fast path now returns the input\nunchanged only when both the padded shape and the original rank match\nthe target.\n\nA regression test covers expanding `[1]` to `[1, 1]` when the target is\nrepresented as a Relax `ShapeExpr`.\n\n### Why\n\nONNX `Expand` right-aligns dimensions and may increase tensor rank by\nadding leading dimensions. Previously, a rank-expanding broadcast could\nlook like a no-op after the frontend padded the input shape, causing it\nto return the original lower-rank tensor. Downstream operators could\nthen receive inconsistent ranks.\n\nThis fixes the focused bug tracked in #19991 and is part of the\ninvestigation and fixes for #19971. It does not close #19971 because the\nattached model exposes additional independent importer issues after this\n`Concat` failure is resolved.\n\nFixes #19991\nPart of #19971\n\n### Validation\n\n- `python -m pytest\ntests/python/relax/test_frontend_onnx.py::test_expand -q`\n- A/B checked the model attached to #19971: the base revision reproduces\n`Concat expects all input tensors to have same ndim`, while this change\nadvances beyond that `Concat`.\n\nSigned-off-by: viiccwen \u003cvicwen@apache.org\u003e"
    },
    {
      "commit": "60c6ad7e29c52455dba73907903b119b3e16e8f5",
      "tree": "c05cd941662fda20be3ef51816bf6d489c9fcfb6",
      "parents": [
        "dcdf32bd480baebe6b2a86962719138ef4e435e3"
      ],
      "author": {
        "name": "Masahiro Hiramori",
        "email": "contact@mshr-h.com",
        "time": "Tue Jul 14 03:13:19 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 14:13:19 2026 -0400"
      },
      "message": "[Fix][Relax][PyTorch] Compare Dynamo output against PyTorch reference (#19994)\n\nFix a self-comparison in test_relax_dynamo_dynamic."
    },
    {
      "commit": "dcdf32bd480baebe6b2a86962719138ef4e435e3",
      "tree": "4c8125a0df945523db9d1881b78d78870cb126a2",
      "parents": [
        "567aaa59bb8fa9a6831846421536147e812eafb5"
      ],
      "author": {
        "name": "Syeam Bin Abdullah",
        "email": "49330057+sbinabdullah@users.noreply.github.com",
        "time": "Mon Jul 13 20:23:56 2026 +0930"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 18:53:56 2026 +0800"
      },
      "message": "[Arith] Fix const-int-bound modular-set tightening for Mod/FloorMod (#19978)"
    },
    {
      "commit": "567aaa59bb8fa9a6831846421536147e812eafb5",
      "tree": "3d3ba2f42f65fd302086dc8bd5fa1ffd185bb9a1",
      "parents": [
        "fc21cd6ede10fe23b96644748b07b5e2a89cff43"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Sun Jul 12 22:37:01 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 11:37:01 2026 +0900"
      },
      "message": "[Fix][Python] Use standard scikit-build directory (#19990)\n\nThis PR removes `{wheel_tag}` from the scikit-build build directory,\nsolving the issue #19987 mentioned\n\nEach cibuildwheel matrix job runs in an isolated environment, so\nseparate tagged build directories are unnecessary. Using `build`\nrestores the existing `build/lib` development layout expected by\n`tvm.libinfo` and fixes editable installs without adding runtime\ndirectory globbing."
    },
    {
      "commit": "fc21cd6ede10fe23b96644748b07b5e2a89cff43",
      "tree": "1b81273dc3619d0bbfea14ce04cb54e7b31eff3a",
      "parents": [
        "d785894d2f281e4baac1288c8248744860f92d81"
      ],
      "author": {
        "name": "Hongyi Wu",
        "email": "62729549+Aharrypotter@users.noreply.github.com",
        "time": "Mon Jul 13 05:24:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 17:24:16 2026 -0400"
      },
      "message": "[Fix][Relax][TFLite] Use astype for frontend casts (#19932)\n\n## Summary\n\nFix TFLite Relax frontend cast paths that still used removed/nonexistent\ncast\nAPIs.\n\n- Use `relax.op.astype` for FLOAT16 `DEQUANTIZE` constants.\n- Use `relax.op.astype` around the existing quantized `AVERAGE_POOL_2D`\n  converter path.\n\n## Design\n\nThis PR only replaces invalid frontend API calls with `relax.op.astype`.\n\nThe quantized avgpool regression test calls the converter path directly\nbecause\nthe top-level TFLite importer still rejects quantized `AVERAGE_POOL_2D`\nbefore\nconversion. Enabling that operator globally is out of scope.\n\n## Tests\n\nAdded:\n\n- `test_dequantize_float16_uses_astype`\n- `test_quantized_avg_pool2d_uses_astype`\n\nValidated with:\n\n```bash\npython -m ruff format \\\n  python/tvm/relax/frontend/tflite/tflite_frontend.py \\\n  tests/python/relax/test_frontend_tflite.py\n\npython -m ruff check \\\n  python/tvm/relax/frontend/tflite/tflite_frontend.py \\\n  tests/python/relax/test_frontend_tflite.py\n\npython -m pytest \\\n  tests/python/relax/test_frontend_tflite.py \\\n  -k \"dequantize or avg_pool\" -q\n```\n\nResult:\n\n```text\nruff format: 2 files left unchanged\nruff check: All checks passed\ntargeted dequantize/avg_pool tests: 9 passed, 551 deselected\n```\n\nI also ran the full TFLite frontend file:\n\n```text\ntests/python/relax/test_frontend_tflite.py: 559 passed, 1 failed\n```\n\nThe remaining failure is unrelated to this PR:\n`test_broadcast_to` expects `R.multiply(..., ones)` while the importer\nemits\n`R.broadcast_to(...)`."
    },
    {
      "commit": "d785894d2f281e4baac1288c8248744860f92d81",
      "tree": "bd487a491520752d1173d391f54206a20c1f1a41",
      "parents": [
        "89a42ae9c42fca06dd559ebbfba2e773a8e2cb49"
      ],
      "author": {
        "name": "Masahiro Hiramori",
        "email": "contact@mshr-h.com",
        "time": "Mon Jul 13 05:13:46 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 16:13:46 2026 -0400"
      },
      "message": "[Relax][PyTorch] Use make_tensor in exported program tests (#19989)\n\nThis PR uses `torch.testing.make_tensor` where it provides a clear\ntesting benefit in the PyTorch exported-program frontend tests.\n\n- Generate boolean masks directly instead of comparing random float\ntensors\n- Generate parametrized dtypes directly instead of creating integer\ntensors and converting them with `.to()`\n- Specify the CPU device explicitly"
    },
    {
      "commit": "89a42ae9c42fca06dd559ebbfba2e773a8e2cb49",
      "tree": "d2b007ee08530e89c39fbeecb1cdc21096d3d823",
      "parents": [
        "6b7380e6e2d01f295fc330242163f47264ffcc06"
      ],
      "author": {
        "name": "Thomas Steiner",
        "email": "tomac@google.com",
        "time": "Sun Jul 12 08:02:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 23:02:07 2026 -0700"
      },
      "message": "[Fix] Add `origins` option to `requestFileHandle` (#19960)"
    },
    {
      "commit": "6b7380e6e2d01f295fc330242163f47264ffcc06",
      "tree": "161c91c3d033644e82b85893b6af20a93954c7d3",
      "parents": [
        "7a1f6edb2c1a92e5af7baaec1f1281ab0318277c"
      ],
      "author": {
        "name": "Ronald Nap",
        "email": "ronaldnap17@gmail.com",
        "time": "Sat Jul 11 21:24:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 00:24:34 2026 -0400"
      },
      "message": "[Relax][Frontend][ONNX] Add GroupNormalization support (#19907)\n\n## Summary\nAdds ONNX frontend support for `GroupNormalization` by mapping it to the\nexisting `relax.op.nn.group_norm`.\n\nSupports opset 18 per-group scale/bias expansion, opset 21 per-channel\nscale/bias, and `stash_type` cast behavior.\n\n## Testing\nIncludes structural checks for opset 18, opset 21, rank-3 inputs, and\nfp16 `stash_type` paths."
    },
    {
      "commit": "7a1f6edb2c1a92e5af7baaec1f1281ab0318277c",
      "tree": "80debb124c8d7fd44529e936e2ed908d8b27aa34",
      "parents": [
        "6cd73cd1bf1c4b08a07d44dbadd95fdb086e3b53"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Sat Jul 11 22:40:40 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 10:40:40 2026 +0800"
      },
      "message": "[CI] Enable parallel GitHub Actions wheel builds (#19983)\n\nThis PR enables parallel TVM wheel builds on macOS and Windows GitHub\nActions by detecting the available CPU count and passing it to CMake\nthrough CMAKE_BUILD_PARALLEL_LEVEL."
    },
    {
      "commit": "6cd73cd1bf1c4b08a07d44dbadd95fdb086e3b53",
      "tree": "ffbf08fde4ab2ba32830950db9f0806a707898c2",
      "parents": [
        "7356265096cba7196673b09f90b023e600171452"
      ],
      "author": {
        "name": "Guan-Ming Chiu",
        "email": "105915352+guan404ming@users.noreply.github.com",
        "time": "Sun Jul 12 10:39:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 22:39:09 2026 -0400"
      },
      "message": "[Relax] Legalize shape_to_tensor to device kernel (#19957)\n\n## Why\n\nFixes #19925. `relax.shape_to_tensor` had no legalization, so it always\nlowered to the host packed func `relax.run.shape_to_tensor`, producing a\nCPU tensor regardless of the target device.\n\n## How\n\n- Register a legalization that emits the shape values as a `call_tir` TE\nkernel, passing symbolic dims via `tir_vars`.\n- Fall back to the packed func when the shape values are unknown\n(`ShapeStructInfo` without values)."
    },
    {
      "commit": "7356265096cba7196673b09f90b023e600171452",
      "tree": "12fa64a967decdaf128527beca5334e8e161f7e5",
      "parents": [
        "a50ab7346f030c4e68f011d3d85df04e0c62b0d3"
      ],
      "author": {
        "name": "Vic Wen",
        "email": "vicwen@apache.org",
        "time": "Sat Jul 11 14:54:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 02:54:13 2026 -0400"
      },
      "message": "[Fix][Relax][ONNX] Cast BatchNorm params to input dtype (#19979)\n\nFixes #19977.\n\nONNX `BatchNormalization` allows the input/output tensor dtype,\nscale/bias dtype, and mean/variance dtype to be separate floating-point\ntype parameters.\n\nFor example, a valid ONNX model may use `float16` data with `float32`\ngamma, beta, mean, and variance tensors.\n\nThe Relax `batch_norm` operator currently requires all five input\ntensors to have the same dtype. The ONNX frontend previously forwarded\nthe ONNX inputs directly to `relax.nn.batch_norm`, causing import to\nfail during normalization\nfor mixed-dtype ONNX models.\n\nThis patch casts the ONNX BatchNormalization parameter tensors (`scale`,\n`bias`, `mean`, and `var`) to the data tensor dtype before calling Relax\n`batch_norm`.\n\nThis preserves the ONNX output dtype, which follows the input data\ndtype, while keeping the fix localized to the frontend compatibility\nlayer.\n\nThe regression test builds a minimal ONNX BatchNormalization graph with\n`float16` data and `float32` parameters, imports it through the Relax\nONNX frontend, and checks that the generated Relax `batch_norm` call\nreceives same-dtype inputs.\n\nVerification:\n\n- `python -m pytest\ntests/python/relax/test_frontend_onnx.py::test_batch_norm_mixed_dtype_params\ntests/python/relax/test_frontend_onnx.py::test_batch_norm_defaults_to_inference_mode\n-q`\n\nSigned-off-by: viiccwen \u003cvicwen@apache.org\u003e"
    },
    {
      "commit": "a50ab7346f030c4e68f011d3d85df04e0c62b0d3",
      "tree": "7dbc4b1bf4e5cf7afb8dc6419b5b13b9f12d2136",
      "parents": [
        "865c2ea91887d4cf23b1161c15765c749061adea"
      ],
      "author": {
        "name": "Vic Wen",
        "email": "vicwen@apache.org",
        "time": "Sat Jul 11 12:40:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 00:40:19 2026 -0400"
      },
      "message": "[Fix][Relax][ONNX] Import TopK indices as int64 (#19973)\n\nFixes #19972\n\nONNX specifies that the second output of TopK, `indices`, has element\ntype `int64`, and the ONNX TopK operator spec constrains the index\ntensor type to `tensor(int64)`:\nhttps://onnx.ai/onnx/operators/onnx__TopK.html\n\nThe Relax ONNX frontend previously called `relax.op.topk` without\nspecifying the output indices dtype, so Relax used its default `int32`\nindices.\n\nThis can make otherwise valid ONNX graphs fail during import when the\nTopK indices are consumed by later integer/index operations that use\nONNX\u0027s usual `int64` constants. One example is `TopK -\u003e Div`, where\nRelax rejects the binary operation because the imported TopK indices are\n`int32` while the divisor is `int64`.\n\nThis patch passes `dtype\u003d\"int64\"` when importing ONNX TopK, matching the\nONNX operator spec. It also updates the existing TopK frontend test to\ncheck output dtypes, so the imported indices must match ONNX Runtime\u0027s\n`int64` output.\n\nVerification:\n\n- `uv run --no-sync python -m pytest\ntests/python/relax/test_frontend_onnx.py::test_topk -q`\n\nSigned-off-by: viiccwen \u003cvicwen@apache.org\u003e"
    },
    {
      "commit": "865c2ea91887d4cf23b1161c15765c749061adea",
      "tree": "9ee48aca6d455ff08ed1e4c381fcf40e2c596f67",
      "parents": [
        "67bd1ea1a16390db0b6760fea57f55a893fd9375"
      ],
      "author": {
        "name": "Ruihang Lai",
        "email": "ruihangl@cs.cmu.edu",
        "time": "Fri Jul 10 23:10:56 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 23:10:56 2026 -0400"
      },
      "message": "[Runtime] Fix CUDA build breaks in fp8 cutlass and thrust (#19980)\n\nThe fp8 group-wise scaled GEMM kernels passed a braced DLDataType\ninitializer as the second argument of the two-argument TVM_FFI_ICHECK_EQ\nmacro (e.g. TVM_FFI_ICHECK_EQ(a-\u003edtype, DLDataType{kDLFloat8_e4m3fn, 8,\n1})). The preprocessor ignores brace grouping and splits on the commas\ninside {...}, so it sees four arguments and fails to compile. Wrap the\ninitializer in parentheses so it is treated as a single macro argument.\n\nthrust.cu calls args[i].cast\u003cDLTensor*\u003e() but did not include\n\u003ctvm/ffi/container/tensor.h\u003e, which defines TypeTraits\u003cDLTensor*\u003e;\nwithout it the cast fails template deduction. Add the include.\n\nBoth issues break the CUDA runtime build; with them fixed it compiles\ncleanly with USE_CUTLASS and USE_THRUST enabled."
    },
    {
      "commit": "67bd1ea1a16390db0b6760fea57f55a893fd9375",
      "tree": "af2d6561b13858b5b8097aeeda860d823da03818",
      "parents": [
        "577e57641d46db11ea3fce348e83e16417578748"
      ],
      "author": {
        "name": "Egor Churaev",
        "email": "egor.churaev@gmail.com",
        "time": "Fri Jul 10 09:24:17 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 02:24:17 2026 -0400"
      },
      "message": "[Metal] Let compile callback declare payload format via (payload, fmt) (#19924)\n\nA tvm_callback_metal_compile used purely for debugging/inspection may\nreturn the MSL source unchanged. Previously, merely registering the\ncallback forced the module format to \"metallib\", so the runtime tried to\nload the text source as a binary metallib and failed with \"Invalid\nlibrary file\" (issue #18798).\n\nThe callback may now return a (payload, format) pair to declare the\npayload format. A bare str/bytes return keeps the legacy metallib\nbehavior. All kernels of a module share a single declared format, so a\ncallback that mixes formats across kernels (including a legacy metallib\nreturn alongside a (payload, \"metal\") return) is rejected at codegen\ntime instead of producing a module that fails to load."
    },
    {
      "commit": "577e57641d46db11ea3fce348e83e16417578748",
      "tree": "983a26adafee60e3dba59ac43cdf442d6bd1227b",
      "parents": [
        "cd2c4f3ef271536b6980fff76bb8b3daee5b6154"
      ],
      "author": {
        "name": "Hangshuai He",
        "email": "152275085+V-aerus@users.noreply.github.com",
        "time": "Fri Jul 10 12:33:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 00:33:28 2026 -0400"
      },
      "message": "[Relax] Fix bucketize output dtype during legalization (#19936)\n\nThis PR fixes Relax bucketize lowering to pass the correct integer\noutput dtype to TOPI searchsorted.\n\nPreviously, both LegalizeOps and DispatchSortScan passed the input\ntensor dtype as the output dtype. For float input tensors, this caused\nTOPI searchsorted to receive a float output dtype, which later failed\nduring binary-search lowering because bucket indices must be integer\nvalues.\n\nThis patch derives the output dtype from bucketize\u0027s out_int32\nattribute:\n  - int32 when out_int32\u003dTrue\n  - int64 otherwise\n\n  A numerical ExportedProgram frontend test is added to cover:\n  - right\u003dFalse\n  - right\u003dTrue\n  - out_int32\u003dFalse\n  - out_int32\u003dTrue\n  - float input values on bucket boundaries\n\n  Test:\npython -m pytest\ntests/python/relax/test_frontend_from_exported_program.py -k \"bucketize\"\n-q"
    },
    {
      "commit": "cd2c4f3ef271536b6980fff76bb8b3daee5b6154",
      "tree": "d0c262b2182caa76a5709a57ef587b660efc4dcc",
      "parents": [
        "39e0c7e96c9eb97ad660b1ae85955da278f373d2"
      ],
      "author": {
        "name": "Guan-Ming Chiu",
        "email": "105915352+guan404ming@users.noreply.github.com",
        "time": "Fri Jul 10 07:20:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 19:20:19 2026 -0400"
      },
      "message": "[TIRx] Reuse pass-through input names for inverse index map vars (#19906)\n\n## Why\n\nInverse index map input variables were always named axis0, axis1, ...,\nmaking generated IR harder to read.\n\n## How\n\n- Name a pass-through inverse input after its source Var instead of\naxis{i}.\n- Keep the axis{i} fallback for computed (non-pass-through) indices.\n- Add test_inverse_preserves_passthrough_var_names covering a transpose\nmap.\n\nSigned-off-by: Guan-Ming (Wesley) Chiu \u003c105915352+guan404ming@users.noreply.github.com\u003e"
    },
    {
      "commit": "39e0c7e96c9eb97ad660b1ae85955da278f373d2",
      "tree": "d3316d717195a4fe6e08058f1a967610e9d41b4a",
      "parents": [
        "d5c6f2d484264fed2ba172693a39f1b144243be6"
      ],
      "author": {
        "name": "Hangshuai He",
        "email": "152275085+V-aerus@users.noreply.github.com",
        "time": "Fri Jul 10 06:41:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 18:41:32 2026 -0400"
      },
      "message": "[Relax][PyTorch] Fix masked_select VM build (#19937)\n\nThis PR fixes the PyTorch ExportedProgram importer lowering for\n`torch.masked_select`.\n\n  Previously, `masked_select` lowered to:\n\n  - flatten data and mask\n  - `nonzero(mask_flat)`\n  - `squeeze(axis\u003d[0])`\n  - `take(data_flat, indices)`\n\nHowever, the result of `R.nonzero` only carried rank information. The\nfollowing `R.squeeze` over the dynamic nonzero output could remain\nunhandled during build/VM execution.\n\nThis PR inserts a `match_cast` after `R.nonzero` using the exported\noutput metadata, preserving the dynamic selected-length dimension before\n`squeeze`.\n\n  A numerical regression test is also added to cover:\n\nPyTorch eager -\u003e torch.export -\u003e Relax import -\u003e build -\u003e VM run -\u003e\noutput comparison\n\n  Testing:\n\n- `python -m pytest -q\ntests/python/relax/test_frontend_from_exported_program.py -k\n\u0027masked_select\u0027`"
    },
    {
      "commit": "d5c6f2d484264fed2ba172693a39f1b144243be6",
      "tree": "bd7c493d1fefd2c0df976aea8d75e92e4a1312d6",
      "parents": [
        "82fa8bf8f688e27f60d7d52c0d4e0da3c9ebab9b"
      ],
      "author": {
        "name": "Ronald Nap",
        "email": "ronaldnap17@gmail.com",
        "time": "Thu Jul 09 15:23:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 18:23:26 2026 -0400"
      },
      "message": "[Relax][Frontend][ONNX] Add support for Pad mode\u003d\"wrap\" for opset 19 (#19827)\n\n## Summary\nThe ONNX Pad operator introduced `mode\u003d\"wrap\"` (circular padding) in\nopset 19. Currently, the Relax ONNX frontend has no support for opset\n19, which raises\n\n```text\nOpAttributeInvalid(tvm.error.OpAttributeInvalid: Value wrap in attribute \"mode\" is invalid for operator Pad.\n```\n## Changes\nAdd opset 19 handling to the Pad converter that dispatches `mode\u003d\"wrap\"`\nto topi.nn.circular_pad, which already implements circular padding but\nwas never wired up to the ONNX frontend. Existing behavior for earlier\nPad opsets is unchanged.\n\n## Reproduce\n```python\nimport numpy as np\nimport onnx\nfrom onnx import TensorProto, helper, numpy_helper\n\nimport tvm\nfrom tvm import relax\nfrom tvm.relax.frontend.onnx import from_onnx\n\ndef make_model():\n    x \u003d helper.make_tensor_value_info(\"input\", TensorProto.FLOAT, [1, 3, 4])\n    y \u003d helper.make_tensor_value_info(\"output\", TensorProto.FLOAT, [1, 3, 8])\n\n    pads \u003d numpy_helper.from_array(\n        np.array([0, 0, 2, 0, 0, 2], dtype\u003dnp.int64),\n        name\u003d\"pads\",\n    )\n\n    node \u003d helper.make_node(\n        \"Pad\",\n        inputs\u003d[\"input\", \"pads\"],\n        outputs\u003d[\"output\"],\n        mode\u003d\"wrap\",\n    )\n\n    graph \u003d helper.make_graph([node], \"pad_wrap_graph\", [x], [y], initializer\u003d[pads])\n    model \u003d helper.make_model(graph, opset_imports\u003d[helper.make_opsetid(\"\", 19)])\n    onnx.checker.check_model(model)\n    return model\n\ndef run_tvm(model, x_np):\n    mod \u003d from_onnx(model, shape_dict\u003d{\"input\": list(x_np.shape)})\n\n    target \u003d tvm.target.Target(\"llvm\")\n    dev \u003d tvm.cpu(0)\n\n    with tvm.transform.PassContext(opt_level\u003d3):\n        ex \u003d relax.build(mod, target)\n\n    vm \u003d relax.VirtualMachine(ex, dev)\n    out \u003d vm[\"main\"](tvm.runtime.tensor(x_np, dev))\n    return out.numpy() if hasattr(out, \"numpy\") else out.asnumpy()\n\nx_np \u003d np.array(\n    [[[1, 2, 3, 4],\n      [5, 6, 7, 8],\n      [9, 10, 11, 12]]],\n    dtype\u003dnp.float32,\n)\n\nexpected \u003d np.pad(x_np, [[0, 0], [0, 0], [2, 2]], mode\u003d\"wrap\")\nactual \u003d run_tvm(make_model(), x_np)\n\nprint(\"Expected:\")\nprint(expected[0])\nprint(\"Actual:\")\nprint(actual[0])\nprint(\"Matches expected:\", np.allclose(actual, expected))\n```"
    },
    {
      "commit": "82fa8bf8f688e27f60d7d52c0d4e0da3c9ebab9b",
      "tree": "8799172ad1f9c659137cfd299f39d92874148300",
      "parents": [
        "2fb591c5ba4d64f145ca90e946ea374a78fbba8c"
      ],
      "author": {
        "name": "Guan-Ming Chiu",
        "email": "105915352+guan404ming@users.noreply.github.com",
        "time": "Fri Jul 10 02:39:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 14:39:55 2026 -0400"
      },
      "message": "[Relax] Fix divide-by-zero in reshape pattern detection (#19958)\n\n## Why\n\nFixes #17745. `has_reshape_pattern` builds an inverse index map that\ndivides by each iter extent, so a zero-extent iter crashed with\ndivide-by-zero.\n\n## How\n\n- Skip the fused-var check when any block iter has zero extent; such\nblocks touch no elements, so they are not reshape patterns.\n- Added `test_reshape_pattern_zero_extent` in\n`tests/python/relax/test_analysis.py`."
    },
    {
      "commit": "2fb591c5ba4d64f145ca90e946ea374a78fbba8c",
      "tree": "fe8885736f4a16f446c1d08e8db7046a9725e6c5",
      "parents": [
        "545bd7b3c727a3bd64e9de26df0c13467d13bc15"
      ],
      "author": {
        "name": "Guan-Ming Chiu",
        "email": "105915352+guan404ming@users.noreply.github.com",
        "time": "Thu Jul 09 09:03:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 21:03:35 2026 -0400"
      },
      "message": "[Relax][PyTorch] Bind symbolic scalar inputs in from_fx (#19964)\n\n## Why\n\n- `torch.compile(backend\u003drelax_dynamo(), dynamic\u003dTrue)` lifts SymInt\nscalars as scalar graph inputs\n- `from_fx` skips these placeholders, so ops referencing one, e.g.\n`view(x.size(0), -1)`, fail with `KeyError`\n\n## How\n\n- Bind sym placeholders to the same-named `tir.Var` from the input\ntensors\u0027 symbolic shapes; skip as before when none exists\n- Add `test_relax_dynamo_dynamic_sym_input_reference`; fails with\n`KeyError` without the fix"
    },
    {
      "commit": "545bd7b3c727a3bd64e9de26df0c13467d13bc15",
      "tree": "be031d3852a2df4945dafca50114f5d2dcb63bff",
      "parents": [
        "e1e7ac92617de8bced603cdde56395889f14da9f"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Tue Jul 07 06:28:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 15:28:57 2026 -0700"
      },
      "message": "Phase out Relax-specific Id aliases (#19959)\n\nRemove the Relax-specific Id indirection and use Var/DataflowVar object\nidentity directly.\n\nType-changing rewrites now remap definitions, uses, and binding lookups\ncoherently while preserving reflection, serialization, and the\nDataflowVar subtype. Existing tests are adjusted for the API change; no\nnew test files or test cases are added.\n\nValidation: the compiler and C++ tests build successfully; focused C++\ncoverage passes 4/4; the affected existing Python matrices pass 549\ntests with 2 expected xfails; source censuses, diff checks, and\napplicable hooks pass."
    },
    {
      "commit": "e1e7ac92617de8bced603cdde56395889f14da9f",
      "tree": "02a423b0a7626d851000015f4ceb17472c2f2a0b",
      "parents": [
        "db1ebfc1f14047e51fbc515caeb2f6157b5b31c4"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Tue Jul 07 03:47:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 15:47:46 2026 -0400"
      },
      "message": "[ARITH] Scope interval constraints to mapped variables (#19963)\n\n## Rationale\n\nAnalyzer constraint scopes continue to provide loop-positive facts to\nconstant-bound and rewrite proofs. During IntSet relaxation, however, a\nscoped domain constraint is a refinement only for a variable explicitly\npresent in the relaxation map. Applying it to an unmapped variable\nreinterprets a free parameter as a relaxation domain and can let a\nloop-local symbol survive recursive interval evaluation.\n\n## Changes\n\n- Apply scoped IntSet constraints only to variables already present in\nthe relaxation map; unmapped variables remain free parameters.\n- Remove the finite-bound restoration fallback and its stronger\nparametric-bound contract.\n- Add a direct compact-buffer regression that prevents a loop-local\nvariable from escaping into a function-scope allocation extent."
    },
    {
      "commit": "db1ebfc1f14047e51fbc515caeb2f6157b5b31c4",
      "tree": "2cac3b887529be5ebd7c13cfb7e7e5e4bbdacd7a",
      "parents": [
        "bbfdab79d998cfc6af22b0be510c543501d447b7"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Jul 06 16:30:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 16:30:40 2026 +0800"
      },
      "message": "[FFI] Bump tvm-ffi for stable Optional layout (#19956)\n\n## Summary\n\nUpdate TVM to tvm-ffi\u0027s stable `TVMFFIAny`-backed Optional and Variant\nlayout.\n\n- bump `3rdparty/tvm-ffi` from `84ee1a07` to `5411a642`\n- migrate Optional presence checks from the removed inherited\n`defined()` API\n- adapt pointer, cast, JSON, and FFI return sites while preserving\nmissing-value semantics\n- require `apache-tvm-ffi\u003e\u003d0.1.13` and preserve the source-matched FFI\nbuild in the macOS wheel smoke test\n\n## Validation\n\nValidated with linked LLVM builds, default and conditional backend\ncompilation, an Emscripten 4.0.23 WebAssembly compile/link, C++\nOptional/FFI and TVM suites, focused runtime/IR/Relax Python tests,\nbroad regression coverage, repository format/static checks, production\nwheel metadata inspection, and an isolated source-FFI wheel\ninstall/import smoke test.\n\n## Release compatibility blocker\n\nDo not merge or publish this bump until the tvm-ffi 0.1.13 release\npreserves compatibility for TVM 0.25\u0027s by-value JSON `Stringify`\nconsumer, or an equivalent non-matching release/version strategy is in\nplace. The release also needs coordinated handling for the published\nORCJIT extension: `apache-tvm-ffi-orcjit\u003d\u003d0.1.0` returns\n`Optional\u003cFunction\u003e` by value while the new layout grows from 8 to 16\nbytes, which can corrupt return storage when mixed with the new runtime.\nTVM\u0027s wheel now requires `apache-tvm-ffi\u003e\u003d0.1.13`; resolver-driven\npublish tests remain enabled so production publication fails closed\nuntil a compatible release exists."
    },
    {
      "commit": "bbfdab79d998cfc6af22b0be510c543501d447b7",
      "tree": "6d76a96e3f4b1c44d63321ad25add2d0f3ee76d8",
      "parents": [
        "434dc7636e06c6c4a25eb1845869b596199c51bb"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Jul 06 16:29:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 16:29:52 2026 +0800"
      },
      "message": "[CI] Repair Python test cleanup regressions (#19955)\n\n## Summary\n\n- Keep the Python test launcher close to plain `pytest -n auto`, move\nnightly tests under `tests/nightly/python`, remove obsolete launchers\nand collection bookkeeping, and partition CPU/GPU jobs with explicit\n`gpu` marker expressions.\n- Repair exact-pointer regressions at their owning boundaries: packed\nraw-string ABI values, CUDA/Metal matrix intrinsic pointers, internal TE\nextern offsets, MetaSchedule scalar annotations, localized\nauto-tensorization scope matching, and typed DLTensor fixture fields.\n- Preserve typed workspace calls in TIR and cast pointer-returning\nexternal calls in CodeGenC, covered by a plain-TIRx 1024-byte global\nworkspace that is compiled as C++.\n- Finish phasing out value-bearing Relax `R.Prim` annotations by\nrequiring an explicit dtype, removing obsolete value-based contracts,\nand expressing the DISCO rank-dependent slices as explicit scalar\n`call_tir` inputs.\n- Gate the distributed callback on the optional DISCO runtime, NCCL, and\nat least two GPUs so capability-limited jobs skip instead of failing.\n- Remove the non-demonstrating pointer probe, use direct TVMScript\ncomparison for packed strings, and remove the four designated legacy\ntesting modules.\n\nThe seven repaired CPU categories cover packed raw strings (7 failures),\nCUDA/Metal matrix access-pointer types (7), internal TE extern offsets\n(1), a typed DLTensor fixture (1), MetaSchedule scalar annotations (1),\nCodeGenC workspace return casts (12), and localized auto-tensorization\nstorage-scope matching (19).\n\n## Validation\n\n- Base: `ded6ad8dd212869c881efb5590f8a33fc972728e`\n- Head: `a7277e86dbcfe0638c8c252d36760859c4ab4297`\n- All 35 locally available original failing node IDs pass across the\nfocused runs.\n- The full focused TE, TIR builtin-lowering, and CodeGenC files pass: 61\ntests.\n- The complete touched Relax/TVMScript set plus\nPlanAndUpdateBufferAllocationLocation passes with 784 passed, 20\nskipped, and 1 expected failure.\n- The DISCO callback collects and skips when its runtime or two-GPU\nenvironment is unavailable.\n- Six direct mapping tests, twelve tensor-core sketches, and the dp4a\nsketch pass unchanged.\n- The compiler rebuild, branch-wide pre-commit hooks, and full-range\nwhitespace checks pass.\n- The 13 broad CBLAS/TFLite nodes remain dependency-gated; their owning\nTE and generated-C regressions compile.\n\nNo merge is included in this change."
    },
    {
      "commit": "434dc7636e06c6c4a25eb1845869b596199c51bb",
      "tree": "795691d8d0ce6842aba027607480f5dc3508a5c7",
      "parents": [
        "ded6ad8dd212869c881efb5590f8a33fc972728e"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Sun Jul 05 21:23:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 21:23:12 2026 -0700"
      },
      "message": "[ARITH][TIR] Track positive loop extents in analyzer visitors (#19927)\n\nThis PR updates `IRMutatorWithAnalyzer` and `IRVisitorWithAnalyzer` to\nadd the constraint `loop_extent \u003e 0` while visiting a `ForNode` body.\n\nIf execution reaches the loop body, the loop must have at least one\niteration, so the body context can safely assume the extent is positive.\nThe constraint is scoped only to the loop body, leaving the loop header\nexpressions (`min`, `extent`, `step`) outside of this assumption.\n\nWhile validating this change, it exposed an issue in `IntSetAnalyzer`:\none-sided constraints such as `m \u003e 0` could cause existing parametric\nbounds like `m - 1` to be recursively relaxed to `+inf`. This caused\n`DomainTouched` to lose finite symbolic bounds. The PR fixes this by\npreserving existing parametric bounds when recursive interval relaxation\nwould otherwise replace them with infinity."
    },
    {
      "commit": "ded6ad8dd212869c881efb5590f8a33fc972728e",
      "tree": "1c0c2b8b2a5a474e79b9d52bd677cfcf055be175",
      "parents": [
        "ff937ffcde3a1f2acec0a420293db6ff94e210c3"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Jul 06 09:22:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 21:22:43 2026 -0400"
      },
      "message": "[Cleanup] Remove macOS Clang warnings (#19954)\n\n## Summary\n\n- remove redundant parentheses from four VM dtype comparisons\n- clean up pessimizing moves, missing overrides, unused state, and\nhidden virtual overloads reported by macOS Clang\n- preserve `PrimType` across source-codegen type-bearing paths and\nremove transitional raw dtype adapters\n- retain raw `DLDataType` only for explicit runtime launch metadata and\nruntime-helper boundaries\n- leave the deferred LLVM and CMake compatibility paths unchanged\n\n`PrimType::operator\u003d\u003d` already compares the represented dtype by code,\nbits, and lanes, so no backend-specific non-identity equality regression\nis needed.\n\n## Validation\n\n- compiled all original warning-producing translation units with Clang\n22 and the relevant warning families promoted to errors\n- built `tvm_runtime` and `tvm_compiler` with LLVM 15 after the codegen\nmigration\n- passed 14 focused C-host, bool, OpenCL, Metal, device, and Vulkan\ncodegen tests, with 70 hardware-dependent skips\n- generated OpenCL C, Metal, WGSL, and CUDA source from the same typed\nkernel\n- compiled the changed Hexagon and Vulkan translation units\nindependently\n- passed pre-commit, Git whitespace/log checks, and a static audit\nleaving raw codegen `DLDataType` declarations only at the WebGPU runtime\nABI boundary"
    },
    {
      "commit": "ff937ffcde3a1f2acec0a420293db6ff94e210c3",
      "tree": "c11ab2ec2164d4e2b0f49c7f0c38a50dadd7e930",
      "parents": [
        "cfb98e938c8d9525648c75fbebcb8944edb952fe"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Jul 05 23:56:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 23:56:58 2026 +0800"
      },
      "message": "[CI] Restore dependabot configuration (#19951)"
    },
    {
      "commit": "cfb98e938c8d9525648c75fbebcb8944edb952fe",
      "tree": "cbfb38481a01dc5038cd75b76ccd653866f1e0b7",
      "parents": [
        "5427e3c2dece19afd9e29696578139046bb1dd97"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Jul 05 21:59:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 09:59:51 2026 -0400"
      },
      "message": "[CI] Simplify Jenkins pytest execution (#19947)\n\nThis PR simplifies Jenkins pytest execution around standard pytest-xdist\nbehavior.\n\n- Runs each already-filtered CPU/GPU suite once with `-n auto`; the\nbroad suite keeps load-group scheduling because its order-sensitive\ncases require it.\n- Removes external sharding, wrapper/profile code, JUnit XML generation\nand publication, the skipped-test XML consumer, obsolete suite naming,\nand orphaned helpers.\n- Retains one inert `task_clear_pytest.sh` entry point only because PR\njobs evaluate their Jenkinsfile from the trusted base branch before\nchecking out the PR; it performs no cleanup or reporting and can be\nremoved after this pipeline lands.\n- Corrects stale broad-suite paths and explicit target guards, and\nmigrates a scalar stride test to the current `T.handle` pointer\nsemantics while preserving its negative lowering check.\n- Prevents nested MetaSchedule/XGBoost unit tests from multiplying CPU\nfanout without serializing the full suite.\n- Builds only the `tvm_runtime` target for the secondary GPU\nconfiguration and removes its unconsumed `gpu2` artifact upload.\n\nThe result reduces parallelism to one layer managed by pytest-xdist\nwhile preserving GPU filtering and native failure visibility."
    },
    {
      "commit": "5427e3c2dece19afd9e29696578139046bb1dd97",
      "tree": "b769f70d0bd9cdd943287de3e205b2807becd348",
      "parents": [
        "adf8d6a463038e5ab700487886674cf82d9937a6"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Jul 05 13:21:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 22:21:10 2026 -0700"
      },
      "message": "[CI] Remove stale GitHub automation (#19946)\n\nRetire GitHub automation that is disabled, non-functional, unowned, or\nexplicitly no longer wanted, together with its orphaned support code and\ntests.\n\nThis removes the optional Dependabot version-update config; automatic\nteam mentions and cc-review requests; last-successful and nightly branch\nadvancement; reviewer pings; the disabled PR-comment bot; and the unused\nCI-resource upload path. Active CI, release, tvm-bot, and manual\nDocker-update workflows remain, with narrower permissions and event\nguards, plus refreshed issue-template and network-resource guidance.\n\nThe behavior change is intentional: reviewer requests and team routing\nbecome manual, and the nightly and last-successful branches are no\nlonger advanced by this repository. Dependabot security updates remain\ncontrolled by repository settings."
    },
    {
      "commit": "adf8d6a463038e5ab700487886674cf82d9937a6",
      "tree": "d6853eca0f5803bf24d25ff6ba654fb3f1fb82ac",
      "parents": [
        "45e1b8233a0f443311853d08e65a92c36b5c79bd"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Jul 05 09:54:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 21:54:04 2026 -0400"
      },
      "message": "[TIRx] Phase out duplicate Var type_annotation (#19944)\n\n## Rationale\n\nTIRx variables use inherited `ExprNode::ty` as their single semantic\ntype. Retaining a primitive handle surrogate erases the distinction\nbetween scalar values, typed pointers, and true opaque pointers, then\nforces later passes and code generators to reconstruct information that\nthe IR already owns.\n\n## Changes\n\n- Remove the duplicate reflected `Var::type_annotation` state and\npreserve exact `PrimType` or `PointerType` through construction,\nvisitors, transforms, specialization, builders, printers, and code\ngeneration.\n- Keep scalar-only boundaries explicit through `PrimExpr`, `PrimVar`,\nand `PrimType`; pointer-capable values remain general `Expr` or `Var`.\n- Keep helper boundaries no broader than their contracts: TE tensor\nvariable indices use `PrimVar`, while expression deep equality recurses\nthrough general `Expr` only where pointer-bearing `Call` arguments\nrequire it and does not generalize private arithmetic subclasses.\n- Keep core statement reflection typed as `Expr`, name general\nreinterpret targets as `target_ty`, and preserve exact pointer calls in\nthe general vectorization path with explicit scalarization behavior.\n- Delete `PrimType::Handle()` and `PrimType::IsHandle()`. True opaque\npointers use `PointerType::VoidPointerTy()`; TVMScript renders the\ncanonical global type as `T.handle`, standalone values as `T.handle()`,\nand scoped void pointers with a keyword-only storage scope.\n- Make `CodeGenSourceBase::SSAGetID` a single `Type` boundary across\nsource backends, without a separate primitive-type or runtime-dtype\nvariant.\n- Keep WebGPU semantic argument classification type-aware: storage\nbuffers are identified from `PointerType`, POD arguments from\n`PrimType`, and only the final `FunctionInfo` launch ABI is serialized\nto `DLDataType`.\n- Preserve exact pointer semantics at runtime boundaries, including\naccess pointers, packed calls and returns, external calls, storage\nrewrites, and target-specific lowering.\n\n## Migration guide\n\n- **Variable types:** In C++, replace `var-\u003etype_annotation` with\n`var-\u003ety`; in Python, replace `var.type_annotation` with `var.ty`. The\nresult is the exact `Type`: scalar variables carry `PrimType`, while\npointer variables carry `PointerType`.\n- **Scalar boundaries:** Use `PrimVar` and `PrimExpr` for variables and\nexpressions that are semantically scalar. When starting from a general\nview, narrow explicitly with `var.as_or_throw\u003cPrimVar\u003e()` or\n`expr.as_or_throw\u003cPrimExpr\u003e()`. Keep pointer-capable fields and call\narguments as `Var` or `Expr`. A default-constructed `PrimVar` is\nnullable, so construct local scalar variables explicitly, for example\n`PrimVar i(\"i\")`.\n- **Opaque pointers:** Replace `PrimType::Handle()` with\n`PointerType::VoidPointerTy()`. Replace `IsHandle()` tests with explicit\n`PointerType` inspection; use `PointerType(element_type, storage_scope)`\nwhen the pointee type is known instead of erasing it to a runtime handle\ndtype.\n- **TVMScript handles:** Use `arg: T.handle` for a global void-pointer\nannotation and `arg \u003d T.handle()` for a standalone value. Use\n`T.handle(storage_scope\u003d\"shared\")` for a scoped void pointer. Typed\npointers use forms such as `T.handle(\"float32\")`, `T.handle(\"float32\",\n\"global\")`, or `T.handle(\"float32\", \"shared\")`. Legacy\n`T.handle(\"void\")` input remains parse-compatible, but the printer\ncanonicalizes it to `T.handle` (or the keyword-only scoped form).\n- The separate `tirx.type_annotation` intrinsic used by access-pointer\nAPIs is unchanged; this migration removes only the duplicate variable\nfield.\n\n## Validation\n\n- Complete native C++ test executable: 122/122 passed, including\n`IRF.CountVar`.\n- Relax binding-rewrite suite: 12/12 passed, including transferred-user\nbookkeeping.\n- Canonical typed/void/scoped TVMScript handle printer and round-trip\nchecks: 5/5 passed."
    },
    {
      "commit": "45e1b8233a0f443311853d08e65a92c36b5c79bd",
      "tree": "8c73a3d76d753aebb47030ab01fca78d55f291c8",
      "parents": [
        "5745c209f482179f7edff965b185eb1f6c83e968"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Jul 05 08:18:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 20:18:43 2026 -0400"
      },
      "message": "Refactor Tensor arithmetic dispatch away from tirx.generic (#19943)\n\n## Summary\n\n- Move whole-Tensor arithmetic and cast dispatch onto `te.Tensor` while\nscalar TIRx smart constructors decline whole-Tensor operands.\n- Remove the legacy `tirx.generic` module, TOPI import-time mutation\nbridge, and obsolete aliases.\n- Migrate scan and cast callers while preserving identity-gated Thrust\nsum selection.\n\nWhole-Tensor behavior now lives with TE, leaving scalar TIRx\nconstruction independent of TOPI initialization."
    },
    {
      "commit": "5745c209f482179f7edff965b185eb1f6c83e968",
      "tree": "89c88bd5eac9ec348411ba4477ec508b7e00cf1f",
      "parents": [
        "3452fd4ffa516f5f469e56a0f98b136f938d75af"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Jul 05 06:29:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 18:29:56 2026 -0400"
      },
      "message": "[REFACTOR][SCRIPT] Keep dependent shape recursion in docsifier (#19940)\n\nReplace the nested `DocToPythonScript` invocation in Relax\ndependent-shape printing with an expression-string Doc rendered during\nthe active `PythonDocPrinter` traversal.\n\nThis keeps recursive IR-to-doc conversion inside the active docsifier,\npreserves naming, precedence, escaping, source paths, and printer\nconfiguration, and avoids a nested top-level renderer or a new public\nrendering entry point.\n\nExpression-string escaping is streamed directly into the final output so\nwrapper and nested source spans retain exact escaped byte offsets."
    },
    {
      "commit": "3452fd4ffa516f5f469e56a0f98b136f938d75af",
      "tree": "342bc800cba8d6b668079bd6dbae0489d395d2df",
      "parents": [
        "77dd26998568427dd22985b91530b88da22fb2c3"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Jul 05 05:49:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 17:49:45 2026 -0400"
      },
      "message": "[TEST] Serialize local GPU execution under pytest-xdist (#19942)\n\nAdd tvm.testing.run_with_gpu_lock backed by the existing\ntvm_ffi.utils.FileLock. Migrate live local GPU tests to acquire the\nmachine-local lock around device execution, synchronization, host\ntransfer, and checks while leaving target construction and compilation\noutside the critical section.\n\nReplace the custom xdist scheduler with standard xdist_group placement\nfor the order-dependent test family. RPC tests retain dynamic port\nallocation and per-test process isolation rather than gaining a broad\ncategory lock."
    },
    {
      "commit": "77dd26998568427dd22985b91530b88da22fb2c3",
      "tree": "8375f341b1919e1621ce158033b31b6dbe2205a1",
      "parents": [
        "c4ab46c7a6f18c34503b86d5f19bd7ce4421ecef"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Jul 05 05:49:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 17:49:29 2026 -0400"
      },
      "message": "[CI] Batch Python unittest pytest targets into a single invocation (#19941)\n\nThe Python unittest CI step previously looped over each collected test\ndirectory and invoked `run_pytest` once per directory. Splitting related\ntests across many pytest invocations fragments Jenkins failure reports.\n\nThis change collects the ordered test directory list into a\n`PYTEST_TARGETS` array first, then passes the full target set to a\nsingle `run_pytest` invocation. Target ordering, pytest flags\n(`--reruns\u003d3`, `-n\u003d1`), `PYTEST_ADDOPTS` environment setup, and per-test\nfailure behavior are unchanged; the platform-minimal run remains a\nseparate invocation with its own JUnit XML.\n\nThis keeps related failures within one pytest report for clearer CI\noutput."
    },
    {
      "commit": "c4ab46c7a6f18c34503b86d5f19bd7ce4421ecef",
      "tree": "73665e0f5ad79b552411a592ef234ce54de9cf5d",
      "parents": [
        "1fb1c3866501eee8ddb5f9e01b53603c2fc805dc"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sun Jul 05 04:33:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 16:33:31 2026 -0400"
      },
      "message": "[FFI] Use thread-safe packed function initialization (#19939)\n\nGenerated LLVM modules currently cache imported packed functions through\nan unsynchronized null check and plain store. Concurrent first calls can\ntherefore race the lookup and cache update.\n\nThis change:\n\n- routes generated C and LLVM lookups directly through\nTVMFFIEnvModLookupFromImports and removes the superseded\nTVMBackendGetFuncFromEnv wrapper;\n- gives each LLVM cached function a readable internal hidden initializer\nand publishes its module-owned result through TVMFFIHandleInitOnce;\n- removes the unused TVMBackendRunOnce export and dead LLVM static-init\nproducer while preserving the live static-handle path.\n\nValidated with the existing LLVM, C-host, common codegen, static-init,\nand C++ test suites."
    },
    {
      "commit": "1fb1c3866501eee8ddb5f9e01b53603c2fc805dc",
      "tree": "ee1ce0f8ee5ca7f6969a92644e59985dcbed8ec7",
      "parents": [
        "e90cd3443d1c5f9ef0e300046d9aa733ca9c9747"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Jul 04 22:39:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 10:39:52 2026 -0400"
      },
      "message": "[IR][Relax] Include expression types in structural identity (#19933)\n\n## Rationale\n\nAfter `PrimExpr` and `Expr` share one typed expression hierarchy,\nexpression types are part of semantic identity. Structurally identical\nsyntax with different types compare and hash differently, while source\nspans remain diagnostic metadata.\n\n## Invariant\n\n`ExprNode::ty` participates in structural equality and hashing by\ndefault. `GlobalVar` and Relax variables retain their symbol identity\nrules. `tirx.PrimFunc` compares and hashes authoritative source fields\nwhile excluding its derived type cache until all transformation paths\nmaintain that cache eagerly. Nested symbolic-shape rendering is isolated\nfrom outer diagnostic configuration so diagnostic context cannot become\nscript-token content.\n\n## Changes\n\n- include expression types in generic structural equality and hashing\n- preserve GlobalVar and Relax variable identity plus definition-safe\nSeqExpr traversal\n- compare and hash PrimFunc from authoritative fields while excluding\nits stale derived type cache\n- normalize narrow Relax construction and expected-fixture types exposed\nby stricter identity\n- isolate nested symbolic-shape token rendering from outer printer\nconfiguration"
    },
    {
      "commit": "e90cd3443d1c5f9ef0e300046d9aa733ca9c9747",
      "tree": "bb6e16daf8bc97568bfd63d9da64884af064ccca",
      "parents": [
        "d27ed727ce8417d84e8210548ae52ccac868162a"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Jul 04 22:39:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 10:39:39 2026 -0400"
      },
      "message": "[TIR] Construct proven scalar integer constants directly (#19934)\n\nReplace MakeConst with direct IntImm construction at call sites whose\nstatic contracts guarantee scalar integer constants.\n\nThe repository-wide audit converts 80 call sites across 32 files.\nGeneric construction remains where runtime dtype, vector behavior,\nunsigned range, overload resolution, or invalid-input diagnostics\nrequire it. Eleven initially proposed conversions were reverted after\ncompilation and focused tests exposed false positives.\n\nValidation:\n- LLVM-enabled compiler and runtime library build\n- Focused arithmetic, TIR, S-TIR, TOPI, TE, LLVM-codegen, reflection,\nand printing suites\n- Changed-file pre-commit and git diff checks"
    },
    {
      "commit": "d27ed727ce8417d84e8210548ae52ccac868162a",
      "tree": "fc794579193ba508855faa7d6194ceed40294f91",
      "parents": [
        "99869414de31e1ee059d09fce53e10ce2aa8c59a"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Sat Jul 04 03:36:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 15:36:18 2026 -0400"
      },
      "message": "[TIRx] Generalize expression functor signatures (#19931)\n\nExpression unification gives TIRX a shared `Expr` surface, but its\nvisitor and mutator APIs still expose primitive-only signatures. That\nmismatch prevents general expressions from flowing through the existing\ntraversal structure and leaves statement traversal with overlapping\ncustomization hooks.\n\nThis refactor generalizes the existing `ExprFunctor`, `ExprVisitor`, and\n`ExprMutator` signatures in place to accept and return `Expr`. Statement\nvisitors and mutators expose a single virtual `VisitExpr(const Expr\u0026)`\nhook, while primitive statement reconstruction uses a non-virtual\nchecked `VisitPrimExpr` helper so invalid narrowing fails at the\nboundary. Public pre-order and post-order traversal entry points accept\ngeneral `Expr` roots.\n\nThe existing specialization, vtable, dispatch registration, and class\nstructure remain intact; the change adds no parallel functor, fallback\ndispatcher, or alternate implementation path."
    },
    {
      "commit": "99869414de31e1ee059d09fce53e10ce2aa8c59a",
      "tree": "21ce9980ebaff8bf9b778be3877c7d2ea87e1663",
      "parents": [
        "275114b3274bbd57d63b0884093d7b2a5dbb775e"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Jul 03 23:33:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 11:33:14 2026 -0400"
      },
      "message": "[TIRX] Remove SizeVar in favor of contextual constraints (#19930)\n\n## Rationale\n\n`SizeVar` encodes nonnegativity in runtime subtype identity, which is\nfragile under cloning and remapping. Symbolic integer values should use\none `Var` representation, with nonnegative facts recorded in the\nanalyzer at the use sites that establish them.\n\n## Changes\n\n- Remove `SizeVar` from the C++, Python, TE, TVMScript, FFI, visitor,\nand serialization surfaces, and migrate callers to `Var`.\n- Preserve the existing Relax constraint ownership model and use\n`MarkGlobalNonNegValue` as the canonical path for global nonnegative\nfacts.\n- Preserve `T.handle()` as the normal opaque-handle form. An optional\ndtype constructs a typed pointer, with `T.handle(\"void\")` reserved for\nan explicit pointer-to-void."
    },
    {
      "commit": "275114b3274bbd57d63b0884093d7b2a5dbb775e",
      "tree": "11c719de901cb6cef5218b883629ec060c53aef1",
      "parents": [
        "bd906f082f1840afa0de7ebb38146ecfb849afff"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Jul 02 06:55:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 18:55:33 2026 -0400"
      },
      "message": "[REFACTOR][IR] Unify PrimExpr with Expr typed view (#19910)\n\n## Summary\n- Make `PrimExpr` a typed C++ view over `Expr` values whose\n`ExprNode::ty` is `PrimType`, instead of using a separate runtime node\nclass as the proof of primitive-ness.\n- Use the shared `ir::Call` node for Relax, TIRX, and primitive-valued\ncalls, while keeping primitive-only APIs explicit at their semantic\nboundaries.\n- Keep Python on the general `Expr` surface for primitive-typed values\nso `isinstance` behavior does not imply a nominal primitive-expression\nsubclass.\n\n## Design Rationale\nThe main advantage of this change is that common expression nodes such\nas `Call` can be unified without specializing each one to `PrimType`. A\nsingle `ir::Call` can represent a Relax tensor call, a Relax scalar\ncall, or a primitive-valued intrinsic call; the result type stored in\n`ExprNode::ty` determines whether that particular value can be viewed as\n`PrimExpr`.\n\nThis keeps the IR node hierarchy focused on expression structure rather\nthan result-type categories. Nodes that are intrinsically primitive,\nsuch as integer and floating-point literals or TIRX primitive operators,\nstill have strongly typed C++ APIs and data structures. General nodes\nwhose result type may vary, such as `Call`, remain general `Expr` nodes\nand are narrowed to `PrimExpr` only where primitive-only semantics are\nrequired.\n\nThe PR also keeps the compatibility surface practical: C++\nprimitive-only APIs continue to accept `PrimExpr`, Python exposes a\ncompatibility predicate for checking the primitive typed category, and\nvisitors/printers use one natural `Call` path rather than duplicating\nRelax and primitive call handling. Missing expression types are\nrepresented explicitly with `Type::Missing()` so constructors can leave\ntype inference to later analysis without relying on nullable `Type`\nvalues."
    },
    {
      "commit": "bd906f082f1840afa0de7ebb38146ecfb849afff",
      "tree": "5288ee4b0dd910a565371bb6d96b41c7a3a82909",
      "parents": [
        "bb750012a42e58eef1927452a053183bb28cf9b1"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Wed Jul 01 16:58:59 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 23:58:59 2026 +0300"
      },
      "message": "[ONNX] Fix missing helper in AffineGrid test (#19920)\n\nThis pr adds a onnx helper that cleaned by #19880 and fixes ci error"
    },
    {
      "commit": "bb750012a42e58eef1927452a053183bb28cf9b1",
      "tree": "ecb4d11a142020d0b8945bb3e386e9d4c876d639",
      "parents": [
        "6383c7fd7f9edbd73e8d81a0b0f39d19e3b0e331"
      ],
      "author": {
        "name": "Guan-Ming Chiu",
        "email": "105915352+guan404ming@users.noreply.github.com",
        "time": "Wed Jul 01 08:00:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 20:00:41 2026 -0400"
      },
      "message": "[TIRx] Add a dedicated boolean buffer lowering pass (#19873)\n\n## Why\n\nThe bool→int8 backing-array conversion was duplicated inline across\n`FlattenBuffer` and `LowerTIRxCleanup`.\n\n## How\n\n- Add `LowerBoolBuffer` pass that rewrites `bool` buffers to `int8` and\ninserts load/store casts.\n- Remove the duplicated bool handling from `FlattenBuffer` and\n`LowerTIRxCleanup`.\n- Run it after FlattenBuffer (before VectorizeLoop) in every pipeline,\nwith structural and build-and-run tests.\n\n---------\n\nSigned-off-by: Guan-Ming (Wesley) Chiu \u003c105915352+guan404ming@users.noreply.github.com\u003e"
    },
    {
      "commit": "6383c7fd7f9edbd73e8d81a0b0f39d19e3b0e331",
      "tree": "59045c9245beadf160ddb587dc60a4d479bca76c",
      "parents": [
        "67987c45929766d8f89712d58282767fe6aff805"
      ],
      "author": {
        "name": "Guan-Ming Chiu",
        "email": "105915352+guan404ming@users.noreply.github.com",
        "time": "Wed Jul 01 03:35:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 15:35:22 2026 -0400"
      },
      "message": "[Relax][ONNX] Support 3D AffineGrid (#19863)\n\n## Related Issue\n\ncloses #19689\n\n## Why\n\nThe Relax AffineGrid op only handled 2D (4D theta/grid); 5D 3D inputs\nfrom ONNX failed.\n\n## How\n\n- Generalize struct-info inference to 2D/3D via spatial \u003d\nsize_sinfo-\u003endim.\n- Branch TOPI affine_grid compute on 2D vs 3D.\n- Add the 3D permute path in the frontend and a test_affine_grid_3d\ncase.\n\n---------\n\nSigned-off-by: Guan-Ming (Wesley) Chiu \u003c105915352+guan404ming@users.noreply.github.com\u003e"
    },
    {
      "commit": "67987c45929766d8f89712d58282767fe6aff805",
      "tree": "ddadaa2d58deb1b7ac17d13f165b8d5478286851",
      "parents": [
        "4fd6cfab157cdd7e77399bb419f43193c050043d"
      ],
      "author": {
        "name": "Ruihang Lai",
        "email": "ruihangl@cs.cmu.edu",
        "time": "Tue Jun 30 15:22:59 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 15:22:59 2026 -0400"
      },
      "message": "[Runtime][KVCache] Adapt FlashInfer attention backend to 0.6.3 (#19904)\n\nFlashInfer 0.6.3 changes the paged-attention plan/run ABI: the\nprefill/decode plans take new arguments (e.g. window_left,\nfixed_split_size, disable_split_kv; the decode plan now dispatches dtype\nthrough empty q/kv tensors), the runs add enable_pdl and drop the\nexplicit stream, and the kernels consume separate key/value paged caches\nread through tensor strides rather than one combined tensor. This\nupdates\nthe runtime attention backend (paged MHA, ragged, decode and MLA) to the\nnew signatures and to the Array\u003cint64_t\u003e plan-info representation.\n\nFlashInfer 0.6.3 reads tensors from `data` directly and does not honor\nthe DLPack `byte_offset` field. mlc\u0027s auxiliary index tensors\n(qo_indptr,\nkv_indptr, page_indptr, page_indices, length_info) are views packed into\na shared workspace and so carry a non-zero byte_offset; passed as-is the\nkernels read the wrong addresses (e.g. a ragged prefill processed only\nthe first query row). Three zero-copy DLPack view helpers address this:\n`ZeroByteOffsetView` folds byte_offset into the data pointer,\n`PagedKVCacheView` exposes the combined (num_pages, 2, ...) page tensor\nas separate strided key/value caches, and `SliceLastDimView` slices the\nlast dimension for MLA.\n\nThis also completes the MLA FlashInfer path, which previously shipped\nonly the test and module generator. The MLA run splits the query into\nnope/pe parts and the paged cache into ckv/kpe parts, and the ragged\nself-attention is given its own uncompressed head dims and per-query kv\nhead count via a 5-element backend spec, since they differ from the\ncompressed MLA cache.\n\nThe MHA and MLA FlashInfer KV-cache tests are re-enabled as regression\ncoverage, guarded on FlashInfer availability (inline-RoPE is skipped as\nunsupported by FlashInfer)."
    },
    {
      "commit": "4fd6cfab157cdd7e77399bb419f43193c050043d",
      "tree": "9a158af0fab25cdd118a9dcd955e7062a338a82b",
      "parents": [
        "9e8cfea3585089daa10b197fd7282dff75c0edbc"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Wed Jul 01 02:37:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 14:37:06 2026 -0400"
      },
      "message": "[TVMScript] Render invisible paths in structural diagnostics (#19916)\n\nStructural diagnostics can identify a field below an object that\nTVMScript renders without exposing that field. An underline alone then\npoints at the nearest visible parent and hides the full internal\nlocation. This change keeps Script string-returning while making the\ndiagnostic context self-contained.\n\nWhen the requested path is \u003croot\u003e.dtype, Script now returns this string\nby default:\n\n```text\nAccess path: \u003croot\u003e.dtype\nNote: The underlined object is the nearest visible parent of this path.\n\nT.int32\n^^^^^^^\n```\n\nrender_invisible_path_info defaults to true. Calls without target paths\nare unchanged, and callers can set it to false to retain the legacy\nunderline-only string.\n\nThe implementation reuses the printer span-selection logic to capture\nthe deepest visible path and assembles the minimal\naccess-path/note/script block in C++. Pass-error enrichment uses the\nsame Script path. Production Python remains unchanged; focused Python\ntests assert the complete strings for default-on, explicit-false,\nhidden, exact-visible, unavailable-visible, pass-error, and\nstructural-equality cases."
    },
    {
      "commit": "9e8cfea3585089daa10b197fd7282dff75c0edbc",
      "tree": "f49c677017fb5820110e37f40c4c68e0ebf39fac",
      "parents": [
        "ad694c41791a532d423ac590fd05bf030ebb00b0"
      ],
      "author": {
        "name": "Qize Li",
        "email": "2864630476@qq.com",
        "time": "Tue Jun 30 23:18:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 11:18:24 2026 -0400"
      },
      "message": "[Target][RISC-V] Use riscv_cpu device key for RISC-V target tags (#19915)\n\nRISC-V target tags use the LLVM codegen backend, so their target kind\nshould remain \"llvm\". However, the target metadata should still identify\nthe target as a RISC-V CPU rather than an ARM CPU.\n\nPreviously, the RISC-V tag helper used the ARM CPU keys and device\nmetadata, so Target(\"riscv/...\") expanded with keys [\"arm_cpu\", \"cpu\"]\nand device \"arm_cpu\".\n\n```python\n{\"kind\": \"llvm\", \"keys\": [\"arm_cpu\", \"cpu\"], \"device\": \"arm_cpu\"}\n```\n\nThis is misleading for code that inspects target keys or device metadata\nto distinguish CPU families.\n\nThis change updates the RISC-V tag helper to use keys [\"riscv_cpu\",\n\"cpu\"] and device \"riscv_cpu\", while keeping kind\u003d\"llvm\". It also adds\nthe SpacemiT K3 RISC-V target tag."
    },
    {
      "commit": "ad694c41791a532d423ac590fd05bf030ebb00b0",
      "tree": "57dc7bcc75b12d7d279c383230698acb7910c905",
      "parents": [
        "3d2e339bab55f9098b610254648aaeea3471bef2"
      ],
      "author": {
        "name": "Guan-Ming Chiu",
        "email": "105915352+guan404ming@users.noreply.github.com",
        "time": "Tue Jun 30 21:10:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 09:10:38 2026 -0400"
      },
      "message": "[Relax] Clean up deprecated void-dtype sentinel usage (#19908)\n\n## Why\n\nAfter #19890 moved Relax dtype to optional, two spots still used the\ndeprecated `DLDataType{kDLOpaqueHandle, 0, 0}` void sentinel.\n\n## How\n\n- Drop the now-unreachable unknown-dtype branch in IsBoolType (handled\nearlier by IsUnknownDtype()).\n- Replace the raw void-sentinel comparison in ones/zeros with\nPrimType::IsVoid().\n\n---------\n\nSigned-off-by: Guan-Ming (Wesley) Chiu \u003c105915352+guan404ming@users.noreply.github.com\u003e"
    },
    {
      "commit": "3d2e339bab55f9098b610254648aaeea3471bef2",
      "tree": "44cc8236d6e14950ae833c22365a0abb85652040",
      "parents": [
        "0de13e08e44ac66c0d16805d2a5bc76be55b0aef"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Tue Jun 30 09:09:28 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 09:09:28 2026 -0400"
      },
      "message": "[DOCS] Refine footer navigation links (#19914)\n\nThis PR cleans up duplicated footer navigation links in the Sphinx docs\ntheme configuration.\n\nThe footer previously rendered `Community · Download · Docs` as text\nlinks while related navigation was also available through icon/theme\ncontrols. This update removes those footer text links and keeps\nnavigation in the icon area instead."
    },
    {
      "commit": "0de13e08e44ac66c0d16805d2a5bc76be55b0aef",
      "tree": "d7ccc5b62c88849a606bb14832a0743b298a01db",
      "parents": [
        "7cbaa211310946271f0b15574c69486221a8ba71"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Tue Jun 30 09:09:03 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 09:09:03 2026 -0400"
      },
      "message": "[CI][Docker] Install libpolly-15-dev for noble llvm-15 static linking (#19913)\n\n#19893 switched the LLVM install from apt.llvm.org to noble\u0027s own repos.\nUnlike apt.llvm.org, noble splits Polly\u0027s static libs into a per-version\nlibpolly-\u003cN\u003e-dev package. The install list added libpolly-16-dev and\nlibpolly-17-dev but not libpolly-15-dev, so `llvm-config-15\n--link-static` (used by the GPU build) cannot find libPolly.a /\nlibPollyISL.a, breaking the libtvm_compiler.so link. Add\nlibpolly-15-dev."
    },
    {
      "commit": "7cbaa211310946271f0b15574c69486221a8ba71",
      "tree": "1b37d778dc83db4639dc353f631f6deb2a2af48b",
      "parents": [
        "3e355adf176c355e2ad8441c4088dbcee9bfcc96"
      ],
      "author": {
        "name": "Ruihang Lai",
        "email": "ruihangl@cs.cmu.edu",
        "time": "Mon Jun 29 21:30:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 21:30:44 2026 -0400"
      },
      "message": "[Relax] Fix int64 row index cast in GPU multinomial sampling (#19902)\n\nAfter the tirx refactor, a `T.let` binding no longer implicitly casts\nits right-hand side to the annotated dtype. In\n`gpu_multinomial_from_uniform`, `row_idx` is annotated `int64` but is\nloaded from the `row_indices` buffer, whose dtype is the configurable\n`sample_indices_dtype` and may be `int32`. Relying on the let annotation\nto widen the value is no longer valid and yields a dtype mismatch.\n\nWrap the load in an explicit `T.Cast(\"int64\", ...)` so the row index is\nalways converted to the annotated int64 type regardless of\n`sample_indices_dtype`."
    },
    {
      "commit": "3e355adf176c355e2ad8441c4088dbcee9bfcc96",
      "tree": "6372eec2d410de41b5d060ee1dc21d407af22f99",
      "parents": [
        "24bbfd2e7b435fc56db26846bada4f953e80ccd9"
      ],
      "author": {
        "name": "Ruihang Lai",
        "email": "ruihangl@cs.cmu.edu",
        "time": "Mon Jun 29 17:18:12 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 17:18:12 2026 -0400"
      },
      "message": "[Relax] Fix RemoveUnusedParameters symbolic var promotion (#19901)\n\nAfter the tirx refactor, a relax `PrimType` parameter carries only a\ndtype and no longer binds a value, so it does not *define* the symbolic\nvariable it used to provide. When `RemoveUnusedParameters` drops an\nunused tensor parameter whose shape is the sole definition of a free\nsymbolic variable, it re-adds that variable through a value-bearing\n`PrimType` (`R.Prim(value\u003d...)`) parameter. Under the stricter tirx\nwell-formedness verifier this leaves the variable undefined, so the pass\nemits an ill-formed module.\n\nPromote each such free symbolic variable through a 1-D `ShapeType`\nparameter (`R.Shape([var])`) instead, which actually defines the\nvariable, and pass its value at the call site as a `ShapeExpr`. The\npreviously xfail-ing `test_replace_symbolic_variables` is updated to the\nnew shape-based form and re-enabled as a regression test."
    },
    {
      "commit": "24bbfd2e7b435fc56db26846bada4f953e80ccd9",
      "tree": "c4f0a2d4b6503dd80a85e45ca9c61d72e9670afe",
      "parents": [
        "5d9f6e1e5c9d1dd1f4b1e2e5921408d55ab762ff"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Mon Jun 29 14:55:36 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 14:55:36 2026 -0400"
      },
      "message": "[CI][Docker] Move CI images to Ubuntu 24.04 (noble) (#19893)\n\nBump ci_cpu, ci_arm, ci_wasm and ci_gpu from Ubuntu 22.04 (jammy) to\n24.04 (noble) so the default g++ is gcc-13, which fully implements C++20\n(TVM builds with CMAKE_CXX_STANDARD 20).\n\n- ci_gpu: nvidia/cuda 12.8.1-cudnn-devel base to ubuntu24.04 and CUDA\napt GPG key path ubuntu2204 -\u003e ubuntu2404.\n- ubuntu_install_core.sh: libtinfo-dev -\u003e libncurses-dev and lsb-core -\u003e\nlsb-release (both removed on noble).\n- ubuntu_install_llvm.sh: install llvm/clang 15/16/17 from the distro\nrepos (noble universe ships them); drop the apt.llvm.org source (no\nnoble debs for 15/16).\n- ubuntu_install_rocm.sh: ROCm apt 5.3/jammy -\u003e 6.4.4/noble (5.3 has no\nnoble pool); keep lld-15 to match the LLVM 15 TVM is built with on the\nGPU image.\n- ubuntu_install_vulkan.sh: LunarG SDK list jammy -\u003e noble."
    },
    {
      "commit": "5d9f6e1e5c9d1dd1f4b1e2e5921408d55ab762ff",
      "tree": "271ffbc11cde00c37414ef958fa0d30a59b96723",
      "parents": [
        "4224d51090a67e766ec80596c28de0163bfd16fe"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Mon Jun 29 00:49:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 00:49:44 2026 -0400"
      },
      "message": "[FFI] Bump tvm-ffi to latest June 28 (#19903)\n\nUpdates the tvm-ffi gitlink to 84ee1a07f85645886d2eebc9ddd0ddf9488fd38a.\nPointer-only change; focused tensor-content structural-equality,\nruntime, and compiler-object validation passed."
    },
    {
      "commit": "4224d51090a67e766ec80596c28de0163bfd16fe",
      "tree": "2904110c1d4aa758ed381c55e4d8164bd7e82583",
      "parents": [
        "03267616a676dbfee8b040d1dee6de1139eb350a"
      ],
      "author": {
        "name": "Bohan Hou",
        "email": "bohanhou@andrew.cmu.edu",
        "time": "Sun Jun 28 21:11:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 00:11:23 2026 -0400"
      },
      "message": "[TIRx] Bundle CUDA tile primitive and op dispatch updates (#19896)\n\n## Summary\n\nThis bundles the 18 commits currently carried in `spectrometerHBH/tvm`\non top of `apache/tvm:main`.\n\nMajor areas:\n\n- Extend CUDA TIRx tile primitives and op dispatch paths, including\nvector PTX ld/st, shared-memory copy paths, TMA/tcgen05 descriptor\nhandling, dense FP8/TF32 `gemm_async`, and CUDA elementwise tile\ndispatch.\n- Add support utilities for benchmark timing, CUDA ptxas option\nplumbing, and TMA/TFLOAT32 descriptors.\n- Fix unsigned integer floormod/floordiv simplification rewrites without\noverflow and update the corresponding TIRx constant-folding tests.\n- Update TIRx dtype handling for upstream `PrimType` compatibility.\n- Add and update TIRx CUDA/operator tests for copy, elementwise, permute\nlayout, and `gemm_async` behavior.\n\n## Validation\n\n- `git diff --check apache/main..HEAD`\n- `python -m tirx_kernels.bench_suite --check-imports`\n- `python -m tirx_kernels.registry --cc 10 --strict`\n- `python -m pytest tests/python/tirx/ -n 16`\n  - `2033 passed, 39 skipped, 3 xpassed`\n- `python -m pytest tests/python/tirx-base/test_tir_imm_values.py -q`\n  - `44 passed, 6 warnings`\n- `pre-commit run --files tests/python/tirx-base/test_tir_imm_values.py`\n- Focused TIRx regression tests after formatting:\n  - `test_cast_vec2_packed_dispatch`\n  - `test_cast_warpgroup_src_layout_to_flat_uses_vec2_intrinsic`\n  - `test_gemm_tcgen05_cta_group_1[task0]`\n- Full `bench_suite --impls all` sweep: 256/256 workloads completed\nsuccessfully.\n- Apache PR CI on `928a0605d0`: all required GitHub Actions and Jenkins\nchecks passed."
    },
    {
      "commit": "03267616a676dbfee8b040d1dee6de1139eb350a",
      "tree": "7bf54b879a027ba9509e8b01aaac192dd278281b",
      "parents": [
        "182db0f25251670df2086231539e7c21d35d746e"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Sun Jun 28 12:22:45 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 28 12:22:45 2026 -0400"
      },
      "message": "[DOCS] Refine tvm pypi wheel optional install guidance (#19892)\n\nThis PR refines the PyPI and optional backend installation docs.\n\nIt adds lightweight CUDA environment guidance for PyPI installs, removes\nduplicated TIRx source-build instructions, and avoids showing optional\nTensorRT/CUDA skip messages in the BYOC tutorial output."
    },
    {
      "commit": "182db0f25251670df2086231539e7c21d35d746e",
      "tree": "427bc2fce5afca1257605d1e09e7941a367420d8",
      "parents": [
        "46a9a00c8e2ba2c69c539a46412bea0f7f5b9ac7"
      ],
      "author": {
        "name": "Neo Chien",
        "email": "6762509+cchung100m@users.noreply.github.com",
        "time": "Sun Jun 28 10:56:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 27 22:56:13 2026 -0400"
      },
      "message": "[Relax][PyTorch] Add rnn_tanh.input converter (#19837)\n\nHi Committers,\n\nThis PR addresses the `rnn_tanh.input` part of issue\nhttps://github.com/apache/tvm/issues/18364. Any suggestions would be\nappreciated if you are available.\n\n---------\n\nCo-authored-by: cchung100m \u003ccchung100m@users.noreply.github.com\u003e"
    },
    {
      "commit": "46a9a00c8e2ba2c69c539a46412bea0f7f5b9ac7",
      "tree": "699fbe642f0211a410a9a81061febe15970d7209",
      "parents": [
        "b00b85b30b7daa0226fb51e777463ad2166be31c"
      ],
      "author": {
        "name": "Bohan Hou",
        "email": "bohanhou@andrew.cmu.edu",
        "time": "Fri Jun 26 20:19:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 20:19:46 2026 -0700"
      },
      "message": "[DOCS][TIRX] Add in-kernel profiling (CudaProfiler) tutorial (#19895)\n\nThis adds an in-kernel profiling page to the TIRx native-basics CUDA\nsection,\ndocumenting the existing `tvm.tirx.bench.CudaProfiler`.\n\nThe page covers:\n\n- a minimal load / compute / store example using `start` / `end` /\n`finalize`\n  markers and a user-supplied `uint64` buffer;\n- decoding the record buffer on the host and exporting a Perfetto trace\nvia\n  `export_to_perfetto_trace`;\n- the record/tag encoding and the device code each call lowers to (a\n  `%globaltimer` read, a leader-only global store, and a block fence);\n- usage notes: one leader per `(block, group)`, buffer sizing, the\n32-bit\n  `%globaltimer` wrap, and the per-region cost.\n\nThe example is tested end-to-end on a CUDA GPU (B200, sm_100). It is\nwired into\nthe `native_basics.rst` toctree after \"Compiling and inspecting\". The\nFlashAttention-4 timeline screenshot is served from `tlc-pack/web-data`\n(`images/tirx/tirx_cudaprofiler_fa4.png`), matching the other tirx doc\nfigures."
    },
    {
      "commit": "b00b85b30b7daa0226fb51e777463ad2166be31c",
      "tree": "9b43e54bf7eca053613d9e39d9e9878eab32e31b",
      "parents": [
        "acb65f79c6236a8e4ed37ae0670716cbc384bfce"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Fri Jun 26 20:54:19 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 20:54:19 2026 -0400"
      },
      "message": "[Frontend][ONNX] Fix structural tests for TVMScript checks (#19894)\n\nThis pr is the follow-up pr of #19880. This pr updates ONNX frontend\nstructural tests to match the current Relax/TVMScript\nsemantics on main.\n\nThe previous expected IR still used `\"void\"` as the default dtype marker\nfor ops such as matmul, cumsum, and zeros_like. After the Relax\noptional-dtype cleanup, those defaults should be represented by omitting\nthe dtype argument, which makes CI crash\n\nAlso update the dynamic-shape squeeze structural check to build the\nexpected Relax IR programmatically, because TVMScript currently cannot\nround-trip the SizeVar dataflow binding printed by the importer."
    },
    {
      "commit": "acb65f79c6236a8e4ed37ae0670716cbc384bfce",
      "tree": "c98eac3758590952974146f17b2b08d46ba3ff9b",
      "parents": [
        "08f7d9b984b1c1bfd7bf522aaa774029d18ebcc4"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Fri Jun 26 14:02:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 14:02:52 2026 -0400"
      },
      "message": "[ONNX] Use structural checks for composite frontend tests (#19880)\n\nin order to avoid running heavyweight ORT/VM integration checks for ONNX\nfrontend tests, this pr uses tvm.ir.assert_structural_equal for\ncomposite ONNX frontend lowerings built from multiple Relax ops, plus\nIR-specific importer behavior such as control flow, sequence/optional\nhandling, symbolic shapes, and dynamic lowering details\nWe keep check_correctness for direct Relax core-op mappings and tests\nthat explicitly cover numerical behavior or edge cases.\n\nThis keeps frontend PR tests focused on cheaper structural verification\nwhile preserving numerical coverage where the test is actually about\nRelax op correctness or frontend numerical behavior."
    },
    {
      "commit": "08f7d9b984b1c1bfd7bf522aaa774029d18ebcc4",
      "tree": "4e5fa72c8d1bbfd2a2859887284631482b90f48f",
      "parents": [
        "120812e9ac1a644fdf8186392dfd9e19adad11e3"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Jun 26 10:15:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 10:15:49 2026 -0400"
      },
      "message": "[Relax] Use optional dtype for absent Relax dtype fields (#19890)"
    },
    {
      "commit": "120812e9ac1a644fdf8186392dfd9e19adad11e3",
      "tree": "c485ca209d4325e730ab95916abe5094ae9270eb",
      "parents": [
        "81e62ecbb27724794940ce13e551e43313cae0c7"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Fri Jun 26 07:18:04 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 07:18:04 2026 -0400"
      },
      "message": "[REFACTOR][Relax] Phase out PrimValue and Relax expression wrappers (#19891)\n\nThis PR lets Relax expressions directly take `PrimExpr` values without\nrequiring the explicit `PrimValue` wrapper, continuing the Relax IR\nunification work by removing Relax-specific leaf/base expression layers.\n\nSummary:\n- Remove `LeafExpr` / `LeafExprNode` and use direct expression-node\nchecks where needed.\n- Converge Relax expression typing onto the shared IR `Expr` base.\n- Remove the `PrimValue` node wrapper while keeping `relax.prim_value` /\n`R.prim_value` as conversion helpers that return existing `PrimExpr`\nvalues unchanged.\n- Register direct `PrimExpr` handling through exact concrete node\ndispatch, aligned with the `tirx` expression visitor list and excluding\narith iter-map intermediate nodes.\n- Inline the private Python primitive conversion helper into public\n`relax.prim_value`.\n- Handle direct `PrimExpr` values in frontend scalar paths without\nassuming a `.value` field on non-immediate expressions."
    },
    {
      "commit": "81e62ecbb27724794940ce13e551e43313cae0c7",
      "tree": "85aafbf10df2abcf7fbc3487e504b9eceaac9063",
      "parents": [
        "980d75fd0897c4bdd1328fc453ed1379e40219fa"
      ],
      "author": {
        "name": "Zephyr",
        "email": "114734429+ZephyrLi-pro@users.noreply.github.com",
        "time": "Fri Jun 26 11:47:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 06:47:31 2026 +0300"
      },
      "message": "[TIRx][LLVM] Support scalable Ramp lowering (#19866)\n\nThe existing Ramp lowering path in CodeGenLLVM constructs fixed-width\nvectors by inserting each lane explicitly. This does not work for\nscalable vectors, whose runtime lane count is not known at compile time.\n\nPreviously, CodeGenLLVM rejected scalable-vector Ramp expressions. This\nprevents vectorized TIR/TIRx programs from lowering induction\nexpressions to RVV/SVE-style scalable vectors.\n\nThis patch adds a separate lowering path for scalable integer Ramp\nexpressions using LLVM stepvector. A scalable Ramp expression:\n\nRamp(base, stride, lanes)\n\nis lowered as:\n\nsplat(base) + stepvector() * splat(stride)\n\nFor LLVM \u003e\u003d 20, this uses llvm.stepvector. For older LLVM versions, this\nuses llvm.experimental.stepvector.\n\nA RISC-V RVV codegen test is added to verify that a vectorized induction\nexpression lowers to RVV lane-id and arithmetic instructions, such as\nvid.v, vmul.v*, and vadd.v*."
    },
    {
      "commit": "980d75fd0897c4bdd1328fc453ed1379e40219fa",
      "tree": "fba4d2431a116ae464de2de2c15d6c7ce4865c62",
      "parents": [
        "f613161d7239293c80c8335a65373a39d368fb4d"
      ],
      "author": {
        "name": "Guan-Ming Chiu",
        "email": "105915352+guan404ming@users.noreply.github.com",
        "time": "Fri Jun 26 05:50:02 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 17:50:02 2026 -0400"
      },
      "message": "[TIRx] Replace vars in buffer strides and elem_offset (#19871)\n\n## Why\n\nBufferReplacer passed strides and elem_offset through unchanged, so vars\nin them were never substituted\n\n## How\n\n- Visit and rewrite each strides `expr` and `elem_offset` when\nrebuilding the buffer.\n- Add test covering the fix.\n\nSigned-off-by: Guan-Ming (Wesley) Chiu \u003c105915352+guan404ming@users.noreply.github.com\u003e"
    },
    {
      "commit": "f613161d7239293c80c8335a65373a39d368fb4d",
      "tree": "d4831b08c6f78093eecef84d997d64213fd01ed7",
      "parents": [
        "9e3eaf39a091c32fdc5a016413ca8a9e6675b59f"
      ],
      "author": {
        "name": "Shushi Hong",
        "email": "820958424@qq.com",
        "time": "Thu Jun 25 15:40:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 15:40:31 2026 -0400"
      },
      "message": "[CI] Remove retired ci_lint Docker files (#19878)\n\nRemove the retired ci_lint Docker image definition and its legacy lint\nwrapper after the Jenkins matrix stopped building ci_lint in #19872.\n\nAlso remove the ci_lint entry from docker-images.ini, drop the\nretired-image skip from the nightly Docker updater, and update the CI\ntest fixture accordingly.\n\nKeep the temporary git_change_docker.sh ignore entries for the deleted\nlint Docker files so this cleanup PR does not trigger an unnecessary\nDocker image rebuild."
    },
    {
      "commit": "9e3eaf39a091c32fdc5a016413ca8a9e6675b59f",
      "tree": "118446d27bd8a5fe97ad04bade91b802378720fb",
      "parents": [
        "f3f5a3e42a7ad5d1d26041717845d570ec6ad573"
      ],
      "author": {
        "name": "Hongyi Wu",
        "email": "62729549+Aharrypotter@users.noreply.github.com",
        "time": "Fri Jun 26 01:30:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 13:30:25 2026 -0400"
      },
      "message": "[Relax][Frontend][TFLite] Support dynamic DYNAMIC_UPDATE_SLICE starts (#19881)\n\n## Summary\n\nThis PR adds Relax TFLite frontend support for runtime (dynamic) start\nindices\nin `STABLEHLO_DYNAMIC_UPDATE_SLICE`, addressing the\n`DYNAMIC_UPDATE_SLICE` item\nfrom #19412 section B.\n\n`_convert_stablehlo_dynamic_update_slice` (added in #19587) previously\nraised\n`OpNotImplemented` when the start-index scalars were runtime\n(non-constant)\nvalues, handling only compile-time-constant starts. Models that compute\nthe\nupdate offset at runtime could therefore not be imported. This PR makes\nthe\ndynamic-start path work, with StableHLO clamping semantics, without\nadding a new\nRelax op. The change is limited to this converter and its test.\n\n## Design\n\n### Dynamic start indices via scatter_nd\n\nThe existing static path already lowers `STABLEHLO_DYNAMIC_UPDATE_SLICE`\nto\n`relax.op.scatter_nd`, building the scatter index grid at compile time\nwith\n`numpy.indices`. `scatter_nd` accepts a general **runtime** `indices`\ntensor and\nreturns the `data` (operand) shape unchanged, so the dynamic case needs\nno new\nop and introduces no symbolic dimensions — only the index grid is built\nin-graph instead of in NumPy.\n\nFor runtime starts, the converter builds the index grid per axis `a`\n(rank is\nstatically known from the operand/update shapes):\n\n- clamp the start to `[0, operand_dim - update_dim]` with\n`relax.op.maximum` /\n`relax.op.minimum` — StableHLO clamps out-of-range starts rather than\nerroring;\n- `idx \u003d arange(update_dim) + clamped_start`;\n- reshape `idx` to broadcast on axis `a` and `broadcast_to` the update\nshape;\n- `expand_dims` a trailing index axis.\n\n`concat` over the axes produces an int64 index tensor of shape\n`(*update_shape, rank)`, which is fed to the same\n`relax.op.scatter_nd(operand, indices, update, \"update\")` call the\nstatic path\nuses.\n\nThe static (constant-start) path is unchanged, including its\ncompile-time\nout-of-bounds rejection.\n\n## Operator Support\n\n| Operator | TFLite inputs | Relax lowering | Supported subset |\n|---|---|---|---|\n| `STABLEHLO_DYNAMIC_UPDATE_SLICE` | `operand`, `update`, N scalar\n`start` indices | `relax.op.scatter_nd` with a NumPy index grid\n(constant starts) or an in-graph `arange` + clamp index grid (runtime\nstarts) | static operand/update shapes; constant or runtime start\nindices |\n\n## Not Included\n\n- Dynamic (non-static) operand or update shapes — the index grid is\nbuilt from\nthe statically known update shape, so operand/update shapes must be\nstatic.\nRuntime *start indices* are supported; runtime *tensor shapes* are not.\n\n## Tests\n\nThe dynamic-start test compiles the imported module and runs it on the\nRelax VM,\ncomparing the output against a NumPy reference; it includes an\nout-of-range start\nto exercise clamping. The static structural-equal and out-of-bounds\ntests are\nunchanged.\n\n| Test | Coverage |\n|---|---|\n| `test_stablehlo_dynamic_update_slice` | constant start indices,\nstructural-equal (existing) |\n| `test_stablehlo_dynamic_update_slice_dynamic_starts` | runtime start\nindices, compile + run, including an out-of-range start that is clamped\n|\n| `test_stablehlo_dynamic_update_slice_out_of_bounds_unsupported` |\nconstant-start path rejects out-of-bounds updates (existing) |\n\nLocal validation:\n\n```bash\npython -m ruff format --check \\\n  python/tvm/relax/frontend/tflite/tflite_frontend.py \\\n  tests/python/relax/test_frontend_tflite.py\n\npython -m ruff check \\\n  python/tvm/relax/frontend/tflite/tflite_frontend.py \\\n  tests/python/relax/test_frontend_tflite.py\n\npython -m pytest \\\n  tests/python/relax/test_frontend_tflite.py -k dynamic_update_slice -q\n\npython -m pytest \\\n  tests/python/relax/test_frontend_tflite.py -q\n```\n\nResult:\n\n```text\nruff format --check: 2 files already formatted\nruff check: All checks passed\ndynamic_update_slice tests: 3 passed, 555 deselected\nfull TFLite pytest: 558 passed\n```\n\n## References\n\n- Issue #19412 section B: `DYNAMIC_UPDATE_SLICE`\n- PR #19587: introduced `STABLEHLO_DYNAMIC_UPDATE_SLICE` (constant\nstarts) and\n  multi-subgraph / StableHLO region support"
    },
    {
      "commit": "f3f5a3e42a7ad5d1d26041717845d570ec6ad573",
      "tree": "ae2b99a2635f38895060f54160ecca8fe5bccad9",
      "parents": [
        "6ea9599c2ba86249a0dcd4ccb5e2b208fe06c61b"
      ],
      "author": {
        "name": "Tianqi Chen",
        "email": "tqchen@users.noreply.github.com",
        "time": "Thu Jun 25 13:29:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 13:29:10 2026 -0400"
      },
      "message": "[REFACTOR][RELAX] Rename Relax base type to AnyType (#19889)\n\nThis PR introduces Relax AnyType as the primary top/base type spelling,\nreplacing the previous ObjectType naming for the type that represents\nany Relax value.\n\nChanges:\n- Add AnyType/AnyTypeNode with relax.AnyType registration and keep\nObjectType/R.Object compatibility aliases.\n- Update Relax type analysis, type visitors, opaque function defaults,\nand script printer/parser handling to use AnyType/R.Any.\n- Migrate affected Python/C++ call sites, docs, and focused tests to the\nnew spelling.\n\nValidation:\n- cmake --build build --parallel 16\n- Focused Relax/TVMScript pytest: 704 passed, 1 xfailed\n- pre_commit run --files \u003cchanged files\u003e"
    }
  ],
  "next": "6ea9599c2ba86249a0dcd4ccb5e2b208fe06c61b"
}
