The following messages can appear when the compiler or assembly optimizer is processing a software pipeline and it fails:
- Address increment is too large. An address register's offset must be adjusted because the offset is out of range of the C6000's offset addressing mode. You must minimize address register offsets.
- Cannot allocate machine registers. A software pipeline schedule was found, but it cannot allocate machine registers for the schedule. Simplification of the loop may help.
The register usage for the schedule found at the given ii is displayed. This information can be used when writing linear assembly to balance register pressure on both sides of the register file. For example:
ii = 11 Cannot allocate machine registers
Regs Live Always : 3/0 (A/B-side)
Max Regs Live : 20/14
Max Condo Regs Live : 2/1
- Regs Live Always. The number of values that must be assigned a register for the duration of the whole loop body. This means that these values must always be allocated registers for any given schedule found for the loop.
- Max Regs Live. Maximum number of values live at any given cycle in the loop that must be allocated to a register. This indicates the maximum number of registers required by the schedule found.
- Max Cond Regs Live. Maximum number of registers live at any given cycle in the loop kernel that must be allocated to a condition register.
- Cycle count too high. Never profitable. With the schedule that the compiler found for the loop, it is more efficient to use a non-software-pipelined version.
- Did not find schedule. The compiler was unable to find a schedule for the software pipeline at the given ii (iteration interval). You should simplify the loop and/or eliminate loop carried dependencies.
- Iterations in parallel > minimum or maximum trip count. A software pipeline schedule was found, but the schedule has more iterations in parallel than the minimum or maximum loop trip count. You must enable redundant loops or communicate the trip information.
- Speculative threshold exceeded. It would be necessary to speculatively load beyond the threshold currently specified by the --speculate_loads option. You must increase the --speculate_loads threshold as recommended in the software-pipeline feedback located in the assembly file.
- Register is live too long. A register must have a value that exists (is live) for more than ii cycles. You may insert MV instructions to split register lifetimes that are too long.
If the assembly optimizer is being used, the .sa file line numbers of the instructions that define and use the registers that are live too long are listed after this failure message. For example:
ii = 9 Register is live too long
|10| -> |17|
This means that the instruction that defines the register value is on line 10 and the instruction that uses the register value is on line 17 in the .sa file.
- Too many predicates live on one side. The
C6000 has predicate, or conditional,
registers available for use with conditional instructions. There are six predicate registers. There are three on the A side and three on
the B side. Sometimes the particular partition and schedule combination requires
more than these available registers.
- Schedule found with N iterations in parallel. (This is not a failure message.) A software pipeline schedule was found with N iterations executing in parallel.
- Trip variable used in loop - Cannot adjust trip count. The loop trip counter has a use in the loop other than as a loop trip counter.
- Unsafe schedule for irregular loop. "Irregular" loops are non-downcounting loops with a known number of iterations, such as a while loop. Irregular loops may require transformations that execute instructions more times than called for by the loop. This error means the compiler was unable to find a schedule with instructions that are safe to over-execute, are guarded with a predicate, or have their effects undone after the loop. Try to rewrite the loop as a down-counting loop. You may also try increasing the --speculate_loads (-mh) option.