@@ -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
@@ -481,6 +489,7 @@ void blockopt(ref GlobalOptimizer go, ref BlockOpt bo)
481489 bo.startblock.Belem = el_combine(e, bo.startblock.Belem);
482490 }
483491
492+ convertBsuccToBsucca(bo.startblock);
484493 bropt(go, bo); /* branch optimization */
485494 brrear(bo); /* branch rearrangement */
486495 comsubs(go, bo); /* eliminate common subexpressions */
@@ -646,10 +655,12 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
646655 {
647656 b.bc = BC .exit;
648657 // Exit block has no successors, so remove them
649- foreach (bp; ListRange(b.Bsucc))
658+ foreach (bp; b.Bsucca[])
659+ // foreach (bp; ListRange(b.Bsucc))
650660 {
651- list_block(bp) .Bpred.subtract(b);
661+ bp .Bpred.subtract(b);
652662 }
663+ b.Bsucca.reset();
653664 list_free(&b.Bsucc, FPNULL );
654665 debug if (debugc) printf(" CHANGE: noreturn becomes BC.exit\n " );
655666 go.changes++ ;
@@ -670,6 +681,7 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
670681 (* pn).Ety = tym;
671682 for (n = b.Belem; n.Eoper == OPcomma; n = n.E2 )
672683 n.Ety = tym;
684+ b.Bsucca.reverse();
673685 b.Bsucc = list_reverse(b.Bsucc);
674686 debug if (debugc) printf(" CHANGE: if (!e)\n " );
675687 go.changes++ ;
@@ -681,14 +693,17 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
681693 {
682694 // select first succ
683695 db = b.nthSucc(1 );
696+ assert (db == b.Bsucca[1 ]);
684697 goto L1 ;
685698 }
686699 else if (iffalse(n))
687700 {
688701 // select second succ
689702 db = b.nthSucc(0 );
703+ assert (db == b.Bsucca[0 ]);
690704
691705 L1 :
706+ b.Bsucca.subtract(db);
692707 list_subtract(&(b.Bsucc),db);
693708 db.Bpred.subtract(b);
694709 b.bc = BC .goto_;
@@ -704,6 +719,7 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
704719 {
705720 b.bc = BC .goto_;
706721 db = b.nthSucc(0 );
722+ b.Bsucca.subtract(db);
707723 list_subtract(&(b.Bsucc),db);
708724 db.Bpred.subtract(b);
709725 debug if (debugc) printf(" CHANGE: if (e) goto L1; else goto L1;\n " );
@@ -728,6 +744,7 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
728744 }
729745 }
730746 block* db = b.nthSucc(i);
747+ assert (db == b.Bsucca[i]);
731748
732749 /* delete predecessors of successors (!) */
733750 foreach (bl; ListRange(b.Bsucc))
@@ -741,13 +758,16 @@ private void bropt(ref GlobalOptimizer go, ref BlockOpt bo)
741758
742759 /* dump old successor list and create a new one */
743760 list_free(&b.Bsucc,FPNULL );
761+ b.Bsucca.reset();
744762 b.appendSucc(db);
763+ b.Bsucca.push(db);
745764 b.bc = BC .goto_;
746765 b.Belem = doptelem(b.Belem, Goal.none | Goal.again);
747766 debug if (debugc) printf(" CHANGE: switch (const)\n " );
748767 go.changes++ ;
749768 }
750769 }
770+ verifyBsuccMatchesBsucca(bo.startblock);
751771}
752772
753773/* ********************************
@@ -760,11 +780,13 @@ private void brrear(ref BlockOpt bo)
760780 debug if (debugc) printf(" brrear()\n " );
761781 for (block* b = bo.startblock; b; b = b.Bnext) // for each block
762782 {
763- foreach (bl; ListRange(b.Bsucc))
783+ foreach (i, bl; b.Bsucca[])
784+ // foreach (bl; ListRange(b.Bsucc))
764785 { /* For each transfer of control block pointer */
765786 int iter = 0 ;
766787
767- block* bt = list_block(bl);
788+ block* bt = bl;
789+ // block* bt = list_block(bl);
768790
769791 /* If it is a transfer to a block that consists */
770792 /* of nothing but an unconditional transfer, */
@@ -785,14 +807,17 @@ private void brrear(ref BlockOpt bo)
785807 (OPTIMIZER || ! (bt.Bsrcpos.Slinnum && config.addlinenumbers)) &&
786808 ++ iter < 10 )
787809 {
788- bl.ptr = list_ptr(bt.Bsucc);
810+ b.Bsucca[i] = bt.Bsucca[0 ];
811+ // bl.ptr = list_ptr(bt.Bsucc);
789812 if (bt.Bsrcpos.Slinnum && ! b.Bsrcpos.Slinnum)
790813 b.Bsrcpos = bt.Bsrcpos;
791814 b.Bflags |= bt.Bflags;
792- list_block(bl).Bpred.push(b);
815+ bl.Bpred.push(b);
816+ // list_block(bl).Bpred.push(b);
793817 bt.Bpred.subtract(b);
794818 debug if (debugc) printf(" goto.goto\n " );
795- bt = list_block(bl);
819+ bt = b.Bsucca[i];
820+ // bt = list_block(bl);
796821 }
797822
798823 // Bsucc after the first are the targets of
@@ -828,6 +853,7 @@ private void brrear(ref BlockOpt bo)
828853 }
829854 }
830855 } /* for */
856+ verifyBsuccMatchesBsucca(bo.startblock);
831857}
832858
833859/* ************************
0 commit comments