[IR] Give catchret an optional 'return value' operand
[oota-llvm.git] / include / llvm / IR / UseListOrder.h
index c56d1cac617b0a045fecf5a9a5510c319f3226ab..b7c2418d348da2f44fb29c0bbdc91a6fed3fca7e 100644 (file)
@@ -1,4 +1,4 @@
-//===- llvm/IR/UseListOrder.h - LLVM Use List Order functions ---*- C++ -*-===//
+//===- llvm/IR/UseListOrder.h - LLVM Use List Order -------------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,8 +7,8 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This file has functions to modify the use-list order and to verify that it
-// doesn't change after serialization.
+// This file has structures and command-line options for preserving use-list
+// order.
 //
 //===----------------------------------------------------------------------===//
 
@@ -25,77 +25,31 @@ class Module;
 class Function;
 class Value;
 
-/// \brief Structure to hold a use-list shuffle vector.
-///
-/// Stores most use-lists locally, but large use-lists use an extra heap entry.
-/// Costs two fewer pointers than the equivalent \a SmallVector.
-class UseListShuffleVector {
-  unsigned Size;
-  union {
-    unsigned *Ptr;
-    unsigned Array[6];
-  } Storage;
-
-  bool isSmall() const { return Size <= 6; }
-  unsigned *data() { return isSmall() ? Storage.Array : Storage.Ptr; }
-  const unsigned *data() const {
-    return isSmall() ? Storage.Array : Storage.Ptr;
-  }
-
-public:
-  UseListShuffleVector() : Size(0) {}
-  UseListShuffleVector(UseListShuffleVector &&X) {
-    std::memcpy(this, &X, sizeof(UseListShuffleVector));
-    X.Size = 0;
-  }
-  UseListShuffleVector(const UseListShuffleVector &X) {
-    std::memcpy(this, &X, sizeof(UseListShuffleVector));
-    if (!isSmall()) {
-      Storage.Ptr = new unsigned[Size];
-      std::memcpy(Storage.Ptr, X.Storage.Ptr, Size * sizeof(*Storage.Ptr));
-    }
-  }
-  explicit UseListShuffleVector(size_t Size) : Size(Size) {
-    if (!isSmall())
-      Storage.Ptr = new unsigned[Size];
-  }
-  ~UseListShuffleVector() {
-    if (!isSmall())
-      delete[] Storage.Ptr;
-  }
-
-  typedef unsigned *iterator;
-  typedef const unsigned *const_iterator;
-
-  size_t size() const { return Size; }
-  iterator begin() { return data(); }
-  iterator end() { return begin() + size(); }
-  const_iterator begin() const { return data(); }
-  const_iterator end() const { return begin() + size(); }
-  unsigned &operator[](size_t I) { return data()[I]; }
-  unsigned operator[](size_t I) const { return data()[I]; }
-};
-
 /// \brief Structure to hold a use-list order.
 struct UseListOrder {
   const Value *V;
   const Function *F;
-  UseListShuffleVector Shuffle;
+  std::vector<unsigned> Shuffle;
 
   UseListOrder(const Value *V, const Function *F, size_t ShuffleSize)
       : V(V), F(F), Shuffle(ShuffleSize) {}
-};
 
-typedef std::vector<UseListOrder> UseListOrderStack;
+  UseListOrder() : V(0), F(0) {}
+  UseListOrder(UseListOrder &&X)
+      : V(X.V), F(X.F), Shuffle(std::move(X.Shuffle)) {}
+  UseListOrder &operator=(UseListOrder &&X) {
+    V = X.V;
+    F = X.F;
+    Shuffle = std::move(X.Shuffle);
+    return *this;
+  }
 
-/// \brief Whether to preserve use-list ordering.
-bool shouldPreserveBitcodeUseListOrder();
-bool shouldPreserveAssemblyUseListOrder();
+private:
+  UseListOrder(const UseListOrder &X) = delete;
+  UseListOrder &operator=(const UseListOrder &X) = delete;
+};
 
-/// \brief Shuffle all use-lists in a module.
-///
-/// Adds \c SeedOffset to the default seed for the random number generator.
-void shuffleUseLists(Module &M, unsigned SeedOffset = 0);
+typedef std::vector<UseListOrder> UseListOrderStack;
 
 } // end namespace llvm