[PATCH] Add control dependence computation that computes control dependence equivalence classes.
Daniel Berlin
dberlin at dberlin.org
Mon Apr 20 12:14:12 PDT 2015
I'll also rename it to ControlDependenceEquivalence.
On Tue, Apr 14, 2015 at 7:41 AM, Chandler Carruth <chandlerc at gmail.com> wrote:
> I can't comment on the algorithmic side, but am happy to review the basic code.
>
> First comment would be that if this is really only providing equivalence classes, it should be named appropriately. Probably ControlDependenceEquivalence or some such. Do that last though so the in-line comments aren't lost.
>
>
> ================
> Comment at: include/llvm/Analysis/ControlDependence.h:9-12
> @@ +8,6 @@
> +//===----------------------------------------------------------------------===//
> +// \file
> +// \brief Determines control dependence equivalence classes for basic
> +// blocks. Any two blocks having the same set of control dependences land in one
> +// class.
> +// ===---------------------------------------------------------------------===//
> ----------------
> You need three '/'s for the doxygen stuff.
>
> ================
> Comment at: include/llvm/Analysis/ControlDependence.h:59-64
> @@ +58,8 @@
> +
> + /// \brief Return the control dependence class number for \p BB. All basic
> + /// blocks with the same class number have the same control dependences
> + unsigned getClassNumber(BasicBlock *BB) {
> + assert(Computed && "Trying to get equivalence classes before computation");
> + return BlockInfo[BB].ClassNumber;
> + }
> +
> ----------------
> Is 'unsigned' enough? (I can believe it is, I just want to surface the question.)
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:21-24
> @@ +20,6 @@
> +using namespace llvm;
> +char ControlDependence::ID = 0;
> +#define DEBUG_TYPE "controlequiv"
> +INITIALIZE_PASS(ControlDependence, "controldep",
> + "Control Dependence Construction", true, true);
> +
> ----------------
> Why are these jammed in here with headers and usings?
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:29
> @@ +28,3 @@
> +// numbers for all participating blocks. Takes O(E) time and O(N) space.
> +
> +bool ControlDependence::runOnFunction(Function &F) {
> ----------------
> Weird whitspace...
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:122-134
> @@ +121,15 @@
> + // and preorder-visit
> + if (PredData.OnStack) {
> + DEBUG(dbgs() << "Maybe visit pred backedge\n");
> + if (Pred != Entry.ParentBlock) {
> + BlockInfo[B].Backedges.push_back(Pred);
> + visitBackedge(B, Pred, PredDirection);
> + }
> +
> + } else {
> + BlockInfo[B].Children.push_back(Pred);
> + pushDFS(Stack, Pred, B, PredDirection);
> + visitPre(Pred);
> + }
> + continue;
> + }
> ----------------
> This looks like it could be cleaned up with early-continue patterns.
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:200-201
> @@ +199,4 @@
> + combined_succ_end(B, BlockResultData.FakeSuccEdges), From, B});
> +}
> +/// \brief Pop an entry from the DFS stack.
> +void ControlDependence::popDFS(DFSStack &Stack, const BasicBlock *B) {
> ----------------
> Missing vertical whitespace.
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:260-261
> @@ +259,4 @@
> + BII = Info.BracketIterators.erase(BII);
> + } else
> + ++BII;
> + }
> ----------------
> Keep braces symmetric.
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:311-321
> @@ +310,13 @@
> + else {
> + // Get the min and the max through our children
> + auto hi1iter = std::min_element(
> + Info.Children.begin(), Info.Children.end(),
> + [this](const BasicBlock *A, const BasicBlock *B) {
> + return BlockInfo[A].DFSNumber < BlockInfo[B].DFSNumber;
> + });
> + auto hi2iter = std::max_element(
> + Info.Children.begin(), Info.Children.end(),
> + [this](const BasicBlock *A, const BasicBlock *B) {
> + return BlockInfo[A].DFSNumber < BlockInfo[B].DFSNumber;
> + });
> + Hi1 = *hi1iter;
> ----------------
> Variable naming: Hi1Iter
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:376-377
> @@ +375,4 @@
> + DEBUG(dbgs() << "Assigned class number is " << Info.ClassNumber << "\n");
> +}
> +void ControlDependence::visitPost(const BasicBlock *B,
> + const BasicBlock *ParentBlock,
> ----------------
> Again, missing whitespace.
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:390-402
> @@ +389,15 @@
> +
> + // By the time we hit this node, we are guaranteed these iterators will point
> + // into our list, because it must have been spliced into us.
> + for (auto BII = Info.BracketIterators.begin(),
> + BIE = Info.BracketIterators.end();
> + BII != BIE;) {
> + BracketList::iterator &BLI = *BII;
> + Bracket &BR = *BLI;
> + if (BR.To == B && BR.Direction != Direction) {
> + Info.BList.erase(BLI);
> + BII = Info.BracketIterators.erase(BII);
> + } else
> + ++BII;
> + }
> +
> ----------------
> This code seems completely duplicated with the above?
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:410
> @@ +409,3 @@
> + BracketList &ParentBList = BlockInfo[ParentBlock].BList;
> + // TODO
> + ParentBList.splice(ParentBList.end(), BList);
> ----------------
> TODO what?
>
> ================
> Comment at: lib/Analysis/ControlDependence.cpp:433-434
> @@ +432,4 @@
> + BlockInfo[To].BracketIterators.push_back(Place);
> +}
> +FunctionPass *llvm::createControlDependencePass() {
> + return new ControlDependence();
> ----------------
> Missing whitespace.
>
> http://reviews.llvm.org/D8568
>
> EMAIL PREFERENCES
> http://reviews.llvm.org/settings/panel/emailpreferences/
>
>
More information about the llvm-commits
mailing list