@@ -207,13 +207,16 @@ void block_pred(ref BlockOpt bo)
207207 for (block* b = bo.startblock; b; b = b.Bnext) // for each block
208208 b.Bpred.reset();
209209
210+ convertBsuccToBsucca(bo.startblock);
210211 for (block* b = bo.startblock; b; b = b.Bnext) // for each block
211212 {
212213 // printf("b = %p, BC = BC.%s\n", b, bc_str(b.bc));
213- foreach (bp; ListRange(b.Bsucc))
214+ foreach (bp; b.Bsucca[])
215+ // foreach (bp; ListRange(b.Bsucc))
214216 { /* for each successor to b */
215217 // printf("\tbs = %p\n",list_block(bp));
216- list_block(bp).Bpred.push(b); // original inserts at the beginning, don't think it matters
218+ bp.Bpred.push(b); // original inserts at the beginning, don't think it matters
219+ // list_block(bp).Bpred.push(b); // original inserts at the beginning, don't think it matters
217220 }
218221 }
219222 assert (bo.startblock.Bpred.length == 0 ); /* startblock has no preds */
@@ -237,9 +240,11 @@ void block_clearvisit(ref BlockOpt bo)
237240void block_visit (block* b)
238241{
239242 b.Bflags |= BFL .visited;
240- foreach (l; ListRange(b.Bsucc))
243+ convertOneBsuccToBsucca(b);
244+ foreach (bs; b.Bsucca[])
245+ // foreach (l; ListRange(b.Bsucc))
241246 {
242- block* bs = list_block(l);
247+ // block* bs = list_block(l);
243248 assert (bs);
244249 if ((bs.Bflags & BFL .visited) == 0 ) // if not visited
245250 block_visit(bs);
@@ -306,7 +311,9 @@ void block_free(ref BlockOpt bo, block* b)
306311 assert (b);
307312 if (b.Belem)
308313 el_free(b.Belem);
314+ b.Bsucca.dtor();
309315 list_free(&b.Bsucc,FPNULL );
316+ b.Bsucca.dtor();
310317 b.Bpred.dtor();
311318 if (OPTIMIZER )
312319 block_optimizer_free(b);
@@ -416,6 +423,7 @@ void blockopt(ref GlobalOptimizer go, ref BlockOpt bo)
416423 {
417424 // printf("changes = %d, count = %d, dfo.length = %d\n",go.changes,count,dfo.length);
418425 go.changes = 0 ;
426+ convertBsuccToBsucca(bo.startblock);
419427 bropt(go, bo); // branch optimization
420428 brrear(bo); // branch rearrangement
421429 blident(go, bo); // combine identical blocks
@@ -646,10 +654,12 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
646654 {
647655 b.bc = BC .exit;
648656 // Exit block has no successors, so remove them
649- foreach (bp; ListRange(b.Bsucc))
657+ foreach (bp; b.Bsucca[])
658+ // foreach (bp; ListRange(b.Bsucc))
650659 {
651- list_block(bp) .Bpred.subtract(b);
660+ bp .Bpred.subtract(b);
652661 }
662+ b.Bsucca.reset();
653663 list_free(&b.Bsucc, FPNULL );
654664 debug if (debugc) printf(" CHANGE: noreturn becomes BC.exit\n " );
655665 go.changes++ ;
@@ -670,6 +680,7 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
670680 (* pn).Ety = tym;
671681 for (n = b.Belem; n.Eoper == OPcomma; n = n.E2 )
672682 n.Ety = tym;
683+ b.Bsucca.reverse();
673684 b.Bsucc = list_reverse(b.Bsucc);
674685 debug if (debugc) printf(" CHANGE: if (!e)\n " );
675686 go.changes++ ;
@@ -681,14 +692,17 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
681692 {
682693 // select first succ
683694 db = b.nthSucc(1 );
695+ assert (db == b.Bsucca[1 ]);
684696 goto L1 ;
685697 }
686698 else if (iffalse(n))
687699 {
688700 // select second succ
689701 db = b.nthSucc(0 );
702+ assert (db == b.Bsucca[0 ]);
690703
691704 L1 :
705+ b.Bsucca.subtract(db);
692706 list_subtract(&(b.Bsucc),db);
693707 db.Bpred.subtract(b);
694708 b.bc = BC .goto_;
@@ -704,6 +718,7 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
704718 {
705719 b.bc = BC .goto_;
706720 db = b.nthSucc(0 );
721+ b.Bsucca.subtract(db);
707722 list_subtract(&(b.Bsucc),db);
708723 db.Bpred.subtract(b);
709724 debug if (debugc) printf(" CHANGE: if (e) goto L1; else goto L1;\n " );
@@ -728,6 +743,7 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
728743 }
729744 }
730745 block* db = b.nthSucc(i);
746+ assert (db == b.Bsucca[i]);
731747
732748 /* delete predecessors of successors (!) */
733749 foreach (bl; ListRange(b.Bsucc))
@@ -741,13 +757,16 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
741757
742758 /* dump old successor list and create a new one */
743759 list_free(&b.Bsucc,FPNULL );
760+ b.Bsucca.reset();
744761 b.appendSucc(db);
762+ b.Bsucca.push(db);
745763 b.bc = BC .goto_;
746764 b.Belem = doptelem(b.Belem, Goal.none | Goal.again);
747765 debug if (debugc) printf(" CHANGE: switch (const)\n " );
748766 go.changes++ ;
749767 }
750768 }
769+ verifyBsuccMatchesBsucca(bo.startblock);
751770}
752771
753772/* ********************************
0 commit comments