*DECK     CFA 
          IDENT  CFA
 CFA      TITLE  CFA - CONTROL FLOW ANALYSIS ROUTINES 
*CALL     SSTCALL 
 B=CFA    RPVDEF
          PASS2TM 
  
*IF       DEF,CFA,1 
          TRACER GPO
 CFA      SPACE  2
**        CFA - CONTROL FLOW ANALYSIS ROUTINES ( OPT=2 )
*         CFA PROCESSES THE CONTROL FLOW INFORMATION FORMED IN *PRE* TO 
*         FIND THE LOOPS IN THE PROGRAM, AND TO BUILD THE GRAPH/INTERVAL
*         STRUCTURE TABLES WHICH ARE USED BY THE OPTIMIZERS ( GPO/GRA ) 
*         TO DIRECT THE GLOBAL OPTIMIZATION.
* 
*         S.I. JASIK - SEPT 11, 1973
  
          LIST   -R,X 
  
          ENTRY  DGS,F.CFA
  
          TABLES GST,CFT,BST,GLT,OTI,RND
 O.BIT    EQU    O.BST
 L.BIT    EQU    L.BST
          EXT    CBN,M.GRL,N.DG,NPB 
  
 MAX.GST  EQU    1400B       MAX GRAPH SPACE ( INCORE ) 
  
**        DEBUG FACILITIES
* 
*         TRACER (FGS,FGS.X,FIS1,FIS.X,CBD.X,FDG.X) 
 SCRATCH  SPACE  3
*         SCRATCH CELLS USED DURING GRAPH / INTERVAL FORMATION
  
          USE    /TABLES/ 
 PBN      BSS    1           PREVIOUS BLOCK NUMBER ( *CBN* ON ENTRY ) 
  
 LB       BSS    2           LINK BACKWARDS / L.GST AT START OF GRAPH 
 N.BLK    BSS    1           NUMBER OF BLOCKS IN GRAPH
  
 LC       BSS    1           SAVED LENGTH OF *CFT*
 EIB      BSS    2           EDGE INDEX BASE
 EII      EQU    EIB         EDGE INDEX INDEX  ( RELATIVE TO O.GST )
 ETB      EQU    EIB+1       EDGE TABLE BASE
 ILB      BSS    1           INTERVAL LIST BASE 
  
 HTL      BSS    1           HEADER TABLE LIST
 NPH      BSS    1           N.PRED OF HEADER AT BEGIN OF INTERVAL
 FTH      BSS    1           FALL THROUGH TO HEADER FROM A LATCHING NODE
 SCR      BSS    1           "0 IF GRAPH CONTAINS LOOPS 
 IP       BSS    1           INTERVAL POINTER ( CBD ) 
 NN       BSS    1           N.NODES REMAINING ( CBD12 )
 I        EQU    NN 
          USE    0
          SPACE  2
*CALL     CFTBLD
 TMP      SPACE  3
**        I. - TEMPORARY TABLE FOR INTERVAL FORMATION 
  
          DESCRIBE I.,60
 INI      DEFINE 1           IN AN INTERVAL 
 INH      DEFINE 1           IN HEADER LIST 
 1P       DEFINE 1           =1 IF ONLY 1 PREDECESSOR 
          DEFINE 3
 HN       DEFINE 18          HEADER NODE NUMBER 
 IA       DEFINE 18          ADDRESS OF NODE IN INTERVAL LIST 
 PC       DEFINE 18          PREDECESSOR COUNT
          SPACE  2
**        I. - TEMP TABLE FOR BACK DOMINATOR CALCULATION
*         NOTE - IF NODES IN INTERVAL @ 60 , THEN BITN = NI 
  
          DESCRIBE I.,60
 BITN     DEFINE 12          PACKED BIT NUMBER
 WI       DEFINE 18          WORD INDEX 
 BVI      DEFINE 18          BIT VECTOR INDEX 
 NI       DEFINE 12          NODE INDEX ( REL TO INTERVAL BASE )
          SPACE  2
          LIST   R
          QUAL   CODE 
 CGT      TITLE  CGT - CHECK GRAPH TABLE LENGTH AND FLUSH IF NECESSARY
**        CGT - CHECK GRAPH TABLE LENGTH AND FLUSH TO DISK IF TOO BIG 
  
 CGT      ROUTINE 
          SA1    L.GST
          SX2    X1-MAX.GST 
          MI     X2,CGT      IF L.GST < MAX.GRS  */ SMALL ENOUGH FOR CORE 
          SA5    N.DG 
          ZR     X5,CGT      IF N.DG = 0   */ NO DERIVED GRAPHS 
  
*         FLUSH GRAPHS TO DISK, SETUP RANDOM INDEX IN WORKING STORAGE.
  
          SA3    O.GST
          SX4    X3+B1       FWA = O.GST + 1
          SA5    X4 
          LX5    -GA.LFP     LEN = LF[FWA]
          MX6    0
          SX7    B1 
          SA6    I           I = 0
          SA7    =XGIC       GIC = 1       */ INDEX 
  
 CGT1     SA2    GIC
          IX7    X2+X5       GIC = GIC + LEN
          SA7    A2 
          CALL   SBD         SAVE GRAPH ON DISK 
          SA5    =XO.IST
          BX7    X1 
          SB2    X5 
          SA1    I
          SA7    B2+X1       IST(I) = RIW  */ SAVE MASS STORAGE ADDRESS 
          SX6    X1+B1       I = I + 1
          SA3    O.GST
          SA5    GIC
          IX4    X3+X5       FWA = O.GST + GIC
          SA2    X4 
          LX2    -GA.LFP
          SX5    X2          LEN = LF[FWA]
          SA6    A1 
          NZ     X5,CGT1     IF LEN " 0 
  
          SA4    =XM.GRL
          SX6    B2 
          SX7    A7+B1
          SA6    GIC         GIC = O.IST   */ POINT TO FIRST GRAPH
          SA7    O.IST       O.IST = O.IST + I
          SX6    X4+1 
          SA6    L.GST       L.GST = M.GRL + 1
          EQ     CGT
 DGS      TITLE  DGS - DERIVE GRAPH STRUCTURE 
**        DGS - DERIVE GRAPH STRUCTURE ( CONTROL FLOW INFORMATION ) 
  
 DGS0     ADDWRD GST,B0      ADDWRD( GST , 0 )
          SA6    L.CFT       L.CFT = 0
  
          RJ     CGT         CHECK GRAPH TABLES 
  
 DGS      ROUTINE 
          CALL   AFT         ADJUST FLOW TABLE
          MX6    0
          SA6    L.GST       L.GST = 0
          ADDWRD GST,B0      ADDWRD( GST , 0 )
          SA5    CBN
          MX6    0
          BX7    X5 
          SA6    LB          LB = 0        */ LINK BACKWARDS
          SA7    PBN         PBN = CBN       */ CBN AT BEGIN OF GRAPH 
          SX7    X7-1 
          SA7    N.BLK       N.BLK = CBN - 1 */ NUMBER OF BLOCKS
          SA7    NPB         NPB  = CBN - 1  */ N.PROGRAM BLOCKS
  
          RJ     FGS         FORM GRAPH STRUCTURE 
          RJ     FIS         FORM INTERVAL STRUCTURE
          RJ     MRB         MARK REACHABLE BLOCKS
  
*         FORM DERVIED GRAPH OF CURRENT GRAPH IT IT HAS LOOPS 
  
 DGS1     SA1    SCR
          ZR     X1,DGS0     IF SCR = 0    */ NO LOOPS
  
          RJ     FDG         FORM DERIVED GRAPH 
          SA1    N.DG 
          SA2    CBN
          SX6    X1+B1       N.DG = N.DG + 1
          LX7    X2 
          SA7    PBN         PBN = CBN
          SA6    A1 
  
          RJ     FGS         FORM GRAPH STRUCTURE TABLES
          RJ     FIS         FORM INTERVAL STRUCTURE
          EQ     DGS1 
 AFT      TITLE  AFT - ADJUST FLOW TABLE
