@@ -276,14 +276,14 @@ void GenericDomTreeUpdater<DerivedT, DomTreeT,
276
276
assert (I < E && " Iterator range invalid; there should be DomTree updates." );
277
277
if (!I->IsCriticalEdgeSplit ) {
278
278
SmallVector<UpdateT, 32 > NormalUpdates;
279
- while ( I != E && !I->IsCriticalEdgeSplit )
280
- NormalUpdates.push_back ((I++) ->Update );
279
+ for (; I != E && !I->IsCriticalEdgeSplit ; ++I )
280
+ NormalUpdates.push_back (I ->Update );
281
281
DT->applyUpdates (NormalUpdates);
282
282
PendDTUpdateIndex += NormalUpdates.size ();
283
283
} else {
284
- SmallVector<CriticalEdge, 32 > CriticalEdges;
285
- while ( I != E && I->IsCriticalEdgeSplit )
286
- CriticalEdges.push_back ((I++) ->EdgeSplit );
284
+ SmallVector<CriticalEdge> CriticalEdges;
285
+ for (; I != E && I->IsCriticalEdgeSplit ; ++I )
286
+ CriticalEdges.push_back (I ->EdgeSplit );
287
287
splitDTCriticalEdges (CriticalEdges);
288
288
PendDTUpdateIndex += CriticalEdges.size ();
289
289
}
@@ -305,14 +305,14 @@ void GenericDomTreeUpdater<DerivedT, DomTreeT,
305
305
" Iterator range invalid; there should be PostDomTree updates." );
306
306
if (!I->IsCriticalEdgeSplit ) {
307
307
SmallVector<UpdateT, 32 > NormalUpdates;
308
- while ( I != E && !I->IsCriticalEdgeSplit )
309
- NormalUpdates.push_back ((I++) ->Update );
308
+ for (; I != E && !I->IsCriticalEdgeSplit ; ++I )
309
+ NormalUpdates.push_back (I ->Update );
310
310
PDT->applyUpdates (NormalUpdates);
311
311
PendPDTUpdateIndex += NormalUpdates.size ();
312
312
} else {
313
- SmallVector<CriticalEdge, 32 > CriticalEdges;
314
- while ( I != E && I->IsCriticalEdgeSplit )
315
- CriticalEdges.push_back ((I++) ->EdgeSplit );
313
+ SmallVector<CriticalEdge> CriticalEdges;
314
+ for (; I != E && I->IsCriticalEdgeSplit ; ++I )
315
+ CriticalEdges.push_back (I ->EdgeSplit );
316
316
splitPDTCriticalEdges (CriticalEdges);
317
317
PendPDTUpdateIndex += CriticalEdges.size ();
318
318
}
@@ -393,7 +393,7 @@ template <typename DerivedT, typename DomTreeT, typename PostDomTreeT>
393
393
void GenericDomTreeUpdater<DerivedT, DomTreeT, PostDomTreeT>::
394
394
splitDTCriticalEdges (ArrayRef<CriticalEdge> Edges) {
395
395
// Bail out early if there is nothing to do.
396
- if (Edges.empty ())
396
+ if (!DT || Edges.empty ())
397
397
return ;
398
398
399
399
// Remember all the basic blocks that are inserted during
@@ -410,107 +410,92 @@ void GenericDomTreeUpdater<DerivedT, DomTreeT, PostDomTreeT>::
410
410
// index, i.e., the information for the ith element of Edges is
411
411
// the ith element of IsNewIDom.
412
412
SmallBitVector IsNewIDom (Edges.size (), true );
413
- size_t Idx = 0 ;
414
413
415
414
// Collect all the dominance properties info, before invalidating
416
415
// the underlying DT.
417
- for (const auto &Edge : Edges) {
416
+ for (const auto &[Idx, Edge] : enumerate( Edges) ) {
418
417
// Update dominator information.
419
- if (DT) {
420
- BasicBlockT *Succ = Edge.ToBB ;
421
- auto *SuccDTNode = DT->getNode (Succ);
422
-
423
- for (BasicBlockT *PredBB : predecessors (Succ)) {
424
- if (PredBB == Edge.NewBB )
425
- continue ;
426
- // If we are in this situation:
427
- // FromBB1 FromBB2
428
- // + +
429
- // + + + +
430
- // + + + +
431
- // ... Split1 Split2 ...
432
- // + +
433
- // + +
434
- // +
435
- // Succ
436
- // Instead of checking the domiance property with Split2, we check it
437
- // with FromBB2 since Split2 is still unknown of the underlying DT
438
- // structure.
439
- if (NewBBs.count (PredBB)) {
440
- assert (pred_size (PredBB) == 1 && " A basic block resulting from a "
441
- " critical edge split has more "
442
- " than one predecessor!" );
443
- PredBB = *pred_begin (PredBB);
444
- }
445
- if (!DT->dominates (SuccDTNode, DT->getNode (PredBB))) {
446
- IsNewIDom[Idx] = false ;
447
- break ;
448
- }
418
+ BasicBlockT *Succ = Edge.ToBB ;
419
+ auto *SuccDTNode = DT->getNode (Succ);
420
+
421
+ for (BasicBlockT *PredBB : predecessors (Succ)) {
422
+ if (PredBB == Edge.NewBB )
423
+ continue ;
424
+ // If we are in this situation:
425
+ // FromBB1 FromBB2
426
+ // + +
427
+ // + + + +
428
+ // + + + +
429
+ // ... Split1 Split2 ...
430
+ // + +
431
+ // + +
432
+ // +
433
+ // Succ
434
+ // Instead of checking the domiance property with Split2, we check it
435
+ // with FromBB2 since Split2 is still unknown of the underlying DT
436
+ // structure.
437
+ if (NewBBs.contains (PredBB)) {
438
+ assert (pred_size (PredBB) == 1 && " A basic block resulting from a "
439
+ " critical edge split has more "
440
+ " than one predecessor!" );
441
+ PredBB = *pred_begin (PredBB);
442
+ }
443
+ if (!DT->dominates (SuccDTNode, DT->getNode (PredBB))) {
444
+ IsNewIDom[Idx] = false ;
445
+ break ;
449
446
}
450
447
}
451
- ++Idx;
452
448
}
453
449
454
450
// Now, update DT with the collected dominance properties info.
455
- Idx = 0 ;
456
- for (const auto &Edge : Edges) {
457
- if (DT) {
458
- // We know FromBB dominates NewBB.
459
- auto *NewDTNode = DT->addNewBlock (Edge.NewBB , Edge.FromBB );
460
-
461
- // If all the other predecessors of "Succ" are dominated by "Succ" itself
462
- // then the new block is the new immediate dominator of "Succ". Otherwise,
463
- // the new block doesn't dominate anything.
464
- if (IsNewIDom[Idx])
465
- DT->changeImmediateDominator (DT->getNode (Edge.ToBB ), NewDTNode);
466
- }
467
- ++Idx;
451
+ for (const auto &[Idx, Edge] : enumerate(Edges)) {
452
+ // We know FromBB dominates NewBB.
453
+ auto *NewDTNode = DT->addNewBlock (Edge.NewBB , Edge.FromBB );
454
+
455
+ // If all the other predecessors of "Succ" are dominated by "Succ" itself
456
+ // then the new block is the new immediate dominator of "Succ". Otherwise,
457
+ // the new block doesn't dominate anything.
458
+ if (IsNewIDom[Idx])
459
+ DT->changeImmediateDominator (DT->getNode (Edge.ToBB ), NewDTNode);
468
460
}
469
461
}
470
462
471
463
template <typename DerivedT, typename DomTreeT, typename PostDomTreeT>
472
464
void GenericDomTreeUpdater<DerivedT, DomTreeT, PostDomTreeT>::
473
465
splitPDTCriticalEdges (ArrayRef<CriticalEdge> Edges) {
474
466
// Bail out early if there is nothing to do.
475
- if (Edges.empty ())
467
+ if (!PDT || Edges.empty ())
476
468
return ;
477
469
478
470
SmallBitVector IsNewIPDom (Edges.size (), true );
479
- SmallSet<BasicBlockT *, 32 > NewBBs;
471
+ SmallSet<BasicBlockT *, 8 > NewBBs;
480
472
for (const auto &Edge : Edges)
481
473
NewBBs.insert (Edge.NewBB );
482
- size_t Idx = 0 ;
483
- for (const auto &Edge : Edges) {
474
+
475
+ for (const auto &[Idx, Edge] : enumerate( Edges) ) {
484
476
// Same as DT version but from another direction.
485
- if (PDT) {
486
- BasicBlockT *Pred = Edge.FromBB ;
487
- auto *PredDTNode = PDT->getNode (Pred);
488
- for (BasicBlockT *SuccBB : successors (Pred)) {
489
- if (SuccBB == Edge.NewBB )
490
- continue ;
491
- if (NewBBs.count (SuccBB)) {
492
- assert (succ_size (SuccBB) == 1 && " A basic block resulting from a "
493
- " critical edge split has more "
494
- " than one predecessor!" );
495
- SuccBB = *succ_begin (SuccBB);
496
- }
497
- if (!PDT->dominates (PredDTNode, PDT->getNode (SuccBB))) {
498
- IsNewIPDom[Idx] = false ;
499
- break ;
500
- }
477
+ BasicBlockT *Pred = Edge.FromBB ;
478
+ auto *PredDTNode = PDT->getNode (Pred);
479
+ for (BasicBlockT *SuccBB : successors (Pred)) {
480
+ if (SuccBB == Edge.NewBB )
481
+ continue ;
482
+ if (NewBBs.count (SuccBB)) {
483
+ assert (succ_size (SuccBB) == 1 && " A basic block resulting from a "
484
+ " critical edge split has more "
485
+ " than one predecessor!" );
486
+ SuccBB = *succ_begin (SuccBB);
487
+ }
488
+ if (!PDT->dominates (PredDTNode, PDT->getNode (SuccBB))) {
489
+ IsNewIPDom[Idx] = false ;
490
+ break ;
501
491
}
502
492
}
503
- ++Idx;
504
493
}
505
494
506
- Idx = 0 ;
507
- for (const auto &Edge : Edges) {
508
- if (PDT) {
509
- auto *NewPDTNode = PDT->addNewBlock (Edge.NewBB , Edge.ToBB );
510
- if (IsNewIPDom[Idx])
511
- PDT->changeImmediateDominator (PDT->getNode (Edge.FromBB ), NewPDTNode);
512
- }
513
- ++Idx;
495
+ for (const auto &[Idx, Edge] : enumerate(Edges)) {
496
+ auto *NewPDTNode = PDT->addNewBlock (Edge.NewBB , Edge.ToBB );
497
+ if (IsNewIPDom[Idx])
498
+ PDT->changeImmediateDominator (PDT->getNode (Edge.FromBB ), NewPDTNode);
514
499
}
515
500
}
516
501
0 commit comments