[PATCH] [LCSSA] Handle PHI insertion in disjoint loops
Chandler Carruth
chandlerc at gmail.com
Mon Dec 22 11:28:59 PST 2014
One totally nit-picky comment, and one substantial comment. Feel free to commit once addressed.
================
Comment at: lib/Transforms/Utils/LCSSA.cpp:144-146
@@ -134,1 +143,5 @@
+ // LoopSimplify gets improved.
+ Loop *OtherLoop = LI->getLoopFor(ExitBB);
+ if (OtherLoop && !L.contains(OtherLoop))
+ PostProcessPHIs.push_back(PN);
}
----------------
I would write this as:
if (auto OtherLoop = LI->getLoopFor(ExitBB))
if (!L.contains(OtherLoop))
PostProcessPHIs.push_back(PN)
================
Comment at: lib/Transforms/Utils/LCSSA.cpp:177-181
@@ +176,7 @@
+ continue;
+ for (unsigned j = 0, ee = PostProcessPHIs.size(); j != ee; ++j)
+ if (PostProcessPHIs[j] == AddedPHIs[i]) {
+ PostProcessPHIs.erase(PostProcessPHIs.begin()+j);
+ break;
+ }
+ AddedPHIs[i]->eraseFromParent();
----------------
Ow. This is quadratic in all cases AFAICT. Either we move all remaining elements in PostProcessPHIs down a slot, or we skip over an element in every trip throuh AddedPHIs (AddedPHIs is a superset and ordered the same).
Instead of all this, how about we do the post processing first, and then this loop? You can add a similar guard to skip post processing of phis with empty use lists. That avoids all the complexity here.
http://reviews.llvm.org/D6624
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
More information about the llvm-commits
mailing list