-
Bug
-
Resolution: Fixed
-
High
-
Code Generation Tools
-
CODEGEN-8579
-
-
-
default
-
Disable software pipelining by using the --disable_software_pipeline option
In rare circumstances, the compiler may assign the same register to two conflicting values, corrupting one or both of them. Conflicting values are values that need to be in a register simultaneously, so they must be stored in distinct registers.
Because this bug is deep in the internals of the register allocation routines in the software pipeline code, it is very sensitive to tiny changes in the input, and thus it is difficult to precisely describe what input source code would trigger the bug.
The bug can occur if a loop:
- is successfully software pipelined,
- contains any multi-cycle instruction MI (e.g. a load from memory),
- MI's output is not consumed by another operation in the same iteration of the loop (e.g. a store to memory),
- MI’s output isn’t consumed by another operation in a subsequent iteration of the loop, and
- MI’s output is consumed outside the loop after the loop is complete,
then the compiler may generate incorrect code, specifically an incorrect register allocation.