The outer loop of the following program is analyzed as parallel by -polyhedral-info -polly-check-parallel. But the outerloop has loop-carried dependence and is analyzed as not parallel by -polly-parallel analysis.
float a[256],b[256];
float aa[256][256],bb[256][256],cc[256][256];
int main () {
for (int i = 1; i < 256;i++) {
a[i] = a[i-1]+b[i] ;
for (int j=0;j<256;j++ ) {
aa[i][j] = aa[i][j]+cc[i][j];
}
}
return 0;
}
Printing analysis 'Polly - Generate an AST from the SCoP (isl)' for region: 'for.body8 => for.cond.cleanup7' in function 'main':
Printing analysis 'Polly - Generate an AST from the SCoP (isl)' for region: 'for.body => for.cond.cleanup' in function 'main':
:: isl ast :: main :: %for.body---%for.cond.cleanup
Printing analysis 'Polly - Generate an AST from the SCoP (isl)' for region: 'entry => ' in function 'main':
Printing analysis 'Polly - Interface to polyhedral analysis engine' for function 'main':
for.body: Loop is parallel.
for.body8: Loop is parallel.
Extended Description
The outer loop of the following program is analyzed as parallel by -polyhedral-info -polly-check-parallel. But the outerloop has loop-carried dependence and is analyzed as not parallel by -polly-parallel analysis.
float a[256],b[256]; float aa[256][256],bb[256][256],cc[256][256]; int main () { for (int i = 1; i < 256;i++) { a[i] = a[i-1]+b[i] ; for (int j=0;j<256;j++ ) { aa[i][j] = aa[i][j]+cc[i][j]; } } return 0; }
clang -O1 -S -emit-llvm -o loop.s loop.c opt -S -polly-canonicalize loop.s > loop.preopt.ll opt -polly-parallel -polly-ast -polyhedral-info -polly-check-parallel -analyze -q loop.preopt.ll -polly-process-unprofitable
Printing analysis 'Polly - Generate an AST from the SCoP (isl)' for region: 'for.body8 => for.cond.cleanup7' in function 'main': Printing analysis 'Polly - Generate an AST from the SCoP (isl)' for region: 'for.body => for.cond.cleanup' in function 'main': :: isl ast :: main :: %for.body---%for.cond.cleanup
if (1)
else { / original code / }
Printing analysis 'Polly - Generate an AST from the SCoP (isl)' for region: 'entry =>' in function 'main':
Printing analysis 'Polly - Interface to polyhedral analysis engine' for function 'main':
for.body: Loop is parallel.
for.body8: Loop is parallel.