**        AFT - ADJUST FLOW TABLE TO REPLACE *IH* ORDINALS WITH BLOCK 
*                NUMBERS IN *TO* FIELD ( FORWARD REFERENCES ).
  
 AFT      ROUTINE 
          SA1    L.CFT
          SA2    O.CFT
          SA3    O.SYM
          SA4    O.GLT
          SA0    X3-1 
          SB2    X4-I.GL-1
          SB3    X2          I = O.CFT
          MX0    -CF.FROMP
          SB4    B3+X1       L = I + L.CFT
          MX7    -12
          SB6    I.GL 
          EQ     AFT2 
  
 AFT1     SA4    B2+B5       BN = GLT(H-1)
          IX6    X6+X4
          SA6    A5+         TO[CI] = BN
  
 AFT2     SA5    B3          CI = I 
          GE     B3,B4,AFT   IF I \ L      */ END OF TABLE
          LX5    59-CF.JPP
          SB3    B3+B1       I = I + 1
          PL     X5,AFT2     IF ^JP[CI]    */ *TO* IS A BLOCK NUMBER
          LX5    1+CF.JPP 
          SB5    X5          H = TO[CI] 
          BX6    X0*X5
          GE     B5,B6,AFT1  IF H \ I.GL
  
          SB5    B5+B5
          SA4    A0-B5       WORDB = [O.SYM-1-2*H]
          BX3    -X7*X4 
          IX6    X6+X3       TO[CI] = BN[WORDB] 
          SA6    A5+
          EQ     AFT2 
 MRB      TITLE  MRB - MARK REACHABLE BLOCKS
**        MRB - MARK REACHABLE BLOCKS 
*         SET *RB* BIT IN *BIT* FOR BLOCKS THAT ARE IN INTERVALS. 
  
 MRB      ROUTINE 
          SA1    O.GST
          SA2    ILB
          MX0    1
          LX0    1+BI.RBP 
          IX7    X1+X2
          SA3    N.BLK
          SA4    O.BIT
          SB2    X3          NB = N.BLK 
          SB3    X4 
          SA5    X7          IP = O.GST + ILB 
  
 MRB1     LX5    -IP.NODEP
          SB4    X5          N = NODE[IP] 
          SB2    B2-B4       NB = NB - N
          SA5    A5+B1       IP = IP + 1
  
 MRB2     LX5    -IM.BNP
          SX7    X5 
          LX7    1
          SA4    B3+X7
          BX6    X0+X4       RB[BIT(BN[IP])] = 1
          SA5    A5+B1       IP = IP + 1
          SB4    B4-1        N = N - 1
          SA6    A4 
          NZ     B4,MRB2     IF N " 0 
          NZ     X5,MRB1     IF [IP] " 0
  
*         PROGRAM GRAPH CONTAINS UNREACHABLE BLOCKS.
*         REFORM THE EDGE TABLES AND THE INTERVALS, SINCE THE DEAD CODE MAY 
*         MAY CAUSE THE FORMATION OF SOME SUB-MAXIMAL INTERVALS.
  
          ZR     B2,MRB      IF NB = 0     */ ALL BLOCKS REACHABLE
          SA1    LC 
          MX6    0
          SA6    L.CFT       L.CFT = 0
          SA6    =XL.LCT     L.LCT = 0
          SA6    LB          LB = 0 
          SA6    =XN.FTH     N.FTH = 0
          ALLOC  CFT,X1      ALLOC( CFT , LC )
          SA1    O.BIT
          SB2    X2          C0 = O.CFT 
          SA5    B2-B1
          BX7    X5 
          SA7    A5          CI = C0 - 1
          SB4    B1          BN = 1 
          SA4    N.BLK
          SA3    O.GST
          SB5    X4 
          SB7    X3+3        EIB = O.GST + 3
          MX0    1+ET.SUCCL 
          LX0    ET.SUCCL 
          SA2    X1+2        BI = O.BIT + 2 
          SX1    B1 
          LX1    CF.FROMP 
          SX6    B1 
          SA6    L.GST       L.GST = 1
          EQ     MRB4 
  
*         UNREACHABLE BLOCK, SHOW FLOW TO EXIT NODE ( FOR *FGS* ) 
  
 MRB3     BX7    X1 
          SA7    A7+B1       CI = CI + 1;  [CI] = CFTE( BN , 0 )
          EQ     MRB6 
  
 MRB4     LX2    59-BI.RBP
          PL     X2,MRB3     IF ^RB[BI] 
          SA5    B7+B4       EI = EIB + BN
          LX5    -EI.SUIP 
          UX6    B6,X5       NS = NS[EI]
          SA4    B7+X5       SI = EIB + SUI[EI] 
  
 MRB5     BX3    X0*X4
          IX7    X1+X3
          SA7    A7+B1       CI = CI + 1;  [CI] = CFTE( BN , SUCC[SI] ) 
          SB6    B6-B1       NS = NS - 1
          SA4    A4+B1       SI = SI + 1
          NZ     B6,MRB5     IF NS " 0
  
 MRB6     SB4    B4+B1       BN = BN + 1
          SA2    A2+2        BI = BI + 2
          SX1    B4 
          LX1    CF.FROMP 
          LE     B4,B5,MRB4  IF BN @ N.BLK
  
          SB6    A7+B1
          SX6    B6-B2       L.CFT = CI + 1 - C0
          SA6    L.CFT
          SX7    B5+B1       CBN = N.BLK + 1
          SA7    CBN
          RJ     FGS         REFORM GRAPH STRUCTURE TABLES
          RJ     FIS         REFORM INTERVALS 
  
*         SCAN *BIT* AND LIST LINE NUMBERS OF UNREACHABLE BLOCKS
  
          SA1    =XPROGNAM
          BX6    X1 
          SA6    MRBD+2 
          MESSAGE MRBD,,R    *   DEAD CODE IN - PROGNAM * 
  
          SA1    =XSLIST
          NZ     X1,MRB6A    IF SOURCE LIST ON
          SA1    =XR=FLAG 
          ZR     X1,MRB      IF NO MAP
  
 MRB6A    LISTL  MRBB,1 
          LISTL  MRBA,MRBB+1-MRBA 
          SB6    4           I = 4
  
 MRB7     SA1    =1H
          SA3    L.BIT
          SA5    O.BIT
          BX6    X1 
          SB7    X3 
          SA6    MRBA 
          SX0    -MRBC
          EQ     B6,B7,MRB   IF I = L.BIT 
  
 MRB8     SA1    X5+B6       BIW = BIT(I) 
          LX1    59-BI.RBP
          PL     X1,MRB11    IF ^RB[BIW]
 MRB9     SB6    B6+2        I = I + 2
          LT     B6,B7,MRB8  IF I < L.BIT 
  
 MRB10    RJ     LAL         LIST LAST LINE 
          EQ     MRB
  
 MRB11    LX1    1+BI.RBP-BI.FLNP 
          SX1    X1 
          CALL   CDD         CONVERT LINE NUMBER
          SA6    A6+B1       STORE IN LINE BUFFER 
          SX0    X0+B1
          MI     X0,MRB9     IF NOT A FULL LINE 
  
          RJ     LAL         LIST LINE
          EQ     MRB7 
  
 MRBA     DATA   H* STATEMENTS BEGINNING AT BELOW LINE NUMBERS ARE UNREA
,CHABLE ( DEAD CODE ), AND WILL NOT BE PROCESSED* 
 MRBB     DATA   8L 
 MRBC     EQU    MRBB-MRBA-1
 MRBD     DATA   28L     DEAD CODE IN - NAMEXXX 
 LAL      SPACE  3           LAL
**        LAL - LIST A LINE 
  
 LAL      ROUTINE 
          SA4    MRBB 
          SX7    B6 
          BX6    X4 
          SA6    A6+B1
          SB7    A6+B1
          SA7    I
          LISTL  MRBA,B7-MRBA 
          SA3    I
          SB6    X3+2        I = I + 2
          EQ     LAL
 FGS      TITLE  FGS - FORM GRAPH STRUCTURE TABLES
**        FGS - FORM GRAPH STRUCTURE TABLES 
*         FORM EDGE INDEX AND COMPRESS EDGE TABLES FROM *CFT* . 
  
 FGS      ROUTINE 
          SX1    B1 
          LX1    CF.FROMP 
          ADDWRD CFT,X1      FLOW( 1 , 0 ) */ DUMMY EXIT EDGE 
          ADDWRD CFT,B0      ADDWRD( CFT , 0 )
          SX1    X3-1 
          SB7    X2 
          MX0    60-CF.JPP
          BX6    X3 
          SB6    B0 
          BX0    -X0
          MX5    0
          SA6    LC          LC = L.CFT    */ SAVE IN CASE GRAPH REDONE 
          CALL   SST         SORT( CFT , [FROM,TO] )
          TRACE  FGS,CFT
  
