[PM] Port LoopSink to the new pass manager.
authorChandler Carruth <chandlerc@gmail.com>
Fri, 20 Jan 2017 08:42:19 +0000 (08:42 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Fri, 20 Jan 2017 08:42:19 +0000 (08:42 +0000)
commite9b18e3d34f3dbea1649c6633b11d99eda798ec2
treedb288feed81512f73fd98c6895231625ac1b4524
parent1725c8c3157fab096e7e821d2bb10b9b1fd0d773
[PM] Port LoopSink to the new pass manager.

Like several other loop passes (the vectorizer, etc) this pass doesn't
really fit the model of a loop pass. The critical distinction is that it
isn't intended to be pipelined together with other loop passes. I plan
to add some documentation to the loop pass manager to make this more
clear on that side.

LoopSink is also different because it doesn't really need a lot of the
infrastructure of our loop passes. For example, if there aren't loop
invariant instructions causing a preheader to exist, there is no need to
form a preheader. It also doesn't need LCSSA because this pass is
only involved in sinking invariant instructions from a preheader into
the loop, not reasoning about live-outs.

This allows some nice simplifications to the pass in the new PM where we
can directly walk the loops once without restructuring them.

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

llvm-svn: 292589
llvm/include/llvm/Transforms/Scalar/LoopSink.h [new file with mode: 0644]
llvm/lib/Passes/PassBuilder.cpp
llvm/lib/Passes/PassRegistry.def
llvm/lib/Transforms/Scalar/LoopSink.cpp
llvm/test/Transforms/LICM/loopsink.ll
llvm/test/Transforms/LICM/sink.ll