[PATCH]: fix for PR middle-end/38250
Tomas Bily
tbily@suse.cz
Wed Nov 26 16:03:00 GMT 2008
Hi,
The PR is caused by two problems:
In tree-loop-distribution.c (generate_memset_zero):
1. It can be DR_STEP(dr) NULL. But it is passed into fold_build2 that
expect two non null expressions.
2. If program flow goes to end: due to goto then temporary variables created
during force_gimple_operand are added to referenced vars. But this variables
have not def bb. So later checks fails.
This patch add check for DR_STEP and remove newly generated stmts if
generating of memset fails.
Tested and bootsraped on x86_64-unknown-linux-gnu.
OK for mainline ?
Greetings
Tomas
Changelog:
PR middle-end/38250
* tree-loop-distribution.c (remove_stmts): New function.
(generate_memset_zero): Checks if DR_STEP(de) is NULL. Remove generated
stmts if checks fails.
Index: tree-loop-distribution.c
===================================================================
--- tree-loop-distribution.c (revision 142159)
+++ tree-loop-distribution.c (working copy)
@@ -216,6 +216,21 @@ generate_loops_for_partition (struct loo
return true;
}
+/* Remove stmts in a list. */
+
+static void
+remove_stmts (gimple_seq stmt_list)
+{
+ gimple_stmt_iterator i;
+
+ for (i = gsi_start (stmt_list); ; gsi_next (&i))
+ {
+ gsi_remove (&i, true);
+ if (gsi_end_p (i))
+ break;
+ }
+}
+
/* Generate a call to memset. Return true when the operation succeeded. */
static bool
@@ -240,6 +255,12 @@ generate_memset_zero (gimple stmt, tree
DR_REF (dr) = op0;
dr_analyze_innermost (dr);
+ if (!DR_STEP (dr))
+ {
+ remove_stmts (stmt_list);
+ goto end;
+ }
+
/* Test for a positive stride, iterating over every element. */
if (integer_zerop (fold_build2 (MINUS_EXPR, integer_type_node, DR_STEP (dr),
TYPE_SIZE_UNIT (TREE_TYPE (op0)))))
@@ -263,7 +284,10 @@ generate_memset_zero (gimple stmt, tree
DR_BASE_ADDRESS (dr), addr_base);
}
else
- goto end;
+ {
+ remove_stmts (stmt_list);
+ goto end;
+ }
mem = force_gimple_operand (addr_base, &stmts, true, NULL);
gimple_seq_add_seq (&stmt_list, stmts);
Index: testsuite/gcc.dg/tree-ssa/pr38250.c
===================================================================
--- testsuite/gcc.dg/tree-ssa/pr38250.c (revision 0)
+++ testsuite/gcc.dg/tree-ssa/pr38250.c (revision 0)
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-loop-distribution" } */
+
+typedef long unsigned int size_t;
+typedef struct {
+ long dat[2];
+} gsl_complex_long_double;
+typedef struct {
+ size_t size;
+ size_t stride;
+ long *data;
+} gsl_vector_complex_long_double;
+
+void gsl_vector_complex_long_double_set_zero (gsl_vector_complex_long_double * v)
+{
+ long * const data = v->data;
+ const size_t n = v->size;
+ const size_t stride = v->stride;
+ const gsl_complex_long_double zero = { { 0,0} } ;
+ size_t i;
+ for (i = 0; i < n; i++)
+ *(gsl_complex_long_double *) (data + 2 * i * stride) = zero;
+}
+
More information about the Gcc-patches
mailing list