advice #30003: Loop at line 8 cannot be scheduled efficiently, as it contains complex conditional expression. Try to simplify condition.
This Advice is issued to alert you to a complex conditional expression, generally a large "if" clause, within a loop. This will disable software-pipelining, which is critical for generating efficient code sequences.
The C6000 compiler will optimize small if statements (if statements with if and else blocks that are short or empty). The compiler will not optimize large "if" statements, and such large if statements within the loop body will disqualify the loop for software pipelining. Software-pipelining is a key optimization; you will see reduced performance without software pipelining. In the simple examples below, Example 1 will pipeline, but Example 2 won't :
Example 1:
for (i=0; i < N; i++) { if (!flag) { //statements } else { x[i] = y[i]; } }
Example 2:
for (i = 0; i < n; i++) { if (!flag) { //statements } else { if (flag == 1) x[i] = y[i]; } }
for (i = 0; i < n; i++) { if (!flag) { //statements } else { p = (flag == 1); x[i] = !p * x[i] + p * y[i] ; } }
To see other examples of how "if" statements can be modified to allow software pipelining, refer to Hand Tuning Loops and Control Code on the TMS320C6000.
If this condition occurs, the compiler cannot perform the software pipelining loop optimization, which is crucial to getting good performance.
Simplify complex conditional expression/"if" statements.
Want to squeeze a few more Performance Cycles out of your application? Leverage the e2e (Engineer-to-Engineer) online community to get all of your Advice questions answered! Or, give back to the community with your expertise.