While optimizing the memory instruction, we sometimes need to add
offset to the value of IV. We could avoid doing so if the IV.next is
already defined at the point of interest. In this case, we may get two
possible advantages from this:
- If the IV step happens to match with the offset, we don't need to add the offset at all;
- We reduce overlap of live ranges of IV and IV.next. They may stop overlapping and it will lead to better register allocation. Even if the overlap will preserve, we are not introducing a new overlap, so it should be a neutral transform.
Currently I've only added support for IVs that get decremented using usub
intrinsic. We could also support AddInstr, however there is some weird
interaction with some other transform that may lead to infinite compilation
in this case (seems like same transform is done and undone over and over).
I need to investigate why it happens, but generally we could do that too.
Can you precommit the extraction of the lambda to a static function? The diff is confusing to read.