Skip to content

[Tracking Issue][TFlite] Expand Missing / Partial Operator Coverage #19412

Open

Description

@tlopex

Background

Excited to see the huge progress the community has made on the Relax TFLite frontend recently — many operators and tests have landed in the last few weeks. To keep pushing this forward, this issue tracks the remaining operator gap so contributors can pick up well-scoped items in parallel.

A. Good-first-issues — drop-in mappings

Workflow: add a handler, wire into convert_map (alphabetical within its region), add one verify(TestClass, Expected) test in tests/python/relax/test_frontend_tflite.py (pattern at L55). All target Relax ops already exist — no new op work needed.

  • CUMSUM → relax.op.cumsum
  • UNIQUE → relax.op.unique
  • SCATTER_ND → relax.op.scatter_nd
  • BROADCAST_TO → relax.op.broadcast_to
  • SIGN → relax.op.sign
  • BITWISE_XOR → relax.op.bitwise_xor
  • RIGHT_SHIFT → relax.op.right_shift
  • BUCKETIZE → relax.op.bucketize
  • EMBEDDING_LOOKUP → relax.op.take
  • SELECT_V2 → relax.op.where
  • RELU_0_TO_1 → relax.op.clip
  • NON_MAX_SUPPRESSION_V4 → port from existing convert_nms_v5

B. Medium — may need new Relax op or non-trivial decomposition

Prefer composing with existing Relax ops over adding a new op. Only register a new relax.op.* when the semantics genuinely cannot be expressed by existing primitives (e.g. random generators, bit-level reinterpret). If a decomposition using existing ops is feasible, go with that — it's a smaller PR and avoids bloating the op set.

  • REDUCE_ANY — commented at tflite_frontend.py:198; can be lowered to relax.op.max on a bool tensor, no new op needed
  • REDUCE_ALL — same, lower to relax.op.min on bool
  • RANK — emit relax.const(ndim) for static shapes; no op call needed
  • ATAN2 — compose from atan + sign + where, or add relax.op.atan2 for a cleaner impl
  • SEGMENT_SUM — reuse relax.op.scatter_nd with reduction="add" (TFLite requires sorted segment ids)
  • UNSORTED_SEGMENT_SUM — scatter_nd(reduction="add")
  • UNSORTED_SEGMENT_MAX — scatter_nd(reduction="max")
  • UNSORTED_SEGMENT_MIN — scatter_nd(reduction="min")
  • UNSORTED_SEGMENT_PROD — scatter_nd(reduction="mul")
  • DYNAMIC_UPDATE_SLICE — reuse relax.op.slice_scatter
  • DILATE — likely needs a new op (or decompose via pad + strided_slice)
  • MULTINOMIAL — wrap existing relax.op.multinomial_from_uniform; blocked on RANDOM_UNIFORM
  • RANDOM_STANDARD_NORMAL — needs a new random-generator op in Relax
  • RANDOM_UNIFORM — same
  • BITCAST — needs a new reinterpret/view op
  • BROADCAST_ARGS — shape-level computation; consider static-shape-only path first

C. Fix partial implementations

These ops are already in convert_map but their handler raises OpNotImplemented on certain input patterns, making them unusable on real models that hit those patterns.

  • RANGE — handler raises on dynamic scalar inputs (tflite_frontend.py:958); should lower to relax.op.arange.
  • FILL — handler raises when dims is non-constant (L1729); should lower to relax.op.full with a dynamic shape
  • SPLIT_V — handler raises when size_splits is non-constant (L2267); decompose into dynamic strided slices.
  • NON_MAX_SUPPRESSION_V5 — handler raises on soft-NMS (L3546); needs soft_nms_sigma != 0 support
  • FAKE_QUANT — handler raises on some narrow-range vector configs (L3913)

Contributor workflow

  1. Claim an item by commenting on this issue before starting, so we avoid duplicated work.
  2. Read a recent reference PR for handler + test style.
  3. Add the handler, register in convert_map (alphabetical within its region).
  4. Add a structural-equal test following the verify(TestClass, Expected) pattern (test_frontend_tflite.py:55). Nightly-gated E2E activates automatically via CI_ENV_NIGHTLY.
  5. Tag the PR title [Relax][Frontend][TFLite].

cc @leandron

