On 02/17/2014 06:50 PM, Roman Gareev wrote:
Hi Tobias,
thanks for the answer!
I think that the segfault is being caused by NULL arguments being passedto
compute_deps
by loop_level_carries_dependences.*This is **causing **an* *assignment of**
NULL values to the following parameters of **compute_deps:* must_raw_no_source,
may_raw_no_source, must_war_no_source, may_war_no_source,
must_waw_no_source, may_waw_no_source. They are being passed to
subtract_commutative_associative_deps
and dereferenced in the following statements:
*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);
*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);
*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);
This is the reason of segfault. (All functions mentioned above are located
in gcc/graphite-dependences.c)
I think that this can be solved by the addition to
subtract_commutative_associative_deps of 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. I've implemented
this in the patch, which can be found below.
Tested x86_64-unknown-linux-gnu, applying to revisions 189156, 207802
(svn://gcc.gnu.org/svn/gcc/trunk) and 207802
(svn://gcc.gnu.org/svn/gcc/branches/ibm/gcc-4_8-branch)
Thanks for your answers and advice, Sven!
--
Roman Gareev
-- --- You received this message because you are subscribed to the
Google Groups "GCC GRAPHITE" group. To unsubscribe from this group and
stop receiving emails from it, send an email to
[email protected]. For more options, visit
https://groups.google.com/groups/opt_out.
patch
diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
index b0f8680..002e3d1 100644
--- a/gcc/graphite-dependences.c
+++ b/gcc/graphite-dependences.c
@@ -424,24 +424,83 @@ subtract_commutative_associative_deps (scop_p scop,
&x_may_waw_no_source);
gcc_assert (res == 0);
- *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);
- *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);
- *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_raw)
+ *must_raw = isl_union_map_subtract (*must_raw, x_must_raw);
+ else
+ isl_union_map_free (x_must_raw);
+
+ if (may_raw)
+ *may_raw = isl_union_map_subtract (*may_raw, x_may_raw);
+ else
+ isl_union_map_free (x_may_raw);
In my understanding, it is sufficient to guard the no_source statements, no?
+
+ 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);
Could you remove the '{' '}' around the first statement?
+
+ 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);
Could you remove the '{' '}' around the first statement?
+ if (must_war)
+ *must_war = isl_union_map_subtract (*must_war, x_must_war);
+ else
+ isl_union_map_free (x_must_war);
+
+ if (may_war)
+ *may_war = isl_union_map_subtract (*may_war, x_may_war);
+ else
+ isl_union_map_free (x_may_war);
Those do not seem to be necessary, no?
+
+ 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);
Could you remove the '{' '}' around the first statement?
+
+ if (must_waw)
+ *must_waw = isl_union_map_subtract (*must_waw, x_must_waw);
+ else
+ isl_union_map_free (x_must_waw);
+
+ if (may_waw)
+ *may_waw = isl_union_map_subtract (*may_waw, x_may_waw);
+ else
+ isl_union_map_free (x_may_waw);
Those do not seem to be necessary, no?
+
+ 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);
Could you remove the '{' '}' around the first statement?
Otherwise, the patch looks good.
To commit this patch, could you please provide a ChangeLog entry as well
as a commit message that _briefly_ describes the findings mentioned in
you last email and submit this patch to gcc-patches?
Thanks again,
Tobias