Skip to content
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

Optimizer: re-implement the RedundantLoadElimination pass in Swift #67395

Merged
merged 13 commits into from
Jul 21, 2023

Conversation

eeckstein
Copy link
Contributor

The new implementation has several benefits compared to the old C++ implementation:

  • It is significantly simpler. It optimizes each load separately instead of all at once with bit-field based dataflow.
  • It's using alias analysis more accurately which enables more loads to be optimized
  • It avoids inserting additional copies in OSSA

The algorithm is a data flow analysis which starts at the original load and searches for preceding stores or loads by following the control flow in backward direction.
The preceding stores and loads provide the "available values" with which the original load can be replaced.

This is the counterpart to the new implementation of dead-store elimination (#67122)

@eeckstein eeckstein requested a review from meg-gupta July 19, 2023 14:04
@eeckstein
Copy link
Contributor Author

@swift-ci test

@eeckstein
Copy link
Contributor Author

@swift-ci benchmark

@eeckstein eeckstein requested a review from atrick July 19, 2023 14:08
@eeckstein eeckstein force-pushed the redundant-load-elimination branch from 2f6415f to b9fb63b Compare July 20, 2023 18:59
@eeckstein
Copy link
Contributor Author

@swift-ci test

@eeckstein
Copy link
Contributor Author

@swift-ci benchmark

eeckstein added 13 commits July 21, 2023 07:19
…tore [assign]`

So far we unconditionally treated `store [assign]` to have side effects because it destructs the old value.
But we can do better by checking if the address in question actually can escape to a destructor.
…struction for a `yield` access base

A begin_apply can yield multiple addresses. We need to store the result of the apply in order to distinguish between two AccessBases with different results from the same begin_apply.
…e equivalent

This is possible now because projection path now models index-addressing correctly.
To make it available in other optimizations as well.
Also, a few problems:
* Use destructre instructions when in OSSA
* Don't split the store if it's nominal type has unreferenceable stoarge
* rename it to `trySplit` because it's not guaranteed to work

Also, add the counterpart for load instructions: `LoadInst.trySplit()`
The new implementation has several benefits compared to the old C++ implementation:

* It is significantly simpler. It optimizes each load separately instead of all at once with bit-field based dataflow.
* It's using alias analysis more accurately which enables more loads to be optimized
* It avoids inserting additional copies in OSSA

The algorithm is a data flow analysis which starts at the original load and searches for preceding stores or loads by following the control flow in backward direction.
The preceding stores and loads provide the "available values" with which the original load can be replaced.
@eeckstein eeckstein force-pushed the redundant-load-elimination branch from b9fb63b to 29246fd Compare July 21, 2023 05:22
@eeckstein
Copy link
Contributor Author

@swift-ci test

@eeckstein eeckstein merged commit b9d0aa3 into swiftlang:main Jul 21, 2023
@eeckstein eeckstein deleted the redundant-load-elimination branch July 21, 2023 11:58
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