advice #30000: Loop at line 10 cannot be scheduled efficiently, as it contains a function call ("function_name"). Try to inline call or consider rewriting loop.
This Advice is issued to alert you to code, specifically a function call within a loop, that prevents software-pipelining. Software pipelining is a key optimization for achieving good performance. You may see reduced performance without software pipelining.
The compiler attempts to perform the software pipeline loop optimization at optimization levels --opt_level=2 (or -O2) and -O3. If there is a call in the loop, the compiler will attempt to completely inline the called function, but sometimes this is not possible. If the compiler cannot inline the called function, software pipelining cannot be performed. This can severely reduce the performance of the loop.
Typical testcase: In the code below, the call to the function "func2" prevents software pipelining. Inlining function "func2" or rewriting the loop to avoid a function call can avoid pipeline disqualification; if the loop pipelines successfully you may see performance improvement.
void func1(int *p, int *q, int n) { unsigned int i; for (i = 0; i < n; i++) { int t = func2(i); p[i] = q[i] + t; } }
Function calls in loops (such as call to "func2") prevent software pipelining, which can signficantly hurt performance.
If possible, move calls outside the loop. Otherwise, hand-inline calls; for instance replace the call to "func2" with the code in the body of "func2."
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.