Marcello Maggioni
2011-Oct-07 14:43 UTC
[LLVMdev] How to make Polly ignore some non-affine memory accesses
I add also the output of these commands:
[hades at artemis examples]$ ./compile_ex.sh super_simple_loop
Printing analysis 'Polly - Detect Scops in functions' for function
'main':
[hades at artemis examples]$
modifying it in :
#include <stdio.h>
int main()
{
int A[1024];
int j, k=10;
for (j = 0; j < 1024; j++)
A[j] = k;
return 0;
}
gives:
[hades at artemis examples]$ ./compile_ex.sh super_simple_loop
Printing analysis 'Polly - Detect Scops in functions' for function
'main':
Valid Region for Scop: %1 => %5
[hades at artemis examples]$
2011/10/7 Marcello Maggioni <hayarms at
gmail.com>:> Hi,
>
> for example this loop:
>
> #include <stdio.h>
>
> int main()
> {
> int A[1024];
> int j, k=10;
> for (j = 1; j < 1024; j++)
> A[j] = k;
>
> return 0;
> }
>
> run with:
>
> #!/bin/bash
> source ../set_path.source
> clang -S -emit-llvm $1.c -o $1.s
> opt -S -mem2reg -loop-simplify -indvars $1.s > $1.preopt.ll
> opt -load ${PATH_TO_POLLY_LIB}/LLVMPolly.so -polly-detect -analyze
$1.preopt.ll
>
> Using the instructions found on the Polly website.
>
>
> 2011/10/7 Tobias Grosser <tobias at grosser.es>:
>> On 10/07/2011 03:25 PM, Marcello Maggioni wrote:
>>>
>>> Hi, I'd like to ask another thing about Polly and SCoP
discarding.
>>>
>>> I've noticed that Polly discards quite simple loops like:
>>>
>>> for (int i = 1; i< 1000; i++) {}
>>>
>>> or
>>>
>>> for (int i= 0; i< 1000; i+=2) {}
>>>
>>> is this an intended behavior or there is some way to make it accept
>>> these kind of loops?
>>
>> Hi Marcello,
>>
>> can you provide complete test cases and explain how you run Polly.
These
>> loop constructs contain nothing Polly cannot handle, but other parts of
your
>> programs may block a detailed analysis. Furthermore, Polly relies on
LLVM
>> preparing passes to canonicalize the code. If they
>> are not run beforehand than Polly will hardly detect any loops.
>>
>> In your case I propose you attach the complete C and LLVM-IR files and
>> explain how you run Polly. I am sure I can help you with this.
>>
>> Tobi
>>
>
Marcello Maggioni
2011-Oct-22 15:41 UTC
[LLVMdev] How to make Polly ignore some non-affine memory accesses
I was trying the new feature you introduce about printing out the
graphs, so I updated my version of llvm/clang/polly synchronizing them
to the last version, but I get this error launching clang (also , I
recently switched to MacOS X for development):
$ clang not_so_simple_loop.c -O3 -Xclang -load -Xclang
${PATH_TO_POLLY_LIB}/LLVMPolly.dylib -mllvm -enable-polly-viewer
-mllvm -enable-iv-rewrite
error: unable to load plugin
'/Users/Kariddi/Documents/Sviluppo/Tesi/git-prefix/lib//LLVMPolly.dylib':
'dlopen(/Users/Kariddi/Documents/Sviluppo/Tesi/git-prefix/lib//LLVMPolly.dylib,
9): Symbol not found: __ZN4llvm10RegionInfo2IDE
Referenced from:
/Users/Kariddi/Documents/Sviluppo/Tesi/git-prefix/lib//LLVMPolly.dylib
Expected in: flat namespace
in /Users/Kariddi/Documents/Sviluppo/Tesi/git-prefix/lib//LLVMPolly.dylib'
clang (LLVM option parsing): Unknown command line argument
'-enable-polly-viewer'. Try: 'clang (LLVM option parsing)
-help'
clang (LLVM option parsing): Did you mean '-enable-ppc-preinc'?
$ clang -v
clang version 3.1 (trunk 142724)
Target: x86_64-apple-darwin11.2.0
Thread model: posix
Seems like it tries to load a symbol that it doesn't find ...
I have synchronized all clang/llvm/polly to the latest version and I
compiled them all together. Loading polly with "opt" works strangely
... :
opt -S -load ${PATH_TO_POLLY_LIB}/LLVMPolly.dylib -mem2reg -no-aa
-targetlibinfo -tbaa -basicaa -preverify -domtree -verify -mem2reg
-instcombine -simplifycfg -tailcallelim -simplifycfg -reassociate
-domtree -loops -loop-simplify -lcssa -loop-rotate -instcombine
-scalar-evolution -loop-simplify -lcssa -indvars -polly-prepare
-postdomtree -domfrontier -regions -polly-region-simplify
-scalar-evolution -loop-simplify -lcssa -indvars -postdomtree
-domfrontier -regions -loop-simplify -indvars -enable-iv-rewrite
not_so_simple_loop.s
strange ...
2011/10/8 Tobias Grosser <tobias at grosser.es>:> On 10/07/2011 03:43 PM, Marcello Maggioni wrote:
>>
>> 2011/10/7 Marcello Maggioni<hayarms at gmail.com>:
>>>
>>> Hi,
>>>
>>> for example this loop:
>>>
>>> #include<stdio.h>
>>>
>>> int main()
>>> {
>>> int A[1024];
>>> int j, k=10;
>>> for (j = 1; j< 1024; j++)
>>> A[j] = k;
>>>
>>> return 0;
>>> }
>>>
>>> run with:
>>>
>>> #!/bin/bash
>>> source ../set_path.source
>>> clang -S -emit-llvm $1.c -o $1.s
>>> opt -S -mem2reg -loop-simplify -indvars $1.s> $1.preopt.ll
>>> opt -load ${PATH_TO_POLLY_LIB}/LLVMPolly.so -polly-detect -analyze
>>> $1.preopt.ll
>>>
>>> Using the instructions found on the Polly website.
>
> There are two reasons why it does not work with these instructions
>
> 1. Not the right preoptimization passes
>
> The instructions on the Polly website use a very short sequence of
> preoptimization passes that just matches the simple example presented. To
> optimize real world programs that are not 100% standard you need a larger
> sequence of prepasses. In your example the loop iv does not start at
'0' so
> further canonicalication is required.
>
> The minimal sequence of optimization passes for your example is:
> opt -mem2reg -instcombine -simplifycfg -loop-rotate -indvars
>
> 2. -enable-iv-rewrite
>
> LLVM recently disabled by default the induction variable rewrite. This
> feature is necessary for the Polly preoptimizations. Hence, you need to
> reenable it with the above flag during preoptimization.
>
> -> opt -mem2reg -instcombine -simplifycfg -loop-rotate -indvars
> -enable-iv-rewrite test.s -S > test.preopt.ll
>
>
>
> In general I use an even longer sequence of preoptimizations. This sequence
> is built directly into Polly and is defined in RegisterPasses.cpp. To get
> the corresponding opt flags you can load Polly into clang and use the
> following command (-O3 is important):
>
>> clang test.c -O3 -Xclang -load -Xclang lib/LLVMPolly.so -mllvm
>> -debug-pass=Arguments
> Pass Arguments: -targetdata -no-aa -targetlibinfo -tbaa -basicaa -preverify
> -domtree -verify -mem2reg -instcombine -simplifycfg -tailcallelim
> -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa
-loop-rotate
> -instcombine -scalar-evolution -loop-simplify -lcssa -indvars
-polly-prepare
> -postdomtree -domfrontier -regions -polly-region-simplify -scalar-evolution
> -loop-simplify -lcssa -indvars -postdomtree -domfrontier -regions
> -polly-detect -polly-independent -polly-analyze-ir -polly-scops
> -polly-dependences -polly-optimize-isl -polly-cloog -polly-codegen
> -simplifycfg -domtree -scalarrepl -early-cse -lower-expect
>
> If you remove the first pass (-targetdata) and the passes after
> -polly-detect you get the list of preparing transformations (and the
> analysis they need).
>
> Today I also further improved clang support. With the patch: 'Fix
parsing of
> command line options for LLVM plugins' as posted today on cfe-commits,
you
> can get the following new features:
>
> 1. Optimize a .c file automatically
>
> Run: clang test.c -O3 -Xclang -load -Xclang lib/LLVMPolly.so -mllvm
> -enable-polly-viewer -mllvm -enable-iv-rewrite
>
> Polly + all the preparing transformations are automatically scheduled.
>
> 2. Graphical SCoP viewer
>
> Run: clang test.c -O3 -Xclang -load -Xclang lib/LLVMPolly.so -mllvm
> -enable-polly-viewer -mllvm -enable-iv-rewrite
>
> Show for every function a graphviz graph that highlights the detected
> SCoPs. Here we also show for every non-scop region, the reason why it
> is not a SCoP. (This needs graphviz installed when run LLVM configure is
> run. You may also consider to install xdot.py [1] as a more convenient .dot
> file viewer. xdot.py will used automatically, if it is
> in the PATH during 'configure' of LLVM)
>
> 3. OpenMP:
>
> RUN: clang test.c -O3 -Xclang -load -Xclang lib/LLVMPolly.so -mllvm
> -enable-polly-openmp -lgomp
>
> This will automatically OpenMP parallelize your code.
>
> (Remember for all this LLVM/Clang/Polly need to be built together such
> that they are in sync and .so loading works)
>
> Cheers
> Tobi
>
> [1] http://code.google.com/p/jrfonseca/wiki/XDot
>
>
>
>
Maybe Matching Threads
- [LLVMdev] How to make Polly ignore some non-affine memory accesses
- [LLVMdev] How to make Polly ignore some non-affine memory accesses
- [LLVMdev] How to make Polly ignore some non-affine memory accesses
- [LLVMdev] How to make Polly ignore some non-affine memory accesses
- [LLVMdev] How to make Polly ignore some non-affine memory accesses