Skip to content

Commit eab9be8

Browse files
committed
[pmo] Fix load_borrow for strong control equivalence issues.
This entailed untangling a few issues. I have purposefully only fixed this for now for load_borrow to make the change in tree smaller (the reason for my splitting the code paths in a previous group of commits). I am going to follow up with a load copy version of the patch. I think that the code should be the same. The interesting part about this is that all of these code conditions are caught by the ownership verifier, suggesting to me that the code in the stdlib/overlays is simple enough that we didn't hit these code patterns. Anyways, the main change here is that we now eliminate control equivalence issues arising from @owned values that are not control equivalent being forwarded into aggregates and phis. This would cause our outer value to be destroyed early since we would be destroying it once for every time iteration in a loop. The way that this is done is that (noting that this is only for borrows today): * The AvailableValueAggregator always copies values at available value points to lifetime extend the values to the load block. In the load block, the aggregator will take the incoming values and borrow the value to form tuples, structs as needed. This new guaranteed aggregate is then copied. If we do not need to form an aggregate, we just copy. Since the copy is in our load block, we know that we can use it for our load_borrow. Importantly note how we no longer allow for these aggregates to forward owned ownership preventing the control equivalence problem above. * Since the aggregator may use the SSA updater if it finds multiple available values, we need to also make sure that any phis are strongly control equivalent on all of its incoming values. So we insert copies along those edges and then lifetime extend the phi as appropriate. * Since in all of the above all copy_value inserted by the available value aggregator are never consumed, we can just add destroy_values in the appropriate places and everything works.
1 parent c5c3c4e commit eab9be8

File tree

2 files changed

+914
-109
lines changed

2 files changed

+914
-109
lines changed

0 commit comments

Comments
 (0)