[llvm] r220649 - [PBQP] Re-commit r220642 with a workaround for quirky Visual Studio behavior.

Lang Hames lhames at gmail.com
Sun Oct 26 13:57:16 PDT 2014


Author: lhames
Date: Sun Oct 26 15:57:16 2014
New Revision: 220649

URL: http://llvm.org/viewvc/llvm-project?rev=220649&view=rev
Log:
[PBQP] Re-commit r220642 with a workaround for quirky Visual Studio behavior.

Apparently unique_ptr'ifying NodeMetadata exposed an issue in VS where it
occasionally tries to synthesize copy constructors instead of moves. Hopefully
explicitly deleting the copy constructor and defining the move constructor will
fix this.

Modified:
    llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h

Modified: llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h?rev=220649&r1=220648&r2=220649&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h (original)
+++ llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h Sun Oct 26 15:57:16 2014
@@ -62,20 +62,15 @@ public:
     delete[] ColCounts;
   }
 
-  ~MatrixMetadata() {
-    delete[] UnsafeRows;
-    delete[] UnsafeCols;
-  }
-
   unsigned getWorstRow() const { return WorstRow; }
   unsigned getWorstCol() const { return WorstCol; }
-  const bool* getUnsafeRows() const { return UnsafeRows; }
-  const bool* getUnsafeCols() const { return UnsafeCols; }
+  const bool* getUnsafeRows() const { return UnsafeRows.get(); }
+  const bool* getUnsafeCols() const { return UnsafeCols.get(); }
 
 private:
   unsigned WorstRow, WorstCol;
-  bool* UnsafeRows;
-  bool* UnsafeCols;
+  std::unique_ptr<bool[]> UnsafeRows;
+  std::unique_ptr<bool[]> UnsafeCols;
 };
 
 class NodeMetadata {
@@ -88,7 +83,21 @@ public:
                  NotProvablyAllocatable } ReductionState;
 
   NodeMetadata() : RS(Unprocessed), DeniedOpts(0), OptUnsafeEdges(nullptr){}
-  ~NodeMetadata() { delete[] OptUnsafeEdges; }
+
+  NodeMetadata(NodeMetadata &&Other)
+    : RS(Other.RS), NumOpts(Other.NumOpts), DeniedOpts(Other.DeniedOpts),
+      OptUnsafeEdges(std::move(Other.OptUnsafeEdges)), VReg(Other.VReg),
+      OptionRegs(std::move(Other.OptionRegs)) {}
+
+  NodeMetadata& operator=(NodeMetadata &&Other) {
+    RS = Other.RS;
+    NumOpts = Other.NumOpts;
+    DeniedOpts = Other.DeniedOpts;
+    OptUnsafeEdges = std::move(Other.OptUnsafeEdges);
+    VReg = Other.VReg;
+    OptionRegs = std::move(Other.OptionRegs);
+    return *this;
+  }
 
   void setVReg(unsigned VReg) { this->VReg = VReg; }
   unsigned getVReg() const { return VReg; }
@@ -100,7 +109,7 @@ public:
 
   void setup(const Vector& Costs) {
     NumOpts = Costs.getLength() - 1;
-    OptUnsafeEdges = new unsigned[NumOpts]();
+    OptUnsafeEdges = std::unique_ptr<unsigned[]>(new unsigned[NumOpts]());
   }
 
   ReductionState getReductionState() const { return RS; }
@@ -124,15 +133,18 @@ public:
 
   bool isConservativelyAllocatable() const {
     return (DeniedOpts < NumOpts) ||
-      (std::find(OptUnsafeEdges, OptUnsafeEdges + NumOpts, 0) !=
-       OptUnsafeEdges + NumOpts);
+      (std::find(&OptUnsafeEdges[0], &OptUnsafeEdges[NumOpts], 0) !=
+       &OptUnsafeEdges[NumOpts]);
   }
 
 private:
+  NodeMetadata(const NodeMetadata&) LLVM_DELETED_FUNCTION;
+  void operator=(const NodeMetadata&) LLVM_DELETED_FUNCTION;
+
   ReductionState RS;
   unsigned NumOpts;
   unsigned DeniedOpts;
-  unsigned* OptUnsafeEdges;
+  std::unique_ptr<unsigned[]> OptUnsafeEdges;
   unsigned VReg;
   OptionToRegMap OptionRegs;
 };





More information about the llvm-commits mailing list