*         ALLOCATE SPACE FOR EDGE INDEX AND EDGE TABLES 
  
          SA5    N.BLK
          SA3    L.CFT
          IX6    X5+X3
          SX1    X6+3 
          ALLOC  GST,X1      ALLOC( GST , 3+N.BLK+L.CFT ) 
          SB5    B6+2 
          SX6    B5+X2       EIB = O.GST + OLD(L.GST) + 2 
          SX7    B6 
          SA7    LB+1        LB(2) = OLD(L.GST)  */ BASE OF THIS GRAPH
          SA6    EIB
          SX4    X5+B1
          IX7    X6+X4       ETB = EIB + 1 + N.BLK
          SA7    A6+B1
  
*         SCAN *CFT* AND SET SUCCESSOR INDEX INFO IN *GST*
*         NOTE THAT EVERY BLOCK, EXCEPT THE EXIT BLOCK HAS A SUCCESSOR, 
*         EXCEPT LOOPS THAT HAVE NO EXITS.
  
          SA1    O.CFT
          SB2    X6          E0 = EIB 
          SB4    X7          EF = ETB 
          SB7    X1          CF = [O.CFT] 
          SX6    2000B
          SA5    X1          CI = [O.CFT] 
          LX6    EI.NSP 
          MX4    1+CF.TOL 
          LX4    CF.TOL 
          MX1    -CF.FROML
          SB3    B4-B1
  
 FGS0     SA6    B3          FOR I = ETB-1 TO EIB;  NS[I] = 0 
          SB3    B3-B1
          GE     B3,B2,FGS0 
          BX7    X4*X5
          LX1    CF.FROMP 
          MX0    -CF.JPP
          SA7    B4          ET = ETB;  [ET] = JPTO[CI] 
          SX2    2000B
          LX2    EI.NPP 
  
 FGS1     BX3    X5          CL = [CI]
          SA5    A5+B1       CI = CI + 1
          BX7    X3-X5
          BX6    -X0*X7 
          NZ     X6,FGS1A    IF FROMTO[CI] " FROMTO[CL] 
  
          SA3    A7 
          BX6    X0*X5
          BX7    X6+X3       [ET] = [ET] ! JP[CI]  */ OR *JP* BIT 
          SA7    A7 
          EQ     FGS1 
  
 FGS1A    BX7    X4*X5
          SA7    A7+B1       ET = ET + 1;  [ET] = JPTO[CI]
          BX6    -X1*X6 
          ZR     X6,FGS1     IF FROM[CI] = FROM[CL] 
  
          SB3    A7-B4       NS = ET - EF 
          SX6    B4-B2       SUI = EF - E0
          PX7    B3,X6
          LX3    -CF.FROMP   J = FROM[CL] 
          SB4    A7          EF = ET
          LX7    EI.SUIP
          BX6    X2+X7
          SA6    B2+X3       (NS,SUI)[EI+J] = (NS,SUI)
          NZ     X5,FGS1     IF [CI] " 0
  
*         SET INTERVAL LIST POINTERS IN GRAPH HEADER WORD 
  
          SA4    O.GST
          SA3    N.BLK
          SB5    X4-1 
          LX3    GB.NBP      NB[GB] = N.BLK 
          SX6    A7-B5
          SA6    L.GST       L.GST = ET + 1 - O.GST 
          SA6    ILB         ILB = L.GST   */ INTERVAL LIST BASE
          SX6    A7-B2
          SX6    X6+B1       ILI[GB] = ET+1 - EIB  */ INTERVAL LIST INDEX 
          LX6    GB.ILIP
          IX7    X3+X6
          SA7    B2-B1       GB= EIB - 1
  
*         SWAP FROM, TO FIELDS IN *CFT* AND SORT TABLE
  
          MX0    60-CF.JPP
          SA5    B7          CI = CF
          SB5    CF.FROMP 
 FGS2     BX6    -X0*X5      SWAP( FROM[CI] , TO[CI] )
          SA5    A5+B1       CI = CI + 1
          LX7    B5,X6
          SA7    A5-B1
          NZ     X5,FGS2     IF [CI] " 0
  
          SX1    A5-B7       L.CFT = CI - CF  */ FOR SORT 
          CALL   SHL         SORT( CFT , [FROM,TO] )
  
*         ADD THE PREDECESSOR INFORMATION TO THE EDGE TABLES
  
          SA1    O.CFT
          SA3    EIB
          SA2    A3+B1
          MX0    -CF.TOL
          SA5    X1          CI = [O.CFT] 
          SA4    X2          ET = [ETB] 
          SB2    X3          E0 = EIB 
          SB4    A4          EF = ET
          BX2    -X0*X5 
          LX2    ET.PREDP 
          MX1    -CF.FROML
          BX6    X2+X4       PRED[ET] = TO[CI]
          LX1    CF.FROMP 
          SA6    A4 
  
 FGS3     BX3    X5          CL = [CI]
          SA5    A5+B1       CI = CI + 1
          BX7    X3-X5
          ZR     X7,FGS3     IF [CI] = CL 
          SA4    A4+B1       ET = ET + 1
          BX2    -X0*X5 
          LX2    ET.PREDP 
          IX6    X2+X4
          SA6    A4          PRED[ET] = TO[CI]
          BX2    -X1*X7 
          ZR     X2,FGS3     IF FROM[CI] = FROM[CL] 
  
          LX3    -CF.FROMP
          SB5    A4-B4       NP = ET - EF 
          SX6    B4-B2       PRI = EF - E0
          SA2    B2+X3       EI = EIB + FROM[CL]
          PX6    B5,X6
          LX6    EI.PRIP
          SB4    A4          EF = ET
          BX7    X2+X6
          SA7    A2          NP[EI] = NP;  PRI[EI] = PRI
          NZ     X5,FGS3     IF [CI] " 0
  
*         ADJUST GRAPH TABLES TO REMOVE DUMMY EXIT EDGE INFO
  
          SA2    B2+B1       EI1 = EIT(1) 
          SA1    B2          EI0 = EIT(0) 
          SX7    B1 
          LX7    EI.NSP 
          IX2    X2-X7       NS[EI1] = NS[EI1] - 1
          LX7    EI.SUIP-EI.NSP 
          IX6    X2+X7       SUI[EI1] = SUI[EI1] + 1
          LX7    EI.NPP-EI.SUIP 
          SA6    A2 
          IX1    X1-X7       NP[EI0] = NP[EI0] - 1
          LX7    EI.PRIP-EI.NPP 
          IX6    X1+X7       PRI[EI0] = PRI[EI0] + 1
          SA6    A1 
  
          SA1    O.GST
          SX2    B2 
          IX6    X2-X1       EII = EIB - O.GST  */ MAKE RELATIVE
          SA6    EII
  
          TRACE  FGS.X,GST
          EQ     FGS
 FIS      TITLE  FIS - FORM INTERVAL STRUCTURE
**        FIS - FORM INTERVAL STRUCTURE OF A PROGRAM FLOW GRAPH 
* 
*         THE ALGORITHM FOR INTERVAL FORMATION USED HERE IS A VARIANT OF
*         THE ONE DESCRIBED IN AHO-ULLMAN, VOLUME II, PAGES 937 - 941 . 
*         THE BACK DOMINATOR CALCULATION IS DERIVED IN THE
*         ARTICLE BY FRAN ALLEN IN THE JULY 1970 SIGPLAN. 
  
*         B-REGISTER ASSIGNMENT FOR INTERVAL FORMATION/ BACK DOMINATOR
*         CALCULATION LOOPS 
  
*         B2, B3 - SCRATCH, LOOP COUNTS 
 IB       MICRO  1,,/B4/     IBA - INTERVAL BASE ADDRESS
 GS       MICRO  1,,/B5/     O.GST
 PC       MICRO  1,,/B6/     PC - TEMP SCRATCH TABLE
 EI       MICRO  1,,/B7/     EIB - FWA OF EDGE INDEX TABLE
  
*         FOR BACK DOMINATOR CALC B4, B7 AS ABOVE AND B5, B6  ARE BV , T
 BV       MICRO  1,,/B5/     BV - O.RND , BIT VECTOR TABLE
 T        MICRO  1,,/B6/     T - TEMP SCRATCH TABLE 
  
 FIS      ROUTINE 
          SA5    N.BLK
          SX0    X5+2 
          BX1    X0 
          LX1    2
          ALLOC  GST,X1      ALLOC( GST , 4*(N.BLK+2) ) 
          SA4    EII
          SB2    X5          N = N.BLK
          S"GS"  X2 
          S"EI"  "GS"+X4     EIB = O.GST + EII
          IX3    X2+X3
          IX6    X3-X0       HTL = O.GST + L.GST - ( N.BLK + 2 )
          S"PC"  X6+B1       O.PCT = HTL + 1
          SA6    HTL
  
