1515#ifndef LLVM_CODEGEN_REGALLOCPBQP_H
1616#define LLVM_CODEGEN_REGALLOCPBQP_H
1717
18- #include " llvm/ADT/ArrayRef.h"
1918#include " llvm/ADT/DenseMap.h"
2019#include " llvm/ADT/Hashing.h"
2120#include " llvm/CodeGen/PBQP/CostAllocator.h"
@@ -184,14 +183,18 @@ class NodeMetadata {
184183 NodeMetadata () = default ;
185184
186185 NodeMetadata (const NodeMetadata &Other)
187- : RS(Other.RS), DeniedOpts(Other.DeniedOpts),
188- OptUnsafeEdges (ArrayRef< unsigned > (Other.OptUnsafeEdges) ),
189- VReg(Other.VReg), AllowedRegs(Other.AllowedRegs)
186+ : RS(Other.RS), NumOpts(Other.NumOpts), DeniedOpts(Other.DeniedOpts),
187+ OptUnsafeEdges (new unsigned [NumOpts]), VReg (Other.VReg ),
188+ AllowedRegs(Other.AllowedRegs)
190189#if LLVM_ENABLE_ABI_BREAKING_CHECKS
191190 ,
192191 everConservativelyAllocatable (Other.everConservativelyAllocatable)
193192#endif
194193 {
194+ if (NumOpts > 0 ) {
195+ std::copy (&Other.OptUnsafeEdges [0 ], &Other.OptUnsafeEdges [NumOpts],
196+ &OptUnsafeEdges[0 ]);
197+ }
195198 }
196199
197200 NodeMetadata (NodeMetadata &&) = default ;
@@ -206,7 +209,8 @@ class NodeMetadata {
206209 const AllowedRegVector& getAllowedRegs () const { return *AllowedRegs; }
207210
208211 void setup (const Vector& Costs) {
209- OptUnsafeEdges = OwningArrayRef<unsigned >(Costs.getLength () - 1 );
212+ NumOpts = Costs.getLength () - 1 ;
213+ OptUnsafeEdges = std::unique_ptr<unsigned []>(new unsigned [NumOpts]());
210214 }
211215
212216 ReductionState getReductionState () const { return RS; }
@@ -226,21 +230,22 @@ class NodeMetadata {
226230 DeniedOpts += Transpose ? MD.getWorstRow () : MD.getWorstCol ();
227231 const bool * UnsafeOpts =
228232 Transpose ? MD.getUnsafeCols () : MD.getUnsafeRows ();
229- for (unsigned i = 0 ; i < OptUnsafeEdges. size () ; ++i)
233+ for (unsigned i = 0 ; i < NumOpts ; ++i)
230234 OptUnsafeEdges[i] += UnsafeOpts[i];
231235 }
232236
233237 void handleRemoveEdge (const MatrixMetadata& MD, bool Transpose) {
234238 DeniedOpts -= Transpose ? MD.getWorstRow () : MD.getWorstCol ();
235239 const bool * UnsafeOpts =
236240 Transpose ? MD.getUnsafeCols () : MD.getUnsafeRows ();
237- for (unsigned i = 0 ; i < OptUnsafeEdges. size () ; ++i)
241+ for (unsigned i = 0 ; i < NumOpts ; ++i)
238242 OptUnsafeEdges[i] -= UnsafeOpts[i];
239243 }
240244
241245 bool isConservativelyAllocatable () const {
242- return (DeniedOpts < OptUnsafeEdges.size ()) ||
243- llvm::is_contained (OptUnsafeEdges, 0 );
246+ return (DeniedOpts < NumOpts) ||
247+ (std::find (&OptUnsafeEdges[0 ], &OptUnsafeEdges[NumOpts], 0 ) !=
248+ &OptUnsafeEdges[NumOpts]);
244249 }
245250
246251#if LLVM_ENABLE_ABI_BREAKING_CHECKS
@@ -251,8 +256,9 @@ class NodeMetadata {
251256
252257private:
253258 ReductionState RS = Unprocessed;
259+ unsigned NumOpts = 0 ;
254260 unsigned DeniedOpts = 0 ;
255- OwningArrayRef <unsigned > OptUnsafeEdges;
261+ std::unique_ptr <unsigned [] > OptUnsafeEdges;
256262 Register VReg;
257263 GraphMetadata::AllowedRegVecRef AllowedRegs;
258264
0 commit comments