Skip to content

Commit db8244b

Browse files
committed
using bump allocator instead of unsecure deque
1 parent 9b17309 commit db8244b

File tree

1 file changed

+41
-24
lines changed

1 file changed

+41
-24
lines changed

lib/Dialect/FIRRTL/Transforms/InferWidths_new.cpp

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,11 @@ struct Node {
414414
};
415415

416416
struct FieldRefGraph {
417-
std::deque<Node> nodes;
417+
// use BumpPtrAllocator to distribute nodes
418+
llvm::BumpPtrAllocator allocator;
419+
420+
llvm::SmallVector<Node*, 32> nodes;
421+
418422
DenseMap<FieldRef, Node *> nodeMap;
419423

420424
Node *addNode_zero() {
@@ -423,9 +427,10 @@ struct FieldRefGraph {
423427
return it->second;
424428
}
425429

426-
nodes.emplace_back(key);
427-
Node *newNode = &nodes.back();
428-
nodeMap[key] = std::move(newNode);
430+
// Create nodes using the allocator.
431+
Node* newNode = new (allocator.Allocate<Node>()) Node(key);
432+
nodes.push_back(newNode);
433+
nodeMap[key] = newNode;
429434
return newNode;
430435
}
431436

@@ -435,9 +440,10 @@ struct FieldRefGraph {
435440
return it->second;
436441
}
437442

438-
nodes.emplace_back(value, id);
439-
Node *newNode = &nodes.back();
440-
nodeMap[key] = std::move(newNode);
443+
// Create nodes using the allocator.
444+
Node* newNode = new (allocator.Allocate<Node>()) Node(value, id);
445+
nodes.push_back(newNode);
446+
nodeMap[key] = newNode;
441447

442448
Node *root = addNode_zero();
443449
root->addSuccessor(newNode);
@@ -450,9 +456,10 @@ struct FieldRefGraph {
450456
return it->second;
451457
}
452458

453-
nodes.emplace_back(key);
454-
Node *newNode = &nodes.back();
455-
nodeMap[key] = std::move(newNode);
459+
// Create nodes using the allocator.
460+
Node* newNode = new (allocator.Allocate<Node>()) Node(key);
461+
nodes.push_back(newNode);
462+
nodeMap[key] = newNode;
456463

457464
Node *root = addNode_zero();
458465
root->addSuccessor(newNode);
@@ -465,9 +472,10 @@ struct FieldRefGraph {
465472
return it->second;
466473
}
467474

468-
nodes.emplace_back(key);
469-
Node *newNode = &nodes.back();
470-
nodeMap[key] = std::move(newNode);
475+
// Create nodes using the allocator.
476+
Node* newNode = new (allocator.Allocate<Node>()) Node(key);
477+
nodes.push_back(newNode);
478+
nodeMap[key] = newNode;
471479
return newNode;
472480
}
473481

@@ -481,23 +489,32 @@ struct FieldRefGraph {
481489
FieldRefGraph(const FieldRefGraph &other) {
482490
DenseMap<const Node *, Node *> oldToNewMap;
483491

484-
for (const Node &oldNode : other.nodes) {
485-
nodes.emplace_back(oldNode.field);
486-
Node *newNode = &nodes.back();
487-
oldToNewMap[&oldNode] = newNode;
488-
nodeMap[newNode->field] = &nodes.back();
492+
// copy node (using its own allocator)
493+
for (Node *oldNode : other.nodes) {
494+
Node* newNode = new (allocator.Allocate<Node>()) Node(oldNode->field);
495+
nodes.push_back(newNode);
496+
oldToNewMap[oldNode] = newNode;
497+
nodeMap[newNode->field] = newNode;
489498
}
490499

491-
for (const Node &oldNode : other.nodes) {
492-
Node *newNode = oldToNewMap[&oldNode];
493-
for (Node *oldSuccessor : oldNode.successors) {
500+
// copy edges
501+
for (Node *oldNode : other.nodes) {
502+
Node *newNode = oldToNewMap[oldNode];
503+
for (Node *oldSuccessor : oldNode->successors) {
494504
auto it = oldToNewMap.find(oldSuccessor);
495505
if (it != oldToNewMap.end()) {
496-
newNode->successors.push_back(it->second);
506+
newNode->addSuccessor(it->second);
497507
}
498508
}
499509
}
500510
}
511+
512+
513+
~FieldRefGraph() {
514+
for (Node* node : nodes) {
515+
node->~Node();
516+
}
517+
}
501518
};
502519

503520
namespace llvm {
@@ -517,11 +534,11 @@ struct GraphTraits<FieldRefGraph *> {
517534
}
518535

519536
static NodeRef nodes_begin(FieldRefGraph *G) {
520-
return G->nodes.empty() ? nullptr : &G->nodes[0];
537+
return G->nodes.empty() ? nullptr : G->nodes.front();
521538
}
522539

523540
static NodeRef nodes_end(FieldRefGraph *G) {
524-
return G->nodes.empty() ? nullptr : &G->nodes[0] + G->nodes.size();
541+
return G->nodes.empty() ? nullptr : G->nodes.back() + 1;
525542
}
526543
};
527544
} // namespace llvm

0 commit comments

Comments
 (0)