*         SETUP HEADER NODE LIST AND PRED COUNT TABLE 
  
          SX7    B1 
          SA7    X6          HI = HTL;  [HI] = 1
          SA0    A7-B1       HI = HI - 1
  
          SA5    "EI"+B1     EI = EIB + 1 
          SA4    FISB 
          BX6    X4 
          SA6    "PC"        PI = O.PCT;  INI[PI] = 1 */ EXIT NODE *INI*
          SX0    B1 
          LX0    I.1PP
  
 FIS1     LX5    -EI.PRIP 
          UX4    B3,X5
          SX6    B3 
          LX6    I.PCP
          NE     B3,B1,FIS1A IF NP[EI] " 1
          BX6    X0+X6       1P[P2+1] = 1 
 FIS1A    SA6    A6+B1       PI = PI + 1]  PC[PI] = NP[EI]
          SB2    B2-B1       N = N - 1
          SA5    A5+B1       EI = EI + 1
          NZ     B2,FIS1     IF N " 0 
 FIS      SPACE  2,8
*         INTERVAL FORMATION LOOP 
*         SELECT NEXT HEADER NODE AS MIN OF NODES IN HEADER LIST NOT IN 
*         AN INTERVAL, TO AVOID BLOCK NUMBER REVERSALS AND EXCESSIVE
*         RANDOM READS LATER ON IN *GPO*. 
  
          SA1    ILB
          S"IB"  "GS"+X1     IBA = O.GST + ILB  */ INTERVAL BASE ADDRESS
          TRACE  FIS1,GST 
  
 FIS2     SA3    HTL
          MX7    0
          SA7    A0          [HI] = 0      */ SEARCH TERMINATOR 
          SB3    377777B     MHN = *INFINITY*  */ MIN *HN*
          MX0    0           HNA = 0       */ HEADER NODE ADDRESS 
          SA5    X3+B1       J = HTL + 1
  
 FIS3     SA5    A5-B1       J = J - 1;  HN = [J] 
          SB2    X5 
          ZR     X5,FIS4     IF HN = 0
          GE     B2,B3,FIS3  IF HN > MHN
          SA4    "PC"+X5
          LX4    59-I.INIP
          MI     X4,FIS3     IF INI[PCT(HN)]
          SX0    A5          HNA = J
          SB3    B2          MHN = HN 
          EQ     FIS3 
  
 FIS4     ZR     X0,FIS15    IF HNA = 0    */ NOTHING FOUND 
          SA5    X0          HN = [HLA] 
          SA1    A0+B1
          BX6    X1 
          SA6    A5          SWAP( [HI+1] , [HLA] ) 
          BX7    X5 
          SA7    A1 
          SA0    A0+B1       HI = HI + 1
          SA4    "PC"+X5     PCW = PCT(HN)
  
*         NOW REMOVE ANY ENTRIES THAT ARE *INI* 
  
 FIS4A    SA2    X3          J = [HTL]
          SA1    "PC"+X2
          SX3    X3-1        HTL = HTL - 1
          LX1    59-I.INIP
          MI     X1,FIS4A    IF INI[PCT(J)] 
          SX7    X3+B1
          SA7    A3          HTL = HTL + 1
  
          MX6    0
          SA6    FTH         FTH = 0
 FIS      SPACE  3,14 
*         PLACE HEADER NODE IN INTERVAL 
  
          MX1    -ET.JPP
          BX6    X1*X5
          SA6    "IB"        [IBA] = JP[HN]  */ SAVE *JP* INDICATOR 
          SX5    X5 
          LX4    -I.PCP 
          SX6    X4 
          SA2    FISA 
          BX7    X2+X5
          SA7    "IB"+B1     II = IBA + 1;  [II] = INTM(AP,HN,0,0,HN) 
          SA6    NPH         NPH = PC[PCW] */ N.PRED TO HN ON ENTRY 
  
          LX4    I.PCP
          SX0    B1 
          LX0    I.PCP
          LX5    I.HNP
          MX3    1
          LX3    1+I.INIP 
          BX1    X3+X5
          LX3    I.INHP-I.INIP
          BX2    X3+X5
          SX7    A7 
          LX7    I.IAP
          LX6    I.PCP
          IX3    X6+X7
          BX6    X3+X1       PCT(HN) = ITW(INI,0,HN,II,NPH) 
          SA6    A4 
  
*         SCAN THE ELEMENTS IN THE INTERVAL AND DECREMENT THE PRED COUNT
*         OF THEIR SUCCESSORS, AND ADD NODES TO INTERVAL IF ALL PRED
*         ARE IN IT, AND NODE WAS FIRST REACHED IN THIS INTERVAL. 
*         (A5) = ICN, FETCH ADDR  , (A7) = II, STORE ADDR 
*         (X0) = 1, (X1) = *INI*+BN[HN], (X2) = *INH*+BN[HN]
  
          SA5    A7          ICN = II      */ INDEX TO CURRENT NODE 
          BX7    -X5
          SB2    X7          HN = BN[II]
  
 FIS5     LX5    -IM.BNP
          SA4    "EI"+X5     EI = EIB + BN[ICN] 
          LX4    -EI.SUIP 
          UX7    B3,X4       N = NS[EI] 
          SA4    "EI"+X4     SI = EIB + SUI[EI] 
          LE     B3,FIS10A   IF N @ 0 
  
 FIS6     LX4    -ET.SUCCP   I = SUCC[SI] 
          SA3    "PC"+X4     PW = PCT(I)
          IX6    X3-X0       PC[PW] = PC[PW] - 1
          LX3    59-I.INIP
          LX7    B1,X3
          SA6    A3 
          MI     X3,FIS9     IF INI[PW] 
          MI     X7,FIS7     IF INH[PW] 
  
*         CHECK ADD TO HEADER LIST
  
          SX7    X6 
          ZR     X7,FIS8     IF PC[PW] = 0
          BX6    X2+X6       INH[PW] = 1;  HN[PW] = HN
          SA6    A6 
          SX6    X4 
          LX4    ET.SUCCP+59-ET.JPP 
          MX7    1
          BX4    X7*X4
          BX6    X4+X6       [HI] = JP[SI] ! I
          SA6    A0 
          SA0    A0-B1       HI = HI - 1
          EQ     FIS10
  
*         IN HEADER LIST, CHECK ADD TO INTERVAL 
  
 FIS7     SX7    X6 
          BX3    X6-X2
          NZ     X7,FIS10    IF PC[PW] " 0
          LX3    -I.HNP 
          SX7    X3 
          NZ     X7,FIS10    IF HN[PW] " HN */ FIRST REACHED BY ANOTHER 
  
*         ADD NODE TO THIS INTERVAL 
  
 FIS8     SX7    X4 
          SA7    A7+B1       II = II + 1;  [II] = I 
          SX3    A7 
          LX3    I.IAP
          SX7    X6                        */ PRESERVE PRED COUNT 
          BX3    X3+X7
          BX6    X3+X1       INI[PW] = 1;  IA[PW] = II
          SA6    A3 
  
*         CHECK IMMEDIATE SUCC AND ADD IT TO THE INTERVAL IF IT 
*         IS THE ONLY EDGE BETWEEN THE ADDED NODE AND THE SUCCESSOR.
  
          SA3    "EI"+X4     EI = EIB + I 
          LX3    -EI.SUIP 
          UX7    B1,X3
          SX6    B1-1 
          SB1    1
          NZ     X6,FIS10    IF NS[EI] > 1
          SA3    "EI"+X3     SIS = EIB + SUI[EI]
          LX3    -ET.SUCCP
          SX4    X3          I = SUCC[SIS]
          SA3    "PC"+X4     PW = PCT(I)
          LX3    59-I.1PP 
          SX6    B1          PC[PW] = 1 
          MI     X3,FIS8     IF 1P[PW]     */ ONLY 1 PRED 
          EQ     FIS10
  
 FIS9     SX3    B2+X4
          NZ     X3,FIS10    IF SUCC[SI] " HN 
  
          LX0    IM.LNP 
          BX6    X0+X5       LN[ICN] = 1   */ INDICATE A LATCHING NODE
          SA6    A5 
          SX0    B1 
          SX6    B1 
          LX4    59-ET.JPP+ET.SUCCP 
          MI     X4,FIS10    IF JP[SI]     */ REACHED BY A JUMP 
  
          SA6    FTH         FTH = 1       */ INDICATE FALL THROUGH TO H
  
 FIS10    SB3    B3-B1       N = N - 1
          SA4    A4+B1       SI = SI + 1
          GT     B3,FIS6     IF N > 0 
  