Activity

  1. swjng commented on Apr 17, 2026

    @swjng
    Contributor

    Claiming B: REDUCE_ANY and REDUCE_ALL — will lower to relax.op.max / relax.op.min on a bool tensor as suggested, and bundle them into a single PR.

  2. Aharrypotter commented on Apr 17, 2026

    @Aharrypotter
    Contributor

    Hi @tlopex , I'd like to claim NON_MAX_SUPPRESSION_V5 under "Fix partial implementations" to add support for soft_nms_sigma != 0. I will open a PR with the implementation and tests soon.

  3. Dayuxiaoshui commented on Apr 19, 2026

    @Dayuxiaoshui
    Contributor

    Hi @tlopex, I'd like to claim the following tasks:
    A. Good-first-issues:
    BITWISE_XOR → relax.op.bitwise_xor
    RIGHT_SHIFT → relax.op.right_shift
    RELU_0_TO_1 → relax.op.clip
    B. Medium:
    RANK — will emit relax.const for static shapes
    UNSORTED_SEGMENT_MAX — will use relax.op.scatter_nd with reduction="max"
    I'll open PRs for these implementations soon.

  4. Aharrypotter commented on Apr 19, 2026

    @Aharrypotter
    Contributor

    Hi @tlopex , I'd like to claim FILL and SPLIT_V under "Fix partial implementations" . I will open a PR with the implementation and tests soon.

  5. Peruere1828 commented on Apr 23, 2026

    @Peruere1828
    Contributor

    Hi @tlopex , I'd like to claim CUMSUM under "A. Good-first-issues". I will open a PR with the implementation and test soon.

  6. 0xjah commented on Apr 24, 2026

    @0xjah
    Contributor

    Hi @tlopex I’d claim FAKE_QUANT and RANGE in one pr and from A UNIQUE , BUCKETIZE and SIGN

  7. rknastenka commented on Apr 25, 2026

    @rknastenka
    Contributor

    HI @tlopex,, i'd like to work on SCATTER_ND, BROADCAST_TO, EMBEDDING_LOOKUP and SELECT_V2

  8. snigenigmatic commented on Apr 25, 2026

    @snigenigmatic

    Hi @tlopex , I’d like to work on UNSORTED_SEGMENT_SUM under the medium category. I’ll submit a PR with implementation and tests soon. Please let me know if it’s already being worked on.

  9. 23 remaining items

  10. Aharrypotter commented on May 1, 2026

    @Aharrypotter
    Contributor

    Hi @tlopex, I'd like to claim the remaining unclaimed segment ops under section B: SEGMENT_SUM, UNSORTED_SEGMENT_MIN, and UNSORTED_SEGMENT_PROD. All three lower to relax.op.scatter_nd and will be in one PR.

    Hey @as4230, my bad! Looks like we commented pretty close to each other. I had the tab open without refreshing, and I didn't double-check the thread after I posted, so I totally missed your claim.

    I actually already finished the code and tests for this batch locally. Would you mind if I just submit the PR since it's ready to go?

    If you'd prefer to handle it yourself though, no worries at all! Sorry for the overlap.

  11. as4230 commented on May 1, 2026

    @as4230
    Contributor

    @Aharrypotter All good, it happens. If everything's ready then go ahead and get the PR in.

  12. Aharrypotter commented on Jun 17, 2026

    @Aharrypotter
    Contributor

    Hi @tlopex, I’d like to help close out the remaining unmerged items in this tracking issue.

    I noticed a few of the unchecked items were claimed back in April, but I could not find corresponding merged PRs for them, and the issue has been quiet for several weeks. To avoid leaving the tracking issue stalled, I plan to work on the remaining gaps in one cleanup PR:

    • UNIQUE, SIGN, BITWISE_XOR, RIGHT_SHIFT, BUCKETIZE, RELU_0_TO_1
    • RANK, UNSORTED_SEGMENT_SUM, UNSORTED_SEGMENT_MAX
    • RANGE dynamic scalar inputs and FAKE_QUANT narrow_range/vector coverage
    • DYNAMIC_UPDATE_SLICE status cleanup, depending on the current TFLite schema support

    If anyone is already actively working on any of these, happy to coordinate or drop that part.

  13. Aharrypotter commented on Jun 24, 2026

    @Aharrypotter
    Contributor

    Hi @tlopex, I’d like to help close out the remaining unmerged items in this tracking issue.

    I noticed a few of the unchecked items were claimed back in April, but I could not find corresponding merged PRs for them, and the issue has been quiet for several weeks. To avoid leaving the tracking issue stalled, I plan to work on the remaining gaps in one cleanup PR:

    • UNIQUE, SIGN, BITWISE_XOR, RIGHT_SHIFT, BUCKETIZE, RELU_0_TO_1
    • RANK, UNSORTED_SEGMENT_SUM, UNSORTED_SEGMENT_MAX
    • RANGE dynamic scalar inputs and FAKE_QUANT narrow_range/vector coverage
    • DYNAMIC_UPDATE_SLICE status cleanup, depending on the current TFLite schema support

    If anyone is already actively working on any of these, happy to coordinate or drop that part.

    Hi @tlopex — following up on my earlier comment. I went back through the remaining unchecked boxes; with the PRs below, all of them are now addressed. Quick status:

    A. Good-first-issues — all landed & tested

    B. Medium — all landed & tested

    C. Fix partial implementations

    Both dynamic-input items fit cleanly in the frontend: RANGE via tensor_to_shape + match_cast, DYNAMIC_UPDATE_SLICE via scatter_nd with runtime indices. No new Relax op was needed.

    Suggest closing this issue once #19881 merges. Please let me know if I've mischaracterized anything.

  14. cchung100m commented on Aug 21, 2026

    @cchung100m
    Contributor

    Hi @tlopex

    Thanks for the summary. I noticed that RANK, UNSORTED_SEGMENT_SUM, UNSORTED_SEGMENT_MAX, and FAKE_QUANT are resolved by #19813.

  15. goyaladitya05 commented on Oct 13, 2026

    @goyaladitya05

    Hi @tlopex, I'm working on DYNAMIC_UPDATE_SLICE.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions