Extract from subroutine DCDCMP, from SPICE in the Perfect Club

This LOD is unusual in that is caused by a dependence carried by a scalar variable. Normally scalar dependences do not cause Read-After-Write hazards, as the scalar variables can typically held in registers. In this case, however, variable j is a parameter to a call to subroutine RESERVE at line 2968. In the absence of detailed inter-procedural information, this call acts as a use of j, thus preventing the elimination of the previous store to j at line 2962.

The table search loop at lines 2979 thru 2981 is actually compiled to execute entirely on the Control Unit! The compiler realises that the loop contains a loss of decoupling on each iteration and therefore does not attempt to generate decoupled code.

2959   C     FOR EACH COLUMN ELEMENT LOOK UP ROW NXTI
2960   C     
2961   130     if (locc .eq. 0) 
2961             goto 170
2962           j = nodplc(jcolno+locc)
2963   C     
2964   C     CHECK FOR FILL-IN (I,J)
2965   C     
2966           if (ipiv .le. 0) 
2966             goto 135
2967           call sizmem(jcpt, isize1)
2968           call reserv(i, j)
2969           call sizmem(jcpt, isize2)
2970           if (isize1 .eq. isize2) 
2970             goto 135
2971           call extmem(lvn, 1)
2972           nttbr = nttbr+1
2973           value(lvn+nstop+nttbr) = 0.0d0
2974   C     
2975   C     LOCATE ELEMENT (I,J)
2976   C     

2977 135 if (j .lt. i) 2977 goto 145 2978 locij = locc 2979 140 locij = nodplc(irpt+locij) 2980 if (nodplc(irowno+locij) .eq. i) 2980 goto 155 2981 goto 140 2982 145 locij = locr 2983 150 locij = nodplc(jcpt+locij) 2984 if (nodplc(jcolno+locij) .eq. j) 2984 goto 155 2985 goto 150 2986 155 value(lvn+locij) = value(lvn+locij)-value(lvn+locc)*value(lvn+locr) 2988 160 locc = nodplc(jcpt+locc) 2989 goto 130