ZHCUAQ1F july 2015 – april 2023
advice #30003: Loop at line 8 cannot be scheduled efficiently, as it
contains complex conditional expression.Try to simplify
condition.
代码在循环中包含一个复杂的条件表达式,可能是一个较大的“if”子句,这会妨碍优化。编译器将优化小的“if”语句(带有较短或空“if”和“else”块的“if”语句)。编译器不会优化大的“if”语句,循环主体中如此大的 if 语句将取消循环用于软件流水的资格。软件流水优化很关键,没有这项优化可能会导致性能降低。
在下面的示例中,示例 1 将使用流水线,但示例 2 不会:
示例 1:
for (i=0; i < N; i++)
{
if (!flag) {
//statements
}
else {
x[i] = y[i];
}
}
示例 2:
for (i = 0; i < n; i++)
{
if (!flag) {
//statements
}
else {
if (flag == 1) x[i] = y[i];
}
}
示例 1 的性能将明显优于示例 2,因为它成功地使用了流水线。但是,如果修改代码以消除嵌套的“if”,则示例 2 也可以使用流水线:
for (i = 0; i < n; i++)
{
if (!flag) {
//statements
}
else {
p = (flag == 1);
x[i] = !p * x[i] + p * y[i] ;
}
}