*         CONTINUE THIS INTERVAL IF ELEMENTS WERE ADDED 
  
 FIS10A   SB3    A5 
          SX6    A7-B3
          ZR     X6,FIS11    IF II = ICN   */ END OF INTERVAL 
  
          SA5    A5+B1       ICN = ICN + 1
          EQ     FIS5 
 FIS      SPACE  2,14 
*         TERMINATE THIS INTERVAL, SETUP HEADER WORD
  
 FIS11    SA1    "IB"+B1     IHA = IBA + 1
          SA2    NPH
          LX1    -IM.BNP     HN = BN[IHA]  */ HEADER NODE 
          SA3    "PC"+X1
          LX3    -I.PCP 
          SX5    X3 
          IX0    X2-X5       N.LN = NPH - PC[ PCT(HN) ] 
          SA4    "EI"+X1     EI = EIB + HN
          LX1    IM.BNP 
          LX4    -EI.PRIP 
          SA2    "IB"        IB0 = IBA;  GLN = [IBA] */ GL NEEDED FLAG
          UX4    B3,X4
          SX5    B3 
          IX3    X5-X0       N.XP = NP[EI] - N.LN 
          SB2    X3 
          SX7    A5-"IB"     NODE[IBA] = ICN - IBA */ N.NODES IN INTERVA
          SX6    X7+B1
          LX7    IP.NODEP 
          S"IB"  "IB"+X6     IBA = IBA + NODE[IBA] + 1  */ ADVANCE *IBA*
          EQ     B2,B1,FIS11A      IF N.XP = 1
          MX2    1           GLN = 1
 FIS11A   LX2    1+IP.GLP 
          BX7    X2+X7       GL[IB0] = GLN
          LX0    IP.NIPP
          BX7    X0+X7       NIP[IB0] = N.LN  */ N.INTERNAL PRED
          SA7    A2 
          ZR     X0,FIS2     IF N.LN = 0   */ NO LATCHING NODES 
  
          SA3    L.LCT
          LX2    -IP.GLP
          IX6    X2+X3       L.LCT = L.LCT + GLN
          SA6    A3 
          SA3    FTH
          SA2    =XN.FTH
          IX6    X2+X3       N.FTH = N.FTH + FTH
          SA6    A2 
          LX3    IP.FTP 
          BX7    X3+X7       FT[IB0] = FTH
          SA2    CBN         PB[IB0] = CBN */ SET PROLOGUE BLOCK NUMBER 
          SX6    X2+B1       CBN = CBN + 1
          LX2    IP.PBP 
          SA6    A2 
          BX7    X2+X7
          SA7    A7 
  
*         MARK NODES THAT ARE IN *SCR* OF INTERVAL
*         BY MARKING ALL PRED OF THE LN AS *SCR*
  
          SA5    A5+B1       II = ICN + 1 
          MX0    1
          LX0    1+IM.SCRP
          SB2    59-IM.LNP
  
 FIS12    SA5    A5-B1       II = II - 1
          LX6    B2,X5
          LX5    59-IM.SCRP 
          BX3    X6+X5
          PL     X3,FIS12    IF ^(LN[II] ! SCR[II]) 
          LX5    1+IM.SCRP
          BX7    X0+X5       SCR[II] = 1   */ MARK NODE AS IN SCR 
          LX6    IM.LNP-IM.HNP
          SA7    A5 
          MI     X6,FIS2     IF HN[II]     */ END OF INTERVAL 
  
          LX5    -IM.BNP
          SA4    "EI"+X5     EI = EIB + BN[II]
          LX4    -EI.PRIP 
          UX6    B3,X4       N = NP[EI] 
          SA3    "EI"+X4     PI = EIB + PRI[EI] 
  
 FIS13    LX3    -ET.PREDP
          SA2    "PC"+X3
          LX2    -I.IAP      NA = IA[PCT(PRED[PI])] 
          SA1    X2 
          BX6    X0+X1       SCR[NA] = 1
          SA6    A1 
          SB3    B3-B1       N = N - 1
          SA3    A3+B1       PI = PI + 1
          NZ     B3,FIS13    IF N " 0 
  
          EQ     FIS12
 FIS      SPACE  3
*         TERMINATE INTERVAL LIST 
  
 FIS15    MX6    0
          SA6    "IB"        [IBA] = 0     */ LIST TERMINATOR 
          SA2    PBN
          SA3    CBN
          SX1    "IB"-"GS"
          SA4    "EI"-B1     GB = EIB - 1 
          IX6    X3-X2       SCR = CBN - PBN */ NUMBER OF LOOPS 
          SX2    X6 
          SX7    X1+B1       L.GST = IBA + 1 - O.GST
          SA7    L.GST
          SA6    SCR
          LX6    GB.NLPP
          BX6    X6+X4       NLP[GB] = SCR */ N. LOOPS
          SA6    A4 
          SA1    =XM.LP 
          IX3    X1-X2
+         PL     X3,*+1      M.LP = MAX( M.LP , SCR ) 
          BX6    X2 
          SA6    A1 
  
*         SETUP FOWARD/BACKWARD LINKS IN GRAPH
  
          SA2    LB 
          SA3    A2+B1
          IX6    X7-X3       LF = L.GST - LB(2) 
          LX2    GA.LBP 
          LX6    GA.LFP 
          BX7    X6+X2
          SA7    "EI"-2      [EIB-2] = GA(LB,LF)
          SA4    M.GRL
+         IX1    X6-X4
          MI     X1,*+1      M.GRL = MAX( M.GRL , LF )
          SA6    A4 
 FIS      SPACE  3,14 
*         MARK THE EXIT NODES OF THE INTERVALS. THEY ARE THE PRED OF THE
*         INTERVAL HEADER NODES.
  
          SA1    ILB
          SX0    B1 
          LX0    IM.ENP 
          SB2    -B0         HN = 0        */ START WITH PROG EXIT
          SA1    "GS"+X1     NIP = O.GST + ILB  */ NEXT TO PROCESS
  
 FIS16    SA5    "EI"-B2     EI = EIB + HN
          LX5    -EI.PRIP 
          UX6    B3,X5       N = NP[EI] 
          SA4    "EI"+X5     PI = EIB + PRI[EI] 
          LE     B3,FIS19    IF N @ 0 
  
 FIS17    LX4    -ET.PREDP
          SA3    "PC"+X4
          LX3    -I.IAP 
          SA2    X3          NA = IA[PCT(PRED[PI])] 
          LX3    I.IAP-I.HNP
          SX5    X3+B2
          ZR     X5,FIS18    IF HN[NA] = HN  */ PRED IN THIS INTERVAL 
          BX6    X0+X2
          SA6    A2          EN[NA] = 1 
  
 FIS18    SB3    B3-B1       N = N - 1
          SA4    A4+B1       PI = PI + 1
          NZ     B3,FIS17    IF N " 0 
  
 FIS19    LX1    -IP.NODEP
          SB3    X1 
          ZR     B3,FIS20    IF NODE[NIP] = 0  */ END OF INTERVAL LIST
          SA2    A1+B1
          LX2    -IM.BNP
          BX3    -X2
          SB2    X3          HN = BN[NIP+1] 
          SA1    A2+B3       NIP = NIP + NODE[NIP]
          EQ     FIS16
  
  
*         SETUP THE *BI* FIELD IN THE INTERVAL MEMBERS
  
 FIS20    SA1    L.OTI
          SA2    ILB
          ZR     X1,FIS23    IF L.OTI = 0  */ FIRST GRAPH 
  
          SA3    O.OTI
          SA5    "GS"+X2     IP = O.GST + ILB 
          MX6    0
          SB3    X3          T = O.OTI
          SA6    A1          L.OTI = 0
  
 FIS21    LX5    -IP.NODEP
          SB2    X5+         N = NODE[IP] 
          SA5    A5+1        IP = IP + 1
  
 FIS22    LX5    -IM.BNP
          SA4    B3+X5
          LX5    IM.BNP 
          LX4    IM.BIP+1 
          BX6    X4+X5       BI[IP] = 2*T(BN[IP]) 
          SA6    A5 
          SB2    B2-B1       N = N - 1
          SA5    A5+B1       IP = IP + 1
          NZ     B2,FIS22    IF N " 0 
          NZ     X5,FIS21    IF [IP] " 0
  
          EQ     FIS26
  
