Skip to content

SIL: introduce the vector_base_addr instruction and use it in InlineArray #81441

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
May 13, 2025

Conversation

eeckstein
Copy link
Contributor

The vector_base_addr instruction derives the address of the first element of a vector, i.e. a Builtin.FixedArray, from the address of the vector itself.
Addresses of other vector elements can then be derived with index_addr.

InlineArray used unsafe_addr_cast for this purpose. But this is blocking a number of optimizations.
Using vector_base_addr makes this vector->element projection explicit and optimizations can handle it correctly.
This also requires that the InlineArray._storage property (the actual Builtin.FixedArray) is correctly projected out of the InlineArray - instead of unsafe casting InlineArray itself to the element type.

@eeckstein
Copy link
Contributor Author

@swift-ci test

Copy link
Contributor

@aschwaighofer aschwaighofer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

eeckstein added 9 commits May 12, 2025 19:24
* `Type.isBuiltinFixedArray`
* `Type.builtinFixedArrayElementType`
The element type must be lowered. Otherwise it would crash for e.g. function types as element types.
It derives the address of the first element of a vector, i.e. a `Builtin.FixedArray`, from the address of the vector itself.
Addresses of other vector elements can then be derived with `index_addr`.
Add a `vectorBase` field kind which corresponds to `vector_base_addr`.
Also, improve `mayOverlap`: it didn't catch the case that the first element of a vector cannot overlap with another element.
This enables alias analysis and optimizations, like, redundant load elimination, to benefit from it.
Don't unsafe-cast from the InlineArray struct itself, but from `_storage` which is the actual array buffer.
This also requires making `_storage` a var.
Reimplement the simplification in swift and add a new transformation:
```
  %1 = unchecked_addr_cast %0 : $*Builtin.FixedArray<N, Element> to $*Element
```
->
```
  %1 = vector_base_addr %0 : $*Builtin.FixedArray<N, Element>
```
@eeckstein
Copy link
Contributor Author

@swift-ci test

@eeckstein eeckstein merged commit 66e07f0 into swiftlang:main May 13, 2025
5 checks passed
@eeckstein eeckstein deleted the vector_base_addr branch May 13, 2025 04:52
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.

3 participants