summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ADT/ilist.h30
-rw-r--r--llvm/include/llvm/Analysis/IVUsers.h11
2 files changed, 40 insertions, 1 deletions
diff --git a/llvm/include/llvm/ADT/ilist.h b/llvm/include/llvm/ADT/ilist.h
index 8f5e8810a1e..0f7b37b3765 100644
--- a/llvm/include/llvm/ADT/ilist.h
+++ b/llvm/include/llvm/ADT/ilist.h
@@ -161,6 +161,9 @@ template <class IntrusiveListT, class TraitsT>
class iplist_impl : public TraitsT, IntrusiveListT {
typedef IntrusiveListT base_list_type;
+protected:
+ typedef iplist_impl iplist_impl_type;
+
public:
typedef typename base_list_type::pointer pointer;
typedef typename base_list_type::const_pointer const_pointer;
@@ -192,6 +195,13 @@ private:
public:
iplist_impl() = default;
+ iplist_impl(iplist_impl &&X)
+ : TraitsT(std::move(X)), IntrusiveListT(std::move(X)) {}
+ iplist_impl &operator=(iplist_impl &&X) {
+ *static_cast<TraitsT *>(this) = std::move(X);
+ *static_cast<IntrusiveListT *>(this) = std::move(X);
+ return *this;
+ }
~iplist_impl() { clear(); }
// Miscellaneous inspection routines.
@@ -367,7 +377,19 @@ public:
/// there for a description of what's available.
template <class T, class... Options>
class iplist
- : public iplist_impl<simple_ilist<T, Options...>, ilist_traits<T>> {};
+ : public iplist_impl<simple_ilist<T, Options...>, ilist_traits<T>> {
+ typedef typename iplist::iplist_impl_type iplist_impl_type;
+
+public:
+ iplist() = default;
+ iplist(iplist &&X) : iplist_impl_type(std::move(X)) {}
+ iplist(const iplist &X) = delete;
+ iplist &operator=(iplist &&X) {
+ *static_cast<iplist_impl_type *>(this) = std::move(X);
+ return *this;
+ }
+ iplist &operator=(const iplist &X) = delete;
+};
/// An intrusive list with ownership and callbacks specified/controlled by
/// ilist_traits, with API that is unsafe for polymorphic types.
@@ -395,6 +417,12 @@ public:
insert(this->begin(), first, last);
}
+ ilist(ilist &&X) : base_list_type(std::move(X)) {}
+ ilist &operator=(ilist &&X) {
+ *static_cast<base_list_type *>(this) = std::move(X);
+ return *this;
+ }
+
// bring hidden functions into scope
using base_list_type::insert;
using base_list_type::push_front;
diff --git a/llvm/include/llvm/Analysis/IVUsers.h b/llvm/include/llvm/Analysis/IVUsers.h
index b208c027e45..e8777e0b38a 100644
--- a/llvm/include/llvm/Analysis/IVUsers.h
+++ b/llvm/include/llvm/Analysis/IVUsers.h
@@ -111,6 +111,17 @@ public:
IVUsers(Loop *L, AssumptionCache *AC, LoopInfo *LI, DominatorTree *DT,
ScalarEvolution *SE);
+ IVUsers(IVUsers &&X)
+ : L(std::move(X.L)), AC(std::move(X.AC)), DT(std::move(X.DT)),
+ SE(std::move(X.SE)), Processed(std::move(X.Processed)),
+ IVUses(std::move(X.IVUses)), EphValues(std::move(X.EphValues)) {
+ for (IVStrideUse &U : IVUses)
+ U.Parent = this;
+ }
+ IVUsers(const IVUsers &) = delete;
+ IVUsers &operator=(IVUsers &&) = delete;
+ IVUsers &operator=(const IVUsers &) = delete;
+
Loop *getLoop() const { return L; }
/// AddUsersIfInteresting - Inspect the specified Instruction. If it is a
OpenPOWER on IntegriCloud