*         SET *BI* FIELD FOR *IM* IN FIRST GRAPH
  
 FIS23    SA5    "GS"+X2     IP = O.GST + ILB 
          SB2    IM.BIP+1 
  
 FIS24    LX5    -IP.NODEP
          SB3    X5+         N = NODE[IP] 
          SA5    A5+1        IP = IP + 1
  
 FIS25    LX5    -IM.BNP
          SX4    X5 
          LX5    IM.BNP 
          LX3    B2,X4
          BX6    X3+X5       BI[IP] = 2*BN[IP]
          SA6    A5 
          SB3    B3-B1       N = N - 1
          SA5    A5+B1       IP = IP + 1
          NZ     B3,FIS25    IF N " 0 
          NZ     X5,FIS24    IF [IP] " 0
 FIS      SPACE  3,14 
*         RESCAN THE INTERVALS AND REORDER THEM SO AS TO GET RID OF ANY 
*         REVERSALS WHICH ARE NOT CONSISTANT WITH PROGRAM ORDER.
  
 FIS26    SA5    "GS"+X2     IP = O.GST + ILB 
  
 FIS27    LX5    -IP.NODEP
          SB2    X5-2        N = NODE[IP] - 2 
          GT     B2,FIS28    IF N > 2 
          SB2    X5+B1
          SA5    A5+B2       IP = IP + N+1
          NZ     X5,FIS27    IF [IP] " 0
          EQ     CBD
  
*         SCAN INTERVAL AND CHECK FOR REVERSALS 
  
 FIS28    SA0    A5          IPF = IP 
          SA5    A5+2        IP = IP + 2   */ FIRST AFTER HEADER
          SB6    B0          SWAP = 0 
          BX7    X5          LIW = [IP] 
          LX5    -IM.BNP
          SB5    X5 
  
 FIS29    SA5    A5+B1       IP = IP + 1
          SB2    B2-B1       N = N - 1
          LX5    -IM.BNP
          SB4    X5+
          LX5    IM.BNP 
          GT     B4,B5,FIS31 IF BN[IP] > BN[LIW]  */ IN ORDER 
  
*         SWAP NODES IF *LIW* IS NOT A PRED OF *IP* 
  
          SA4    "EI"+X7     EI = EIB + BN[LIW] 
          SB4    -B4
          LX4    -EI.SUIP 
          SA3    "EI"+X4     SI = EIB + SUI[EI] 
          UX6    B3,X4       NS = NS[EI]
  
 FIS30    LX3    -ET.SUCCP
          SX6    B4+X3
          ZR     X6,FIS31    IF SUCC[SI] = BN[IP] 
          SB3    B3-B1       NS = NS - 1
          SA3    A3+B1       SI = SI + 1
          NZ     B3,FIS30    IF NS " 0
  
          BX6    X5 
          SA6    A5-B1       [IP-1] = [IP]
          SA7    A5          [IP] = LIW 
          BX5    X7 
          SB6    B1          SWAP = 1 
  
 FIS31    BX7    X5          LIW = [IP] 
          LX5    -IM.BNP
          SB5    X5 
          NZ     B2,FIS29    IF N " 0 
          ZR     B6,FIS32    IF SWAP = 0   */ NO INTERCHANGES 
          SA5    A0          IP = IPF 
          LX5    -IP.NODEP
          SB2    X5-2        N = NODE[IP] - 2 
          EQ     FIS28
  
 FIS32    SA5    A5+B1       IP = IP + 1
          NZ     X5,FIS27    IF [IP] " 0
 CBD      TITLE  CBD - COMPUTE BACK DOMINATORS
**        CBD - COMPUTE BACK DOMINATORS 
* 
*         RESCAN THE INTERVAL LIST AND COMPUTE THE BACK DOMINATORS AND
*         INTERVAL ARTICULATION POINTS. THE FORMULAS USED ARE - 
*         BD(B) = & ( IP ! BD(IP) ) , IP  AN IMMEDIATE PRED OF B
*         AP(INT) = & ( B ! BD(B) ) , B AN EXIT NODE
*         THE BIT VECTORS BVT(I) = I ! BD(I)
  
*         SETUP BLOCK TO INTERVAL TRANSITION TABLE
  
 CBD      MX6    0
          TRACE  FIS.X,GST
          SA6    L.CFT       L.CFT = 0
          SA2    N.BLK
          ALLOC  CFT,X2+B1   ALLOC( CFT , N.BLK + 1 ) 
          SA4    O.GST
          SA5    ILB
          S"T"   X2          T = O.CFT
          IX6    X4+X5
          SA5    X6          II = O.GST + ILB 
          SX0    B1 
          SB2    B0          MB = 0        */ MAX N.BLOCKS IN INTERVAL
          LX0    I.WIP
          SX1    B1 
          LX1    I.NIP
          SB5    48 
  
 CBD1     LX5    -IP.NODEP
          SB3    X5          NN = NODE[II]
          SB4    B0          BITN = 0 
          MX2    0           WI = NI = 0
          SA5    A5+B1       II = II + 1
          GE     B2,B3,CBD2  MB = MAX( MB , NN )
          SB2    B3+
  
 CBD2     PX6    B4,X2
          LX5    -IM.BNP
          SA6    "T"+X5      T(BN[II]) = TTW(BITN,WI,NI)
          SB4    B4+B1       BITN = BITN + 1
          IX2    X2+X1       NI = NI + 1
          LT     B4,B5,CBD3  IF BITN < 48 
          IX2    X2+X0       WI = WI + 1
          SB4    B0          BITN = 0 
 CBD3     SB3    B3-B1       NN = NN - 1
          SA5    A5+B1       II = II + 1
          NZ     B3,CBD2     IF NN " 0
  
          NZ     X5,CBD1     IF [II] " 0   */ NOT END OF INTERVALS
  
*         ALLOCATE SPACE FOR A BIT VECTOR TABLE 
  
          SX1    B2+47
          SX2    B5 
          IX7    X1/X2,B6    VM = (MB+47) / 48
          SX2    B2+B1
          IX1    X2*X7
          ALLOC  RND,X1      ALLOC( RND , (MB+1)*VM ) 
  
          SA1    O.GST
          SA3    ILB
          SA5    EII
          SB3    X1 
          S"BV"  X2          BV = O.RND    */ BASE OF BIT VECTOR TABLE
          S"EI"  B3+X5       EIB = O.GST + EII
          SA2    O.CFT
          SA4    B3+X3       IP = O.GST + ILB 
          S"T"   X2          T = O.CFT
  
