[PATCH] Fix bug 59586
Tobias Grosser
tobias@grosser.es
Mon Mar 10 14:27:00 GMT 2014
I worked with Roman on this patch and believe it is technically correct.
Some tiny comments inline.
Tobias
On 03/08/2014 10:57 AM, Roman Gareev wrote:
> This patch fixes the following bug:
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59586.
I would write PR59586. This should make this patch show up in the bug
tracker.
> The segfault is caused by NULL arguments passed to compute_deps by
> loop_level_carries_dependences.
> This causes an assignment of NULL values to the no_source parameters of
> compute_deps.
> They are passed to subtract_commutative_associative_deps and dereferenced.
>
> However, this NULL arguments are appropriate for the algorithm used
> in loop_level_carries_dependences. It uses compute_deps
> for finding RAW, WAR and WAW dependences of all basic blocks
> in the body of the given loop. Subsequently, it tries to
> determine presence of these dependences at the given level.
> Therefore it maps the relation of the dependences to the relation
> of the corresponding time-stamps and intersects the result with
> the relation in which all the inputs before the DEPTH occur at the
> same time as the output, and the input at the DEPTH occurs before output.
> If the intersection is not empty, some dependences are carried
> by the DEPTH we currently check and the loop is consequently not parallel.
>
> This patch tries to avoid the problem by addition to
> subtract_commutative_associative_deps
> of NULL checking of the no_source statements.
by adding NULL checking of the no_source statements to subtract_...
> Tested x86_64-unknown-linux-gnu, applying to 4.8.3 and trunk.
>
> 2014-03-07 Roman Gareev <gareevroman@gmail.com>
>
> gcc/
> * graphite-dependences.c
> (subtract_commutative_associative_deps):
> Add NULL checking of the following variables:
> must_raw_no_source, may_raw_no_source,
> must_war_no_source, may_war_no_source,
> must_waw_no_source, may_waw_no_source.
>
> gcc/testsuite/gfortran.dg/graphite/graphite.exp: Run
> corresponding
> tests in new mode.
>
> gcc/testsuite/gfortran.dg/graphite/parallelize-all-1.f: New
> testcase.
>
> diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
> index b0f8680..f382233 100644
> --- a/gcc/graphite-dependences.c
> +++ b/gcc/graphite-dependences.c
> @@ -426,22 +426,48 @@ subtract_commutative_associative_deps (scop_p scop,
>
> *must_raw = isl_union_map_subtract (*must_raw, x_must_raw);
> *may_raw = isl_union_map_subtract (*may_raw, x_may_raw);
> - *must_raw_no_source = isl_union_map_subtract (*must_raw_no_source,
> - x_must_raw_no_source);
> - *may_raw_no_source = isl_union_map_subtract (*may_raw_no_source,
> - x_may_raw_no_source);
> +
> + if (must_raw_no_source)
> + *must_raw_no_source = isl_union_map_subtract (*must_raw_no_source,
> + x_must_raw_no_source);
> + else
> + isl_union_map_free (x_must_raw_no_source);
> +
> + if (may_raw_no_source)
> + *may_raw_no_source = isl_union_map_subtract (*may_raw_no_source,
> + x_may_raw_no_source);
> + else
> + isl_union_map_free (x_may_raw_no_source);
> +
> *must_war = isl_union_map_subtract (*must_war, x_must_war);
> *may_war = isl_union_map_subtract (*may_war, x_may_war);
> - *must_war_no_source = isl_union_map_subtract (*must_war_no_source,
> - x_must_war_no_source);
> - *may_war_no_source = isl_union_map_subtract (*may_war_no_source,
> - x_may_war_no_source);
> +
> + if (must_war_no_source)
> + *must_war_no_source = isl_union_map_subtract (*must_war_no_source,
> + x_must_war_no_source);
> + else
> + isl_union_map_free (x_must_war_no_source);
> +
> + if (may_war_no_source)
> + *may_war_no_source = isl_union_map_subtract (*may_war_no_source,
> + x_may_war_no_source);
> + else
> + isl_union_map_free (x_may_war_no_source);
> +
> *must_waw = isl_union_map_subtract (*must_waw, x_must_waw);
> *may_waw = isl_union_map_subtract (*may_waw, x_may_waw);
> - *must_waw_no_source = isl_union_map_subtract (*must_waw_no_source,
> - x_must_waw_no_source);
> - *may_waw_no_source = isl_union_map_subtract (*may_waw_no_source,
> - x_may_waw_no_source);
> +
> + if (must_waw_no_source)
> + *must_waw_no_source = isl_union_map_subtract (*must_waw_no_source,
> + x_must_waw_no_source);
> + else
> + isl_union_map_free (x_must_waw_no_source);
> +
> + if (may_waw_no_source)
> + *may_waw_no_source = isl_union_map_subtract (*may_waw_no_source,
> + x_may_waw_no_source);
> + else
> + isl_union_map_free (x_may_waw_no_source);
> }
>
> isl_union_map_free (original);
> diff --git a/gcc/testsuite/gfortran.dg/graphite/graphite.exp
> b/gcc/testsuite/gfortran.dg/graphite/graphite.exp
> index c3aad13..3833e43 100644
> --- a/gcc/testsuite/gfortran.dg/graphite/graphite.exp
> +++ b/gcc/testsuite/gfortran.dg/graphite/graphite.exp
> @@ -44,6 +44,7 @@ set interchange_files [lsort [glob -nocomplain
> $srcdir/$subdir/interchange-*.\[f
> set scop_files [lsort [glob -nocomplain
> $srcdir/$subdir/scop-*.\[fF\]{,90,95,03,08} ] ]
> set run_id_files [lsort [glob -nocomplain
> $srcdir/$subdir/run-id-*.\[fF\]{,90,95,03,08} ] ]
> set vect_files [lsort [glob -nocomplain
> $srcdir/$subdir/vect-*.\[fF\]{,90,95,03,08} ] ]
> +set parallelize_files [lsort [glob -nocomplain
> $srcdir/$subdir/parallelize-all-*.\[fF\]{,90,95,03,08} ] ]
>
> # Tests to be compiled.
> set dg-do-what-default compile
> @@ -51,6 +52,7 @@ gfortran-dg-runtest $scop_files "-O2 -fgraphite
> -fdump-tree-graphite-all"
> gfortran-dg-runtest $id_files "-O2 -fgraphite-identity
> -ffast-math"
> gfortran-dg-runtest $interchange_files "-O2 -floop-interchange
> -fno-loop-block -fno-loop-strip-mine -ffast-math -fdump-tree-graphite-all"
> gfortran-dg-runtest $block_files "-O2 -floop-block
> -fno-loop-strip-mine -fno-loop-interchange -ffast-math
> -fdump-tree-graphite-all"
> +gfortran-dg-runtest $parallelize_files "-Ofast -floop-parallelize-all"
I am slightly surprised why this change is necessary. Roman, can you
shade some light on this change.
> # Vectorizer tests, to be run or compiled, depending on target
> capabilities.
> if [check_vect_support_and_set_flags] {
> diff --git a/gcc/testsuite/gfortran.dg/graphite/parallelize-all-1.f
> b/gcc/testsuite/gfortran.dg/graphite/parallelize-all-1.f
> new file mode 100644
> index 0000000..e1156f8
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/graphite/parallelize-all-1.f
> @@ -0,0 +1,9 @@
> + subroutine subsm ( n, x, xp, xx)
> + integer n, m, x(n),xp(n), xx(n), gg(n), dd_p
> + do 55 i=1, n
> + dd_p = dd_p + (x(i) - xx(i))*gg(i)
> + 55 continue
> + if ( dd_p .gt. 0 ) then
> + call dcopy( n, xp, 1, x, 1 )
> + endif
> + end
>
More information about the Gcc-patches
mailing list