Skip to content

Fix OverwritesInput metadata for ops that allocate new values#580

Open
eric wants to merge 1 commit intogorgonia:masterfrom
fancybits:fix-overwrites-input-metadata
Open

Fix OverwritesInput metadata for ops that allocate new values#580
eric wants to merge 1 commit intogorgonia:masterfrom
fancybits:fix-overwrites-input-metadata

Conversation

@eric
Copy link
Copy Markdown

@eric eric commented Mar 15, 2026

transposeOp, reshapeOp, maxOp, and sumOp all declared OverwritesInput() == 0 and ReturnsPtr() == true, telling the register allocator they modify their input in-place. In reality, their Do() methods allocate new values:

  • transposeOp.Do() calls tensor.Transpose() which allocates via SafeT
  • reshapeOp.Do() calls ShallowClone() creating a new tensor header
  • maxOp/sumOp.Do() call reductionDo() which returns new tensors

This mismatch caused the register allocator to share input/output registers for these ops. While not currently causing failures (the liveness analysis prevents reuse of live registers), it violates the OverwritesInput contract and could amplify future liveness bugs.

Ops that correctly declare OverwritesInput >= 0 are unchanged:

  • elemBinOp: has UsePreallocDo that writes into preallocated memory
  • elemUnaryOp: has UnsafeDo that modifies in-place
  • repeatOp: has UsePreallocDo + CallsExtern=true
  • sliceIncrOp: has UsePreallocDo + CallsExtern=true

transposeOp, reshapeOp, maxOp, and sumOp all declared
OverwritesInput() == 0 and ReturnsPtr() == true, telling the register
allocator they modify their input in-place. In reality, their Do()
methods allocate new values:

- transposeOp.Do() calls tensor.Transpose() which allocates via SafeT
- reshapeOp.Do() calls ShallowClone() creating a new tensor header
- maxOp/sumOp.Do() call reductionDo() which returns new tensors

This mismatch caused the register allocator to share input/output
registers for these ops. While not currently causing failures (the
liveness analysis prevents reuse of live registers), it violates the
OverwritesInput contract and could amplify future liveness bugs.

Ops that correctly declare OverwritesInput >= 0 are unchanged:
- elemBinOp: has UsePreallocDo that writes into preallocated memory
- elemUnaryOp: has UnsafeDo that modifies in-place
- repeatOp: has UsePreallocDo + CallsExtern=true
- sliceIncrOp: has UsePreallocDo + CallsExtern=true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant