[llvm-commits] [llvm] r93400 - in /llvm/trunk: include/llvm/Metadata.h lib/VMCore/Metadata.cpp
Chris Lattner
clattner at apple.com
Fri Jan 15 14:58:45 PST 2010
On Jan 13, 2010, at 5:45 PM, Victor Hernandez wrote:
> Author: hernande
> Date: Wed Jan 13 19:45:14 2010
> New Revision: 93400
>
> URL: http://llvm.org/viewvc/llvm-project?rev=93400&view=rev
> Log:
> Add MDNode::getFunction(), which figures out the metadata's
> function, if it has function that it is local to.
Ok.
> +++ llvm/trunk/lib/VMCore/Metadata.cpp Wed Jan 13 19:45:14 2010
> @@ -121,6 +121,40 @@
> Op->~MDNodeOperand();
> }
>
> +static Function *getFunctionHelper(const MDNode *N,
> + SmallPtrSet<const MDNode *, 32>
> &Visited) {
> + assert(N->isFunctionLocal() && "Should only be called on function-
> local MD");
> + Function *F = NULL;
You don't need F here except in the MDNode case. All the other cases
should just "return BB->getParent();" for example. This allows you to
unnest the "else if"s into a series of "if"s.
Also, function mdnodes can never be cyclic, why do you need the
smallptrset?
-Chris
> + // Only visit each MDNode once.
> + if (!Visited.insert(N)) return F;
> +
> + for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
> + Value *V = N->getOperand(i);
> + if (!V) continue;
> + if (Instruction *I = dyn_cast<Instruction>(V))
> + F = I->getParent()->getParent();
> + else if (BasicBlock *BB = dyn_cast<BasicBlock>(V))
> + F = BB->getParent();
> + else if (Argument *A = dyn_cast<Argument>(V))
> + F = A->getParent();
> + else if (MDNode *MD = dyn_cast<MDNode>(V))
> + if (MD->isFunctionLocal())
> + F = getFunctionHelper(MD, Visited);
> + if (F) break;
> + }
> +
> + return F;
> +}
> +
> +// getFunction - If this metadata is function-local and recursively
> has a
> +// function-local operand, return the first such operand's parent
> function.
> +// Otherwise, return null.
> +Function *MDNode::getFunction() const {
> + if (!isFunctionLocal()) return NULL;
> + SmallPtrSet<const MDNode *, 32> Visited;
> + return getFunctionHelper(this, Visited);
> +}
> +
> // destroy - Delete this node. Only when there are no uses.
> void MDNode::destroy() {
> setValueSubclassData(getSubclassDataFromValue() | DestroyFlag);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list