[LoopInterchange] Turn into a loop pass.
authorFlorian Hahn <florian.hahn@arm.com>
Fri, 28 Sep 2018 09:45:50 +0000 (09:45 +0000)
committerFlorian Hahn <florian.hahn@arm.com>
Fri, 28 Sep 2018 09:45:50 +0000 (09:45 +0000)
commit0694c159f74da4ecf9363ace149cc8f95d08d576
treec8a25ff50da3b2e25a3aa8fb975e6faf8a53ba61
parent417ef40c3954f0a6fa13028e44962a69ee92513a
[LoopInterchange] Turn into a loop pass.

This patch turns LoopInterchange into a loop pass. It now only
considers top-level loops and tries to move the innermost loop to the
optimal position within the loop nest. By only looking at top-level
loops, we might miss a few opportunities the function pass would get
(e.g. if we have a loop nest of 3 loops, in the function pass
we might process loops at level 1 and 2 and move the inner most loop to
level 1, and then we process loops at levels 0, 1, 2 and interchange
again, because we now have a different inner loop). But I think it would
be better to handle such cases by picking the best inner loop from the
start and avoid re-visiting the same loops again.

The biggest advantage of it being a function pass is that it interacts
nicely with the other loop passes. Without this patch, there are some
performance regressions on AArch64 with loop interchanging enabled,
where no loops were interchanged, but we missed out on some other loop
optimizations.

It also removes the SimplifyCFG run. We are just changing branches, so
the CFG should not be more complicated, besides the additional 'unique'
preheaders this pass might create.

Reviewers: chandlerc, efriedma, mcrosier, javed.absar, xbolva00

Reviewed By: xbolva00

Differential Revision: https://reviews.llvm.org/D51702

llvm-svn: 343308
llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
llvm/lib/Transforms/Scalar/LoopInterchange.cpp