Here's the bug list for the latest release:


1) ppca did not handle comments starting with a "*" in column 1 during
   compaction (when using the -p flag). 

Work around: Change the "*" to a ";"

Fixed in version: 0.10

2) ppca moved the .endstruct directive from the end of a .struct directive
   during compaction when the structure was used in the code, i.e. after the
   first instruction had been found. 

Work around: Move the .struct directive to before the first instruction

Fixed in version: 0.10

3) ppca did not correctly allocate more than 127 variables

Work around: Split up the source file to use 127 variables or less

Fixed in version 0.11

4) ppca did not correctly handle .data, .sect, .text and .ptext directives
   that occurred after the first instruction.

Work around: Move the directives to before the first instruction.

Fixed in version 0.12

5) ppca did not write out the final .end directive into the output file

Work around: None

Fixed in version 0.13

6) ppca did not comprehend that two variables could share the same register
   under the following conditions:-


   LOOP_START:
         :
   ;;; instruction i
     ... = var1
     || var2 = ...
   ;;; instruction i+1
     var1 = ...
     || ... = var2
         :
   LOOP_END:

Work around: Other than allocating these variables manually, none

Fixed in version 0.14

7) ppca did not output comments before the first instruction

Work around: None

Fixed in version: 0.15

8) ppca did not correctly handle macros

Work around: None

Fixed in version: 0.17

9) ppca did not add an extra delay slot between writing to the COMM register
   and reading the COMM register during compaction.

Work around: Turning compaction off temporarilly using .nopack/.pack

Fixed in version: 0.18

10) ppca did not comprehend the delay slots that may be required for loads
    to ls and le registers prior to a loop end.

Work around: None

Fixed in version: 0.19

11) When compacting ppca could fail to produce a correct schedule when a
    block contained a slot-dependent instruction such as lrs in conjunction
    with a two instructions that required a 1-cycle latency e.g. ones that
    loaded an address register.

Work around: None

Fixed in version: 0.20

12) In certain circumstances when the input code consists of several blocks
    which form a loop and that loop contains a variable which is live 
    throughout the loop because it is read without being written to, and there
    are multiple reads in different blocks of the loop, it is possible for
    ppca to go into an infinite loop.

Work around: None

Fixed in version: 0.21

13) A dummy register which is being used in the following manner

    dummy1	.dummy	
    aluout	.reg	d

	dummy1 	   = d0 * d1
	|| aluout  = ealu(...

    will be allocated the same register as aluout which causes the alu 
    operation not to be performed.

Work around: Convert .dummy to .reg

Fixed in version: 0.21
    
14) A dummy register which is pre-allocated by its use in an instruction
    is still allocated as a dummy, the preallocation is lost. For example...

    dummy1 .dummy
    level  .reg  d

    dummy1 = d7 - |level|

    ...will not necesarrilly allocate dummy1 to d7

Work around: Convert .dummy to .reg

Fixed in version: 0.22

15) A dummy register which is involved in a move operation will not be
    allocated ending up with a set statement setting it to _d204

Work around: Convert .dummy to .reg

Fixed in version: 0.22

16) A dummy register which is involved in a conditional operation will
    cause ppca to segmentation fault.

Work around: Convert .dummy to .reg

Fixed in version: 0.22

17) ppca will not detect that two variables interfere in cases like 
    the following

    var1 = var2
    var2 =[c] ...
    ...  = var2 ...

    It misses the fact that the write is conditional and treats it as
    a standard write, causing var2 to be a new instance. This can
    cause the two variables to be allocated the same register even though
    they interefere in this case.

Work around: None

Fixed in version: 0.22

18) Given the right combination of writes and reads of a variable in 
    a loop going through several blocks, ppca will hang.

Work around: None

Fixed in version: 0.51

19) ppca did not compact code correctly when the parallel operator ||
    starts in column 1 (as it does in the output of the PP C compiler).

Work around: Move the || to start in column 2

Fixed in verstion: 1.01

20) ppca did not compute multiple instances of the same variable correctly
    when complicated flows with multiple writes and reads occurred.

Work around: None

Fixed in version 1.02

21) when ppca is asked to allocate and compact and the allocation fails, 
    it still attempts to compact, which will cause a core dump. The compaction
    step should be skipped if the allocation fails.

Work around: Dont call ppca with the -p option until you have a sucessfully
             ran ppca without the -p

Fixed in version 1.03 
             
22) in certain circumstances when a line of assembly contains multiple
    symbolic names which have multiple instances ppca will hang.

Work around: None

Fixed in version 1.04

23) When ealu operations contains a parallel shift operation, where the 
    destination is a variable, the write to that variable will be treated as
    a write to the register a0.

Work around: Use a physical register rather than a variable

Fixed in version 1.05

24) When a variable is pre-allocated to a register by an instruction which
    makes it a companion such as...
      mf = pattern_mask & (image_mask & pol) | (~image_mask & ~pol)
    ...which forces patern_mask to be register d2, then the way it 
    interferes with other registers was not being considered by ppca. This
    could force other interfering variables to be allocated to d2 in this
    example.

Work around: Use a physical register rather than a variable

Fixed in version 1.06

25) When the Variable output or Opcode Usage Tables have more than 519 
    instructions, the tables do not wrap correctly, causing "line-too-long"
    warning messages when the output is assembled.

Work around: None

Fixed in version 1.07

26) Allocation of dummy variables is incorrect when it is in parallel with
    a conditional operation such as in the following case:

    reg1	.reg	d
    reg2	.reg	d
    Ga_Ptr	.reg	ga
    dummy	.dummy

    dummy = reg2 - 3
    || reg1 =[z] *Ga_Ptr

    Here dummy will be allocated the same register as reg1 which is not 
    correct since in the case where the condition is false, the write to 
    dummy will take place.

Work around: Use a physical register or a regular variable

Fixed in version 1.08
 
27) The .copy directive did not work when not quoting the filename.
    It also did not take the filenames correctly when multiple .copy 
    directives were used. When supply for instance.
      .copy "helloworld.M"
      .copy "world.M"
    It would attempt to open a file called world.Mrld.M
 
Work around: Always quote .copy filenames, and supply make all .copy files
             with names of the same length.

Fixed in version 1.09

