Google
 

Trailing-Edge - PDP-10 Archives - BB-J939D-BM - documents/bliss.bwr
There are 7 other files named bliss.bwr in the archive. Click here to see a list.


            BLISS-36 Release 4 For TOPS-20: Beware File
                             7-Feb-1984



PROBLEM:  The character handling functions that are implemented  using
          the  hardware  EXTEND  instruction  may not operate properly
          when the /EXTENDED qualifier is used.  These functions are:
           -  CH$MOVE and CH$COPY
           -  CH$FILL
           -  CH$EQL, CH$NEQ, CH$LEQ, etc.
           -  CH$COMPARE
           -  CH$TRANSLATE


SOLUTION: This restriction will be removed by a future release of  the
          TOPS-20 KL microcode.




PROBLEM:  The following code fragment

                d = 0;
                .....
                WHILE .d NEQ 0 DO
                    BEGIN
                    ....
                    x = 66 / .d;        ! Assume "d" never written
                    ...
                    IF .y THEN EXITLOOP
                    END

          will cause a zero-divide exception at  execution  time  when
          compiled  using  normal optimization.  The compiler believes
          that the expression "66/.d" is loop invariant and moves  the
          computation out of the loop.


SOLUTION: This is a restriction in V4.  In this particular  case,  the
          expression could be rewritten as:

                WHILE 1 DO
                    BEGIN
                    .....
                    IF .d EQL 0 THEN EXITLOOP;
                    ....
                    x = 66 / .d;
                    .....
                    END;

          In this case, the expression cannot  be  moved  out  of  the
          loop.




PROBLEM:  Incorrect code generated for structure  definitions  of  the
          form:

                STRUCTURE BAD[I,P,S]= [%UPVAL]
                    (IF .I THEN BAD ELSE BAD + .BAD<16,16>)<P,S>;

                OWN X: BAD[];
                LOCAL T;

                T = .X[.T,0,12];

          "X" is loaded into a register in the  THEN-branch,  but  the
          ELSE-branch uses the register without loading it.

SOLUTION: This is the result of a design flaw  in  the  way  structure
          references  are  expanded.  BLISS semantics guarantee that a
          structure actual-parameter is evaluated only once.  This  is
          implemented  by treating the first occurrence of a structure
          formal  as  if  it  was  a  BIND  declaration.   The   other
          occurrences  of  the structure formal are then treated as if
          they were uses of the "imaginary" bind-name.  This choice of
          implementation  fails  when  the  first  occurrence  of  the
          structure formal is in conditional flow!  The problem can be
          avoided by insuring that the first occurrence of each formal
          is outside  of  conditional  flow.   The  example  structure
          should be written as:

                STRUCTURE GOOD[I,P,S] = [%UPVAL]
                    (GOOD; IF .I THEN GOOD ELSE GOOD+.GOOD<16,16>)<P,S>;

          Note that the  "structure-name"  is  the  zero-th  structure
          formal  parameter.  The formals "I", "P" and "S" are already
          outside  of  conditional  flow,  so   they   are   processed
          correctly.   This  change  will  cause  the  compiler to use
          slightly  more  memory,  but  the  resulting  code  will  be
          correct.   There  should  be  no  reduction  in optimization
          either.

          Be aware that there is no problem when the conditional  flow
          is  constant-folded  at  compile-time,  or  when there is no
          conditional flow in the structure body.