/// it. Takes ownership of the temporary node.
template <class T>
static typename std::enable_if<std::is_base_of<MDNode, T>::value, T *>::type
- replaceWithUniqued(std::unique_ptr<T, TempMDNodeDeleter> N);
+ replaceWithUniqued(std::unique_ptr<T, TempMDNodeDeleter> N) {
+ return cast<T>(N.release()->replaceWithUniquedImpl());
+ }
/// \brief Replace a temporary node with a distinct one.
///
/// it. Takes ownership of the temporary node.
template <class T>
static typename std::enable_if<std::is_base_of<MDNode, T>::value, T *>::type
- replaceWithDistinct(std::unique_ptr<T, TempMDNodeDeleter> N);
+ replaceWithDistinct(std::unique_ptr<T, TempMDNodeDeleter> N) {
+ return cast<T>(N.release()->replaceWithDistinctImpl());
+ }
+
+private:
+ MDNode *replaceWithUniquedImpl();
+ MDNode *replaceWithDistinctImpl();
protected:
/// \brief Set an operand.
static MDNode *getMostGenericRange(MDNode *A, MDNode *B);
};
-template <class NodeTy>
-typename std::enable_if<std::is_base_of<MDNode, NodeTy>::value, NodeTy *>::type
-MDNode::replaceWithUniqued(std::unique_ptr<NodeTy, TempMDNodeDeleter> Node) {
- // Try to uniquify in place.
- MDNode *UniquedNode = Node->uniquify();
- if (UniquedNode == Node.get()) {
- Node->makeUniqued();
- return Node.release();
- }
-
- // Collision, so RAUW instead.
- Node->replaceAllUsesWith(UniquedNode);
- return cast<NodeTy>(UniquedNode);
-}
-
-template <class NodeTy>
-typename std::enable_if<std::is_base_of<MDNode, NodeTy>::value, NodeTy *>::type
-MDNode::replaceWithDistinct(std::unique_ptr<NodeTy, TempMDNodeDeleter> Node) {
- Node->makeDistinct();
- return Node.release();
-}
-
/// \brief Tuple of metadata.
///
/// This is the simple \a MDNode arbitrary tuple. Nodes are uniqued by
}
}
+MDNode *MDNode::replaceWithUniquedImpl() {
+ // Try to uniquify in place.
+ MDNode *UniquedNode = uniquify();
+ if (UniquedNode == this) {
+ makeUniqued();
+ return this;
+ }
+
+ // Collision, so RAUW instead.
+ replaceAllUsesWith(UniquedNode);
+ deleteAsSubclass();
+ return UniquedNode;
+}
+
+MDNode *MDNode::replaceWithDistinctImpl() {
+ makeDistinct();
+ return this;
+}
+
void MDTuple::recalculateHash() {
setHash(MDTupleInfo::KeyTy::calculateHash(this));
}