From 37ea9315e652f7f6baeb0adcf76a903a75a7c77d Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Sun, 26 Oct 2014 20:57:16 +0000 Subject: [PATCH] [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. llvm-svn: 220649 --- llvm/include/llvm/CodeGen/RegAllocPBQP.h | 40 +++++++++++++++--------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocPBQP.h b/llvm/include/llvm/CodeGen/RegAllocPBQP.h index 3d242f1bebe1..0d379ea8b226 100644 --- a/llvm/include/llvm/CodeGen/RegAllocPBQP.h +++ b/llvm/include/llvm/CodeGen/RegAllocPBQP.h @@ -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 UnsafeRows; + std::unique_ptr 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(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 OptUnsafeEdges; unsigned VReg; OptionToRegMap OptionRegs; }; -- 2.34.1