*         PROCESS NEXT INTERVAL 
  
 CBD4     LX4    -IP.NODEP
          S"IB"  A4+B1       IBA = IP + 1  */ INTERVAL BASE ADDR ( ( HNA )
          SB2    X4          NN = NODE[IP]
          SX6    "IB"+B2     IP = IBA + NN
          SA6    IP 
          NE     B2,B1,CBD6  IF NN " 1
  
 CBD5     SA3    IP 
          SA4    X3+
          NZ     X4,CBD4     IF [IP] " 0   */ IF NOT END OF LIST
          MX7    0
          SA7    L.CFT       L.CFT = 0
          SA7    L.RND
          TRACE  CBD.X,GST
          EQ     FIS
  
*         PROCESS INTERVAL WITH @ 48 NODES
  
 CBD6     SB3    48 
          GT     B2,B3,CBD12 IF NN > 48 
  
          SA0    B2-B1       NN = NN - 1
          SA5    "IB"+B1     II = IBA + 1  */ INDEX TO INTERVAL 
          SX0    B1 
          MX7    60          AN = -0
          SX6    B1 
          SA6    "BV"        BV(0) = 1     */ HEADER NODE 
  
*         COMPUTE BACK DOMINATORS OF NODES
*         BD = & BVT(IP)
  
 CBD7     LX5    -IM.BNP
          SA3    "EI"+X5     EI = EIB + BN[II]
          LX3    -EI.PRIP 
          UX6    B3,X3       N = NP[EI] 
          SA4    "EI"+X3     PI = EIB + PRI[EI] 
          SB2    A5-"IB"     I = II - IBA 
          MX1    60          BD = -0
  
 CBD8     LX4    -ET.PREDP
          SA3    "T"+X4 
          LX3    -I.NIP      J = NI[T(PRED[PI])]
          SA2    "BV"+X3
          SB3    B3-B1       N = N - 1
          BX1    X1*X2       BD = BD & BVT(J) 
          SA4    A4+B1       PI = PI + 1
          NZ     B3,CBD8     IF N " 0 
  
          LX2    B2,X0
          BX6    X1+X2       BVT(I) = BD ! SHIFT(1,I) 
          LX5    IM.BNP+59-IM.ENP 
          SA6    "BV"+B2
          PL     X5,CBD9     IF ^EN[II] 
          BX7    X6*X7       AN = AN & BVT(I) 
  
*         CALCULATE IMMEDIATE BACK DOMINATOR ORDINAL
  
 CBD9     PX1    X1 
          LX5    1+IM.ENP 
          SB3    47 
          NX2    B2,X1       FBD = 47-NORMC( PACK(BD) ) 
          SX4    B3-B2
          SA2    "IB"+X4
          LX4    IM.IBDP
          BX6    X4+X5       IBD[II] = FBD
          SA6    A5 
          LX0    IM.DOMP
          BX6    X0+X2       DOM[IBA+FBD] = 1 
          LX0    -IM.DOMP 
          SA6    A2 
  
          SB2    A0-B1       NN = NN - 1
          SA0    A0-B1
          SA5    A5+B1       II = II + 1
          NZ     B2,CBD7     IF NN " 0
  
*         PROPAGATE *AN* BIT VECTOR TO INTERVAL LIST
  
          SA4    "IB" 
          LX4    59-IM.ENP
          MI     X4,CBD5     IF EN[IBA]    */ HEADER IS AN EXIT NODE
          ZR     X7,CBD5     IF AN = 0
  
          SX1    B1 
          LX1    IM.APP 
  
 CBD11    PX5    X7 
          NX6    B2,X5
          SB2    B3-B2       J = 47 - NORMC(AN) 
          SA2    "IB"+B2
          LX4    B2,X0
          BX6    X1+X2       AP[IBA+J] = 1
          BX7    -X4*X7      AN = AN & ^SHIFT(1,J)
          SA6    A2 
          NZ     X7,CBD11    IF AN " 0
  
          EQ     CBD5 
 CBD      SPACE  3,14 
*         NODE[INTERVAL] > 48 , MULTI WORD BIT VECTOR CALCULATION 
  
 VL       MICRO  1,,/X1/     VECTOR LENGTH
 BI       MICRO  1,,/"BV"/   BVT(I) DURING MULTI WORD CALC
  
 CBD12    SX6    B2-B1       NN = NN - 1
          SA6    NN 
          SX2    B3 
          SX1    X6+B3
          I"VL"  X1/X2,B3    VL = (NN+48)/48  */ VECTOR LENGTH
  
*         INITIALIZE BIT VECTORS FOR ARTICULATION POINTS AND HEADER NODE
  
          MX6    60 
          SA6    "BV"        BVT(0) = -0
          SX7    B1 
          SA7    "BV"+"VL"   BVT(VL) = 1
          MX7    0
          SB2    X1          FOR I = 1 TO VL - 1, 
  
+         SA6    A6+B1       BVT(I) = 0 
          SB2    B2-1 
          SA7    A7+B1       BVT(I+VL) = 0
          GT     B2,B1,*-1   END
  
          SA5    "IB" 
          SA0    "BV" 
          S"BI"  "BV"+"VL"   BI = O.BVT + VL */ INDEX TO BIT VECTOR 
          LX5    -IM.BNP
          SA4    "T"+X5 
          SX6    "BI" 
          LX6    I.BVIP 
          BX7    X4+X6       BVI[T(BN[IBA])] = BI 
          SA7    A4 
          S"BI"  "BI"+"VL"   BI = BI + VL 
          SA5    A5+B1       II = IBA + 1  */ INTERVAL INDEX
  
*         CALCULATE BACK DOMINATOR OF THIS NODE 
  
 CBD14    LX5    -IM.BNP
          SA3    "EI"+X5     EI = EIB + BN[II]
          LX3    -EI.PRIP 
          UX6    B3,X3       N = NP[EI] 
          SA4    "EI"+X3     PI = EIB + PRI[EI] 
          LX4    -ET.PREDP
          SA3    "T"+X4      TW = T(PRED[PI]) 
          SB2    "VL"        I = VL 
          LX3    -I.BVIP
          SA2    X3          BJ = BVT[TW] 
          BX6    X2 
          SA6    "BI"        BK = BI;  [BK] = [BJ]
 CBD15    SA2    A2+B1       BJ = BJ + 1
          SB2    B2-B1       I = I - 1
          BX6    X2 
          SA6    A6+B1       BK = BK + 1;  [BK] = [BJ]
          GT     B2,B1,CBD15 IF I > 1 
          EQ     B3,B1,CBD17 IF N = 1 
  
 CBD16    SA4    A4+B1       PI = PI + 1
          LX4    -ET.PREDP
          SA3    "T"+X4 
          LX3    -I.BVIP
          SB2    "VL" 
          SA2    "BI" 
          RJ     ABV         BD(I) = BD(I) & BVT(PRED)
          SB3    B3-B1       N = N - 1
          GT     B3,B1,CBD16 IF N > 1 
  
*         CALCULATE IMMEDIATE BACK DOMINATOR
  
 CBD17    SA4    "BI"+"VL"   BJ = BI + VL 
          SB3    47 
  
 CBD18    SA4    A4-B1       BJ = BJ - 1
          ZR     X4,CBD18    IF [BJ] = 0
          PX6    X4 
          NX3    B2,X6
          SX2    A4-"BI"
          SB2    B3-B2
          LX2    4
          SX0    B1 
          LX3    B1,X2
          IX6    X2+X3
          LX0    IM.DOMP
          SX2    B2+X6       FBD = 47 - NORMC([BJ]) + 48*( BJ - BI )
          SA3    "IB"+X2
          BX6    X0+X3       DOM[IBA+FBD] = 1 
          SA6    A3 
  
          SA4    "T"+X5      TW = T(BN[II]) 
          LX5    IM.BNP 
          LX2    IM.IBDP
          BX6    X2+X5       IBD[II] = FBD
          SA6    A5 
          SX3    "BI" 
          LX3    I.BVIP 
          BX6    X3+X4       BVI[TW] = BI  */ INSTALL BIT VECTOR ADDRESS
          SA6    A4 
          UX4    B3,X4
          SX0    B1 
          LX4    -I.WIP      W = WI[TW] 
          SA2    "BI"+X4
          LX0    B3,X0
          BX7    X0+X2       BVT(BI+W) = BVT(BI+W) ! SHIFT(1,BITN[TW])
          SA7    A2 
          LX5    59-IM.ENP
          PL     X5,CBD19    IF ^EN[II]    */ IF NOT AN EXIT NODE 
          SB2    "VL" 
          SA2    A0 
          SX3    "BI" 
          RJ     ABV         AN = AN & BVT(BI)
  
 CBD19    SA2    NN 
          S"BI"  "BI"+"VL"   BI = BI + VL 
          SA5    A5+B1       II = II + 1
          SX6    X2-1        NN = NN - 1
          SA6    A2+
          NZ     X6,CBD14    IF NN " 0
  
          S"BV"  A0 
          SA2    "IB" 
          LX2    59-IM.ENP
          MI     X2,CBD5     IF EN[IBA]    */ IF HEADER IS AN EXIT NODE 
  
*         PROPAGATE *AN* BIT VECTOR TO INTERVAL MEMBERS 
  
          SB3    47 
          SA5    "BV"+"VL"   BI = O.BVT + VL
          SX2    B3+B1
          SX0    B1 
          IX2    X1*X2       WA = 48 * VL  */ WORD ADDEND 
          SX7    B1 
          LX7    IM.APP 
  
 CBD20    SX2    X2-48
          MI     X2,CBD5     IF WA < 0
          SA5    A5-B1       BI = BI - 1;  AN = [BI]
          ZR     X5,CBD20    IF AN = 0
  
 CBD21    PX6    X5 
          NX4    B2,X6
          SB2    B3-B2       J = 47 - NORMC(AN) 
          LX3    B2,X0
          SB2    B2+X2
          BX5    -X3*X5      AN = ^SHIFT(1,J) & AN
          SA3    "IB"+B2
          BX6    X7+X3       AP[IBA+WA+J] = 1 
          SA6    A3 
          NZ     X5,CBD21    IF AN " 0
          EQ     CBD20
  
 FISA     BFMW   IM,(AP,HN) 
 FISB     VFD    2/3,40/FISB,18/377777B 
 ABV      SPACE  2           ABV
**        ABV - *AND* BIT VECTORS 
* 
*         ENTRY  (B2) = VL , BIT VECTOR LENGTH
*                (A2) = ADDRESS OF OPERAND/RESULT BIT VECTOR
*                (X3) = ADDRESS OF SECOND OPERAND 
  
 ABV1     BX6    X2*X3
          SA3    A3+B1
          SB2    B2-B1
          SA6    A2 
          SA2    A2+1 
          GT     B2,ABV1
 ABV      ROUTINE 
          SA3    X3 
          EQ     ABV1 
 FDG      TITLE  FDG - FORM DERIVED GRAPH 
**        FDG - FORM DERIVED GRAPH OF A SET OF INTERVALS
*         THIS ROUTINE DEVIATES FROM THE NORMAL PROCEDURE THAT REDUCES
*         EACH INTERVAL TO A POINT. INSTEAD IT REDUCES ONLY THE STRONGLY
*         CONNECTED REGIONS OF AN INTERVAL TO A POINT AND LEAVES THE
*         REST OF THE BLOCKS ALONE. 
  
          DESCRIBE T.,60     T(OLD BN) = 30/NEW NODENUM,30/NEW BLOCK NUM
 NN       DEFINE 30          NEW NODE NUMBER
 NBN      DEFINE 30          NEW BLOCK NUMBER 
  
 FDG      ROUTINE 
          SA5    N.BLK
          ALLOC  OTI,X5+B1   ALLOC( OTI , N.BLK+1 )  */ TRANSITION TBL
          SA4    LC 
          SX0    X4+4 
          IX1    X0+X1
          ALLOC  CFT,X1      ALLOC( CFT , LC+5+N.BLK )
          IX1    X0+X2
          SB2    X1          O.T = O.CFT + LC+4  */ TEMP TABLE
          SA3    ILB
          SA4    O.GST
          SA0    X2          C0 = O.CFT 
          SX6    X2+B1       O.CFT = O.CFT + 1
          SA6    A2 
          SB4    X4 
          SA1    EII
          SA5    B4+X3       IP = O.GST + ILB 
          SB4    B4+X1       EIB = O.GST + EII
          MX6    0
          SA6    B2          T(0) = 0 
          SB6    1+IM.SCRP-IM.BIP 
  
*         CLEAR OUT TRANSITION TABLE IN CASE OF UNREACHABLE CODE
  
          SA4    N.BLK       N = N.BLK;  I = 0
          MX6    2
 FDG0     SX4    X4-1        N = N - 1
          SA6    A6+1        I = I + 1;  T(I) = 1S58
          NZ     X4,FDG0     IF N " 0 
  
*         FORM THE TRANSITION TABLE, AND REASSIGN NODE NUMBERS TO THE 
*         BLOCKS THAT ARE CONSISTANT WITH THEIR PROGRAM ORDER.
*         FIRST SCAN THE INTERVALS
  
 FTT1     LX5    -IP.NODEP
          SB3    X5          N = NODE[IP] 
          LX5    IP.NODEP-IP.PBP
          SX7    X5          HB = PB[IP]   */ NEW *BN* OF *SCR* 
          SA5    A5+B1       IP = IP + 1
          ZR     X7,FTT2     IF HB = 0     */ NO *SCR*
  
          LX5    -IM.BNP     HN = BN[IP]
          SA7    B2+X5       T(HN) = TTW(0,HB)
          MX0    1
          SX4    X5 
          BX7    X0+X7
          LX4    T.NNP
          BX7    X4+X7       TSW = TTW(1S29+HN,HB)
          EQ     FTT4 
  
 FTT2     LX5    59-IM.SCRP 
          PL     X5,FTT3     IF ^SCR[IP]
          LX5    1+IM.SCRP-IM.BNP 
          SA7    B2+X5       T(BN[IP]) = TSW
          EQ     FTT4 
  
 FTT3     LX3    B6,X5
          LX5    1+IM.SCRP-IM.BNP 
          SX6    X3 
          AX6    1
          SA6    B2+X5       T(BN[IP]) = TTW(0,BI[IP]/2)
  
 FTT4     SB3    B3-B1       N = N - 1
          SA5    A5+B1       IP = IP + 1
          NZ     B3,FTT2     IF N " 0 
          NZ     X5,FTT1     IF [IP] " 0
  
*         RESCAN THE TEMP TABLE AND ASSIGN NEW NODE NUMBERS TO THE NODES
*         THAT ARE ^SCR OR HEADER.
  
          SA2    N.BLK
          SX0    B1 
          SB3    B1          I = 1
          SB5    X2 
          LX0    T.NNP       J = 1
          BX1    X0 
  
 FTT5     SA4    B2+B3
          MI     X4,FTT6     IF T(I) < 0   */ SCR AND NOT HEADER
          BX6    X0+X4
          SA6    A4+         NN[T(I)] = J 
          IX0    X0+X1       J = J + 1
 FTT6     SB3    B3+B1       I = I + 1
          LE     B3,B5,FTT5  IF I @ N.BLK 
  
*         NOW SET THE *NN* OF THE ENTRIES THAT ARE SCR & ^HEADER
  
          MX6    1
          SB3    B1          I = 1
          LX6    -1 
          SA6    B2          T(0) = 1S58
  
 FTT7     SA4    B2+B3
          PL     X4,FTT8     IF T(I) > 0
          LX4    -T.NNP      OBN = NN[T(I)] 
          SA3    B2+X4
          BX6    X3          T(I) = T(OBN)
          SA6    A4 
 FTT8     SB3    B3+B1       I = I + 1
          LE     B3,B5,FTT7  IF I @ N.BLK 
  
          MX6    0
          SA6    B2          T(0) = 0 
  
*         SCAN TEMP TABLE AND SETUP *OTI* FOR USE BY *FIS*
  
          SA1    O.OTI
          AX0    T.NNP
          BX6    X0 
          SA6    L.OTI       L.OTI = J
          SB6    T.NNP
          SB3    X1 
          SA5    B2+X2       TI = O.T + NB
          SX6    X6-1 
          SA6    N.BLK
          MX7    0
          SA7    B3          OTI(0) = 0 
  
 FDG5     AX4    B6,X5
          SX6    X5 
          SA6    B3+X4       OTI(NN[TI]) = NBN[TI]
          SA5    A5-B1       TI = TI - 1
          NZ     X5,FDG5     IF [TI] " 0
  
*         REDUCE THE GRAPH BY REDUCING THE *SCR*"S OF THE INTERVALS TO
*         POINTS
  
          SB7    B1          I = 1
          SA7    A0          CI = C0
          MX6    -ET.JPP
          SB6    T.NNP
          MX0    CF.FROML 
          LX0    CF.FROML+CF.FROMP
  
 FDG6     SA4    B4+B7       EI = EIB + I 
          SA2    B2+B7
          LX2    CF.FROMP-T.NNP 
          BX1    X0*X2       FE = NN[T(I)] */ FROM EDGE 
          LX4    -EI.SUIP 
          UX7    B3,X4       N = NS[EI] 
          SA5    B4+X4       SI = EIB + SUI[EI] 
          SB7    B7+1        I = I + 1
          LE     B3,FDG9     IF N @ 0 
  
 FDG7     LX5    -ET.SUCCP
          SA3    B2+X5
          LX3    CF.FROMP-T.NNP 
          BX2    X0*X3       TE = NN[T(SUCC[SI])] 
          IX7    X1-X2
          LX2    CF.TOP-CF.FROMP
          ZR     X7,FDG8     IF FE = TE 
  
          BX5    X6*X5
          IX4    X1+X2
          BX7    X5+X4
          SA7    A7+B1       CI = CI + 1;  [CI] = CFTE(JP[SI], FE , TE )
  
 FDG8     SB3    B3-B1       N = N - 1
          SA5    A5+B1       SI = SI + 1
          NZ     B3,FDG7     IF N " 0 
  
 FDG9     LE     B7,B5,FDG6  IF I @ NB
  
          SB3    A0 
          SX6    A7-B3       L.CFT = CI - C0
          SA6    L.CFT
  
          TRACE  FDG.X,OTI
          EQ     FDG
  
          QUAL
  
 DGS      EQU    /CODE/DGS
  
 F.CFA    END 
