8a2a109578e0da0d1f30189902d2b7a26f9d6af5
[oota-llvm.git] / include / llvm / IR / UseListOrder.h
1 //===- llvm/IR/UseListOrder.h - LLVM Use List Order -------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file has structures and command-line options for preserving use-list
11 // order.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_IR_USELISTORDER_H
16 #define LLVM_IR_USELISTORDER_H
17
18 #include "llvm/ADT/ArrayRef.h"
19 #include "llvm/ADT/SmallVector.h"
20 #include <vector>
21
22 namespace llvm {
23
24 class Module;
25 class Function;
26 class Value;
27
28 /// \brief Structure to hold a use-list shuffle vector.
29 ///
30 /// Stores most use-lists locally, but large use-lists use an extra heap entry.
31 /// Costs two fewer pointers than the equivalent \a SmallVector.
32 class UseListShuffleVector {
33   unsigned Size;
34   union {
35     unsigned *Ptr;
36     unsigned Array[6];
37   } Storage;
38
39   bool isSmall() const { return Size <= 6; }
40   unsigned *data() { return isSmall() ? Storage.Array : Storage.Ptr; }
41   const unsigned *data() const {
42     return isSmall() ? Storage.Array : Storage.Ptr;
43   }
44
45   void destroy() {
46     if (!isSmall())
47       delete[] Storage.Ptr;
48   }
49   void moveUnchecked(UseListShuffleVector &X) {
50     std::memcpy(this, &X, sizeof(UseListShuffleVector));
51     X.Size = 0;
52   }
53
54   UseListShuffleVector(const UseListShuffleVector &X) LLVM_DELETED_FUNCTION;
55   UseListShuffleVector &
56   operator=(const UseListShuffleVector &X) LLVM_DELETED_FUNCTION;
57
58 public:
59   UseListShuffleVector() : Size(0) {}
60   UseListShuffleVector(UseListShuffleVector &&X) { moveUnchecked(X); }
61   UseListShuffleVector &operator=(UseListShuffleVector &&X) {
62     destroy();
63     moveUnchecked(X);
64     return *this;
65   }
66   explicit UseListShuffleVector(size_t Size) : Size(Size) {
67     if (!isSmall())
68       Storage.Ptr = new unsigned[Size];
69   }
70   ~UseListShuffleVector() { destroy(); }
71
72   typedef unsigned *iterator;
73   typedef const unsigned *const_iterator;
74
75   size_t size() const { return Size; }
76   iterator begin() { return data(); }
77   iterator end() { return begin() + size(); }
78   const_iterator begin() const { return data(); }
79   const_iterator end() const { return begin() + size(); }
80   unsigned &operator[](size_t I) { return data()[I]; }
81   unsigned operator[](size_t I) const { return data()[I]; }
82 };
83
84 /// \brief Structure to hold a use-list order.
85 struct UseListOrder {
86   const Value *V;
87   const Function *F;
88   UseListShuffleVector Shuffle;
89
90   UseListOrder(const Value *V, const Function *F, size_t ShuffleSize)
91       : V(V), F(F), Shuffle(ShuffleSize) {}
92
93   UseListOrder() : V(0), F(0) {}
94   UseListOrder(UseListOrder &&X)
95       : V(X.V), F(X.F), Shuffle(std::move(X.Shuffle)) {}
96   UseListOrder &operator=(UseListOrder &&X) {
97     V = X.V;
98     F = X.F;
99     Shuffle = std::move(X.Shuffle);
100     return *this;
101   }
102
103 private:
104   UseListOrder(const UseListOrder &X) LLVM_DELETED_FUNCTION;
105   UseListOrder &operator=(const UseListOrder &X) LLVM_DELETED_FUNCTION;
106 };
107
108 typedef std::vector<UseListOrder> UseListOrderStack;
109
110 /// \brief Whether to preserve use-list ordering.
111 bool shouldPreserveBitcodeUseListOrder();
112 bool shouldPreserveAssemblyUseListOrder();
113
114 } // end namespace llvm
115
116 #endif