@@ -414,7 +414,11 @@ struct Node {
414414};
415415
416416struct 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
503520namespace 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