Trailing-Edge
-
PDP-10 Archives
-
BB-4157F-BM_1983
-
fortran/compiler/goptim.bli
There are 12 other files named goptim.bli in the archive. Click here to see a list.
!THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
! OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
!COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1972, 1983
! Author: */AHM
MODULE GOPTIM(RESERVE(0,1,2,3),SREG=#17,VREG=#15,FREG=#16,DREGS=4,GLOROUTINES)=
BEGIN
SWITCHES NOLIST;
REQUIRE FIRST.BLI;
REQUIRE TABLES.BLI;
REQUIRE OPTMAC.BLI;
SWITCHES LIST;
GLOBAL BIND GOPTIV = 6^24 + 0^18 + 55; ! Version Date: 24-Sep-81
%(
***** Begin Revision History *****
52 ----- ----- REMOVE REFERENCES TO THISLEVL
***** Begin Version 4B *****
53 18869 404 FIX UP THE CREATION OF ASSOCIATE VARIABLE LIST, (DCE)
***** Begin Version 5B *****
54 ----- 733 IF RHS OF ASSIGNMENT STMNT RESOLVES TO "NOT CONST",
FOLD THE NOT INTO THE CONSTANT, (DCE)
***** Begin Version 6 *****
55 Q20-01654 1126
Remove last vestiges of CALL DEFINE FILE support. (AHM)
***** End Revision History *****
)%
!
!************************************
!
!
!********************************************
!
GLOBAL ROUTINE LOOKUP(VAR)=
BEGIN
EXTERNAL CHOSEN;
MAP PEXPRNODE VAR;
!LOOKUP IS CALLED BY THE DEFINITION ALGORITHM AND GLOBAL REGISTER
!ALLOCATION TO SEARCH A LINEAR LIST (CHOSEN) TO DETERMINE IF
!VAR IS IN THAT LIST
!
IF .VAR[IDATTRIBUT(INCOM)] THEN VAR_.VAR[IDCOMMON];
INCR I FROM 0 TO 31 DO
IF .CHOSEN[.I]<RIGHT> EQL .VAR THEN RETURN(.I);
RETURN(64);
END;
!
!***********************************************
!
ROUTINE CHKUA(CPTR)=
BEGIN
!THIS ROUITNE HELPS THE GLOBAL ALLOCATOR DETERMINE USED BEFORE
!ASSIGNED AND ASSIGNED BEFORE FIRST USE INFO. UNFORTUNATELY,
!WE DO NOT HAVE THE INDEX INTO GLOBREG AT THIS TIME SO WE
!WILL LOOK THE POINTER UP (USING LOOKUP) AND THEN CHECK
EXTERNAL GLOBREG,CHOSEN,SPECCASE;
REGISTER INX;
IF .SPECCASE NEQ 1 THEN RETURN;
!GET OUT FAST IF THIS IS NOT THE GLOBAL ALLOCATION CASE
INX_LOOKUP(.CPTR);
IF .INX GEQ 64 THEN RETURN;
IF NOT .GLOBREG[.INX]<ASGND4USED> THEN
GLOBREG[.INX]<USED4ASGND>_1;
END;
GLOBAL ROUTINE LOKCALST(PTR,NUMB,COMPR,SUBSTITUTE)=
BEGIN
LOCAL BASE ARGG;
MAP ARGUMENTLIST PTR;
EXTERNAL LEAFSUBSTITUTE,SPECCASE;
EXTERNAL TOP;
MAP BASE TOP:SUBSTITUTE;
!LOOK AT A LIST OF ARGUMENTS POINTED TO BY PTR
!LOOK AT NUMB ELEMENTS OF THE LIST.
!COMPARE ELEMENTS OF THE LIST WITH COMPR.
!WHEN COMPR IS FOUND REPLACE IT WITH SUBSTITUTE
!
INCR K FROM 1 TO .NUMB DO
BEGIN
ARGG_.PTR[.K,ARGNPTR];
IF .ARGG[OPRCLS] EQL DATAOPR THEN
BEGIN
IF .ARGG EQL .COMPR THEN
BEGIN
!DONT DO IT IF THIS
!IS A HALF WORD INDUCTION VARIABLE
IF .TOP NEQ 0 THEN
IF .TOP[DOSYM] EQL .COMPR THEN
IF .TOP[FLCWD] AND .SPECCASE EQL 1 THEN
TOP[NEDSMATRLZ]_1;
!NOW SUBSTITUTE ANYWAY.
PTR[.K,ARGNPTR]_.SUBSTITUTE;
PTR[.K,AVALFLG]_1;
CHKUA(.SUBSTITUTE);
END;
END ELSE
!IT COULD BE THIS EXPRESSION ITSELF
IF .ARGG EQL .COMPR THEN
BEGIN
PTR[.K,ARGNPTR]_.SUBSTITUTE;
CHKUA(.SUBSTITUTE);
!SET VAL FLAG IF IT SHOULD BE SET
!IT SHOULD BE SET FOR A COMMON SUB OR DATA ITEM
IF .SUBSTITUTE[OPRCLS] EQL DATAOPR OR
.SUBSTITUTE[OPRCLS] EQL CMNSUB THEN
PTR[.K,AVALFLG]_1;
END
ELSE
!MUST WALK EXPRESSION TREE LOOKING FOR IT
LEAFSUBSTITUTE(.ARGG);
END; !INCR LOOP
END;
!******************************************************
!ROUTINE
!
GLOBAL ROUTINE REPLACARG(STMT,OLDARG,NEWARG)=
BEGIN
REGISTER INX;
EXTERNAL TOP,GLOBREG,CELMNT;
MAP BASE TOP;
EXTERNAL OPTERR;
MAP BASE STMT:NEWARG;
EXTERNAL SPECCASE;
!A PARENT THAT POINTS TO A STATEMENT HAS BEEN FOUND
!LIKE UP ARG TO THE CORRECT STAEMENT TYPE
!
SELECT .STMT[SRCID] OF NSET
ASGNID: !ASSIGNMENT STATEMENT
BEGIN
!IT COULD BE BOTH RIGHT AND LEFT HAND SIDES
IF .STMT[RHEXP] EQL .OLDARG THEN
BEGIN
STMT[RHEXP]_.NEWARG;
IF .NEWARG[OPRCLS] EQL DATAOPR THEN
![733] FOLD IN ANY NOT FLAG FROM THE STATEMENT NODE IF A
![733] CONSTANT HAS JUST APPEARED! CODE GENERATION GETS ILL OTHERWISA.
%[733]% (STMT[A2VALFLG]_1;
%[733]% IF .STMT[A2NOTFLG] AND .NEWARG[OPERSP] EQL CONSTANT THEN
%[733]% ( STMT[RHEXP]_NOTCNST(NEWARG);
%[733]% STMT[A2NOTFLG]_0 ));
IF .NEWARG[OPRCLS] EQL REGCONTENTS THEN
BEGIN
STMT[A2VALFLG]_1;
IF .SPECCASE EQL 2 THEN
STMT[A2IMMEDFLG]_1
ELSE
IF .SPECCASE EQL 1 THEN
BEGIN
IF .TOP[DOSYM] EQL .OLDARG
AND .TOP[FLCWD] THEN
STMT[A2IMMEDFLG]_1;
!ONCE AGAIN GET THE USED/ASSIGNED INFO
CHKUA(.NEWARG);
END;
END;
END;
IF .STMT[LHEXP] EQL .OLDARG THEN
BEGIN
STMT[LHEXP]_.NEWARG;
IF .NEWARG[OPRCLS] EQL DATAOPR THEN
STMT[A1VALFLG]_1;
IF .NEWARG[OPRCLS] EQL REGCONTENTS THEN
BEGIN
STMT[A1VALFLG]_1;
IF .SPECCASE EQL 2 THEN
STMT[A1IMMEDFLG]_1
ELSE
IF .SPECCASE EQL 1 THEN
BEGIN
IF .TOP[DOSYM] EQL .OLDARG
AND .TOP[FLCWD] THEN
STMT[A1IMMEDFLG]_1;
!HER WE ALSO WANT TO SET ASGND4USED BIT
INX_LOOKUP(.NEWARG);
IF .INX LSS 64 THEN
IF NOT .GLOBREG[.INX]<USED4ASGND> THEN
GLOBREG[.INX]<ASGND4USED>_1;
END;
END;
END;
END;
!
!
CALLID: !SUBROUTINE CALL
BEGIN
LOCAL ARGUMENTLIST AG;
AG_.STMT[CALLIST];
IF .AG NEQ 0 THEN
LOKCALST(.AG,.AG[ARGCOUNT],.OLDARG,.NEWARG);
END;
!
!
DOID:
BEGIN
IF .STMT[DOLPCTL] EQL .OLDARG THEN
STMT[DOLPCTL]_.NEWARG;
END;
!
!
IFAID:
BEGIN
IF .STMT[AIFEXPR] EQL .OLDARG THEN
BEGIN
STMT[AIFEXPR]_.NEWARG;
IF .NEWARG[OPRCLS] EQL REGCONTENTS THEN
BEGIN
IF .SPECCASE EQL 2 THEN
STMT[A1IMMEDFLG]_1
ELSE
IF .SPECCASE EQL 1 THEN
BEGIN
IF .TOP[DOSYM] EQL .OLDARG
AND .TOP[FLCWD] THEN
STMT[A1IMMEDFLG]_1;
CHKUA(.NEWARG);
END;
END;
END;
END;
!
!
IFLID:
BEGIN
IF .STMT[LIFEXPR] EQL .OLDARG THEN
BEGIN
STMT[LIFEXPR]_.NEWARG;
IF .NEWARG[OPRCLS] EQL REGCONTENTS THEN
BEGIN
IF .SPECCASE EQL 2 THEN
!P2S, AOBJN WORD. VALUE IS +
!CUZ WE DONT DO AOBJNS THRU ZERO
!IT IS FALSE SO THE STATEMENT GOES AWAY
STMT[SRCID]_CONTID
ELSE
IF .SPECCASE EQL 1 THEN
BEGIN
!GLOBAL CASE, IF AOBJN, INDUCTION VARABLE
!DO THE SAME THING
IF .TOP[DOSYM] EQL .OLDARG
AND .TOP[FLCWD] THEN
STMT[SRCID]_CONTID
ELSE
CHKUA(.NEWARG);
END;
END;
END;
END;
!
AGOID:
BEGIN
IF .STMT[AIFEXPR] EQL .OLDARG THEN
STMT[AIFEXPR]_.NEWARG;
END;
!
!
CGOID:
BEGIN
!WE SHOULD BE TRYING THIS ONLY FOR GLOBAL REGISTER ALLOCATION
IF .STMT[CGOTOLBL] EQL .OLDARG THEN
BEGIN
STMT[CGOTOLBL]_.NEWARG;
IF .SPECCASE EQL 1 THEN !GLOBAL REG ALLOC.
BEGIN
IF .TOP[SRCID] EQL DOID AND
.TOP[FLCWD] THEN
STMT[A1IMMEDFLG]_1;
CHKUA(.NEWARG);
END;
END;
END;
!
!
READID: REPLACARG(.CELMNT,.OLDARG,.NEWARG);
WRITID: REPLACARG(.CELMNT,.OLDARG,.NEWARG);
ENCOID: REPLACARG(.CELMNT,.OLDARG,.NEWARG);
DECOID: REPLACARG(.CELMNT,.OLDARG,.NEWARG);
REREDID: REPLACARG(.CELMNT,.OLDARG,.NEWARG);
TESN;
END;
!MORE WILL BE INCLUDED IN THIS WHEN THE FORMAT OF I/O STATEMENTS IS
!EXPLICIT
GLOBAL ROUTINE DOPARMS(CNODE)=
!ROUTINE CALLED TO COLLECT GLOBAL PARAMETERS USED BY THE
!OPTIMIZER.
!THE PARAMETER IS A POINTER TO THE DO DEPTH ANALYSIS TREE.
BEGIN
EXTERNAL TOP,BOTTOM,LEND,LENTRY,INDVAR;
REGISTER BASE TMP;
MAP BASE TOP:BOTTOM:LEND:LENTRY;
MAP BASE CNODE;
!PICK UP INFORMATION ABOUT THIS DO LOOP
!CNODE POINTS TO THE NODE OF THE DO STRUCTURE TREE
!FIELDS FROM DO WALK TREE
TOP_.CNODE[DOSRC]; !PTR TO DO STATEMENT ITSELF
!
!FIELDS FROM DO STATEMENT ITSELF
LENTRY_.TOP[DOPRED]; !STATEMENT BEFORE DO
!NEEDED FOR CODE MOTION OUT OF LOOP
!IT MAY NOT BE EXACT OF A DO LOOP TERMINATOR IS
!INVOLVED. TO MAKE SURE WE WILL LOOK FOR TOP.
WHILE .LENTRY[SRCLINK] NEQ .TOP DO
LENTRY_.LENTRY[SRCLINK];
TMP_.TOP[DOLBL];
LEND_.TMP[SNHDR]; !POINT TO SOURCE ENTRY FOR LABELED STATEMENT
BOTTOM_.LEND[SRCLINK]; !ONE STATEMENT PAST END OF LOOP
!USED IN WHILE TYPE CONTROL WHERE PTR IS
!UPDATED BEFORE TESTING
INDVAR_.TOP[DOSYM]; !THE INDUCTION VARIABLE
END;
GLOBAL ROUTINE MAKASSOC=
BEGIN
!ROUITNE LOOKS AT ALL CALLS FOR CALLS TO DEFINE FILE
!AND ALL OPENS FOR ASSOCIATE VARIABLES AND CREATES A LINKED
!LIST OF THE SAME HEADED BY THE GLOBAL ASSOCPT.
%1126% EXTERNAL ASSOCPT;
%1126% MAP BASE ASSOCPT;
EXTERNAL CSTMNT,SORCPTR;
MAP BASE CSTMNT;
EXTERNAL NAME,CORMAN;
ROUTINE LNKASSOC(AVAR)=
BEGIN
!LINK THE ASSOCIATED VARIABLE INTO
!THE LINKED LIST
MAP BASE AVAR;
IF .AVAR[OPR1] EQL CONSTFL THEN
ELSE
IF .AVAR[OPRCLS] EQL ARRAYREF OR .AVAR[OPRCLS] EQL DATAOPR
THEN
BEGIN
LOCAL BASE NEWLNK;
NAME<LEFT>_1;
!GET THE CORE FOR THE LINKED LIST
NEWLNK_.ASSOCPT;
ASSOCPT_CORMAN();
!CREATE THE LINKED LIST PROPERLY
ASSOCPT[RIGHTP]_.NEWLNK;
!NO ITS LINKED IN FILL IN THE INFO
ASSOCPT[LEFTP]_(IF .AVAR[OPRCLS] EQL ARRAYREF
THEN .AVAR[ARG1PTR] ELSE
.AVAR);
END;
END;
CSTMNT_.SORCPTR<LEFT>;
!FROM FIRST TO LAST
WHILE .CSTMNT NEQ 0 DO
BEGIN
![1126] Delete check for CALL DEFINE FILE
IF .CSTMNT[SRCID] EQL OPENID THEN
BEGIN
LOCAL OPENLIST AG;
AG_.CSTMNT[OPLST];
INCR I FROM 0 TO .CSTMNT[OPSIZ]-1 DO
BEGIN
IF .AG[.I,OPENLCODE] EQL OPNCASSOCI THEN
LNKASSOC(.AG[.I,OPENLPTR]);
END;
END;
CSTMNT_.CSTMNT[SRCLINK];
END;
END;
END
ELUDOM