15
15
#ifndef LLVM_CODEGEN_REGALLOCPBQP_H
16
16
#define LLVM_CODEGEN_REGALLOCPBQP_H
17
17
18
- #include " llvm/ADT/ArrayRef.h"
19
18
#include " llvm/ADT/DenseMap.h"
20
19
#include " llvm/ADT/Hashing.h"
21
20
#include " llvm/CodeGen/PBQP/CostAllocator.h"
@@ -184,14 +183,18 @@ class NodeMetadata {
184
183
NodeMetadata () = default ;
185
184
186
185
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)
190
189
#if LLVM_ENABLE_ABI_BREAKING_CHECKS
191
190
,
192
191
everConservativelyAllocatable (Other.everConservativelyAllocatable)
193
192
#endif
194
193
{
194
+ if (NumOpts > 0 ) {
195
+ std::copy (&Other.OptUnsafeEdges [0 ], &Other.OptUnsafeEdges [NumOpts],
196
+ &OptUnsafeEdges[0 ]);
197
+ }
195
198
}
196
199
197
200
NodeMetadata (NodeMetadata &&) = default ;
@@ -206,7 +209,8 @@ class NodeMetadata {
206
209
const AllowedRegVector& getAllowedRegs () const { return *AllowedRegs; }
207
210
208
211
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]());
210
214
}
211
215
212
216
ReductionState getReductionState () const { return RS; }
@@ -226,21 +230,22 @@ class NodeMetadata {
226
230
DeniedOpts += Transpose ? MD.getWorstRow () : MD.getWorstCol ();
227
231
const bool * UnsafeOpts =
228
232
Transpose ? MD.getUnsafeCols () : MD.getUnsafeRows ();
229
- for (unsigned i = 0 ; i < OptUnsafeEdges. size () ; ++i)
233
+ for (unsigned i = 0 ; i < NumOpts ; ++i)
230
234
OptUnsafeEdges[i] += UnsafeOpts[i];
231
235
}
232
236
233
237
void handleRemoveEdge (const MatrixMetadata& MD, bool Transpose) {
234
238
DeniedOpts -= Transpose ? MD.getWorstRow () : MD.getWorstCol ();
235
239
const bool * UnsafeOpts =
236
240
Transpose ? MD.getUnsafeCols () : MD.getUnsafeRows ();
237
- for (unsigned i = 0 ; i < OptUnsafeEdges. size () ; ++i)
241
+ for (unsigned i = 0 ; i < NumOpts ; ++i)
238
242
OptUnsafeEdges[i] -= UnsafeOpts[i];
239
243
}
240
244
241
245
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]);
244
249
}
245
250
246
251
#if LLVM_ENABLE_ABI_BREAKING_CHECKS
@@ -251,8 +256,9 @@ class NodeMetadata {
251
256
252
257
private:
253
258
ReductionState RS = Unprocessed;
259
+ unsigned NumOpts = 0 ;
254
260
unsigned DeniedOpts = 0 ;
255
- OwningArrayRef <unsigned > OptUnsafeEdges;
261
+ std::unique_ptr <unsigned [] > OptUnsafeEdges;
256
262
Register VReg;
257
263
GraphMetadata::AllowedRegVecRef AllowedRegs;
258
264
0 commit comments