Unroll first and last iteration in encoding #399
Draft
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
We should probably introduce a flag to enable this behaviour. I wasn't able to easily implement this as a Viper to Viper transformation since unrolling the last loop iteration there isn't trivial: ideally the
while
isn't transformed away to let Carbon do the hard work of e.g. finding which local vars to havoc etc. but then the body must be repeated after thewhile
(unfolding the last loop iter, but Viper is unhappy since a local var might be redefined) and the loop condition must be changed to allow the last loop unrolling to be inserted.Also, why does the current Carbon encoding first
Assume(guard.not)
and only theninhale(invs)
. It doesn't actually matter, but looks strage to assume facts about a heap location and only then inhale the permissions for it.