Hi, I would like to add a new command line parameter for graphite. It will allow us to test graphite without any transformation like loop blocking, but only using a simple GIMPLE->GRAPHITE->GIMPLE identity transformation.
Buy adding this command line option, we do not change the behavior of any other part of graphite or gcc, but gain the possibility to debug, test and check the performance of the graphite front/backend without the noise of additional transformations. Also we can check the backend for every possible SCoP and not only for SCoPs, that we can transform using loop blocking. This should make debugging of the current bug reports easier and allows us to set up nightly tests testing the complete front and backend. This patch implements solution two of the recent discussion at [EMAIL PROTECTED] See you Tobi
2008-10-10 Tobias Grosser <[EMAIL PROTECTED]> * doc/invoke.texi: Add -fgraphite-identity. * graphite.c (graphite_apply_transformations): Check for -fgraphite-identity. * toplev.c: (process_options): Add flag_graphite_identity. * tree-ssa-loop.c: Add flag_graphite_identity. diff --git a/gcc/common.opt b/gcc/common.opt index 6f09dfd..4e68067 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -567,6 +567,10 @@ floop-block Common Report Var(flag_loop_block) Optimization Enable Loop Blocking transformation +fgraphite-identity +Common Report Var(flag_graphite_identity) Optimization +Enable Graphite Identity transformation + fguess-branch-probability Common Report Var(flag_guess_branch_prob) Optimization Enable guessing of branch probabilities diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 755c422..4fcf975 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -340,7 +340,7 @@ Objective-C and Objective-C++ Dialects}. -fira-coalesce -fno-ira-share-save-slots @gol -fno-ira-share-spill-slots [EMAIL PROTECTED] @gol -fivopts -fkeep-inline-functions -fkeep-static-consts @gol --floop-block -floop-interchange -floop-strip-mine @gol +-floop-block -floop-interchange -floop-strip-mine -fgraphite-identity @gol -fmerge-all-constants -fmerge-constants -fmodulo-sched @gol -fmodulo-sched-allow-regmoves -fmove-loop-invariants -fmudflap @gol -fmudflapir -fmudflapth -fno-branch-count-reg -fno-default-inline @gol @@ -6116,6 +6116,13 @@ because the innermost loop will iterate over a smaller amount of data that can be kept in the caches. This optimization applies to all the languages supported by GCC and is not limited to Fortran. [EMAIL PROTECTED] -fgraphite-identity [EMAIL PROTECTED] fgraphite-identity +Enable the identity transformation for graphite. For every SCoP we generate +the polyhedral representation and transform it back to gimple. Using +-fgraphite-identity we can check the costs or benefits of the +GIMPLE -> GRAPHITE -> GIMPLE transformation. + @item -fcheck-data-deps @opindex fcheck-data-deps Compare the results of several data dependence analyzers. This option diff --git a/gcc/graphite.c b/gcc/graphite.c index a615e2c..ab386d7 100644 --- a/gcc/graphite.c +++ b/gcc/graphite.c @@ -4912,17 +4912,13 @@ graphite_apply_transformations (scop_p scop) if (flag_loop_block) transform_done = graphite_trans_scop_block (scop); -#if 0 && ENABLE_CHECKING - /* When the compiler is configured with ENABLE_CHECKING, always - generate code, even if we did not apply any transformation. This - provides better code coverage of the backend code generator. - - This also allows to check the performance for an identity - transform: GIMPLE -> GRAPHITE -> GIMPLE; and the output of CLooG - is never an identity: if CLooG optimizations are not disabled, - the CLooG output is always optimized in control flow. */ - transform_done = true; -#endif + /* Generate code, even if we did not apply any real transformation. + This also allows to check the performance for the identity + transformation: GIMPLE -> GRAPHITE -> GIMPLE + Keep in mind, that CLooG optimizes in control, so the loop structure + may change, even if we only use -fgraphite-identity. */ + if (flag_graphite_identity) + transform_done = true; return transform_done; } diff --git a/gcc/toplev.c b/gcc/toplev.c index 24e4df7..42ad2a4 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1707,7 +1707,8 @@ process_options (void) if (flag_graphite || flag_loop_block || flag_loop_interchange - || flag_loop_strip_mine) + || flag_loop_strip_mine + || flag_graphite_identity) sorry ("Graphite loop optimizations cannot be used"); #endif diff --git a/gcc/tree-ssa-loop.c b/gcc/tree-ssa-loop.c index 51fc07c..2ea58f6 100644 --- a/gcc/tree-ssa-loop.c +++ b/gcc/tree-ssa-loop.c @@ -305,7 +305,8 @@ gate_graphite_transforms (void) { /* Enable -fgraphite pass if any one of the graphite optimization flags is turned on. */ - if (flag_loop_block || flag_loop_interchange || flag_loop_strip_mine) + if (flag_loop_block || flag_loop_interchange || flag_loop_strip_mine + || flag_graphite_identity) flag_graphite = 1; return flag_graphite != 0;