This is a verbatim move except for expanded comment before the class,
the new assert in the constructor and some clang-format fixes due to the
changed indentation level in the function defs.
The class will obviously need improvement down the road. For one, there
is no reason that addPHINodes would have to be exposed like that. I
will make this and other improvements in follow-up patches.
The main goal is to be able to share this functionality. The
LoopLoadElimination pass I am working on needs it too. Later we can
move other clients as well (LV and Ashutosh's LICMVer).