Commit 2f470326 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/32573 (ice for legal code with -O3)

	PR tree-optimization/32573
	PR middle-end/32946
	* tree-data-ref.c (initialize_data_dependence_relation): Clear
	DDR_SUBSCRIPTS, DDR_DIR_VECTS and DDR_DIST_VECTS at the beginning.
	(finalize_ddr_dependent): Clear DDR_SUBSCRIPTS after freeing it.
	(build_classic_dist_vector): Return false rather than true if
	DDR_ARE_DEPENDENT is non-NULL at the beginning.  Return false
	if either subscript_dependence_tester_1 or build_classic_dist_vector_1
	returned false.  Don't call save_dist_v before calling
	build_classic_dist_vector_1.
	(free_dependence_relation): Don't guard freeing DDR_SUBSCRIPTS
	with NULL DDR_ARE_DEPENDENT.  Also free DDR_DIST_VECTS and/or
	DDR_DIR_VECTS vectors.

	* gcc.dg/pr32573.c: New test.

From-SVN: r127750
parent 97dc8e5b
2007-08-24 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/32573
PR middle-end/32946
* tree-data-ref.c (initialize_data_dependence_relation): Clear
DDR_SUBSCRIPTS, DDR_DIR_VECTS and DDR_DIST_VECTS at the beginning.
(finalize_ddr_dependent): Clear DDR_SUBSCRIPTS after freeing it.
(build_classic_dist_vector): Return false rather than true if
DDR_ARE_DEPENDENT is non-NULL at the beginning. Return false
if either subscript_dependence_tester_1 or build_classic_dist_vector_1
returned false. Don't call save_dist_v before calling
build_classic_dist_vector_1.
(free_dependence_relation): Don't guard freeing DDR_SUBSCRIPTS
with NULL DDR_ARE_DEPENDENT. Also free DDR_DIST_VECTS and/or
DDR_DIR_VECTS vectors.
2007-08-23 Brian Sidebotham <brian.sidebotham@gmail.com> 2007-08-23 Brian Sidebotham <brian.sidebotham@gmail.com>
* configure.ac (leb128): Modify sed statement to work with any binutils * configure.ac (leb128): Modify sed statement to work with any binutils
......
2007-08-24 Jakub Jelinek <jakub@redhat.com> 2007-08-24 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/32573
PR middle-end/32946
* gcc.dg/pr32573.c: New test.
PR c++/32898 PR c++/32898
* g++.dg/lookup/ns3.C: New test. * g++.dg/lookup/ns3.C: New test.
/* PR tree-optimization/32573 */
/* { dg-do compile } */
/* { dg-options "-O3" } */
int
foo (void *x, long long *y)
{
char a[256];
int i = 0;
long long b;
int c;
int d = 0;
int e = 0;
unsigned f = 0;
b = bar (x);
c = (unsigned) b;
while (d < b && d < 65557)
{
f = *(unsigned *) &a[0];
for (i = c - 4; i > 0; i--)
if (a[i + 0] == 0x50
&& a[i + 1] == 0x4B
&& a[i + 3] == 0x06)
{
e = 1;
break;
}
}
return !e;
}
...@@ -1229,6 +1229,9 @@ initialize_data_dependence_relation (struct data_reference *a, ...@@ -1229,6 +1229,9 @@ initialize_data_dependence_relation (struct data_reference *a,
DDR_B (res) = b; DDR_B (res) = b;
DDR_LOOP_NEST (res) = NULL; DDR_LOOP_NEST (res) = NULL;
DDR_REVERSED_P (res) = false; DDR_REVERSED_P (res) = false;
DDR_SUBSCRIPTS (res) = NULL;
DDR_DIR_VECTS (res) = NULL;
DDR_DIST_VECTS (res) = NULL;
if (a == NULL || b == NULL) if (a == NULL || b == NULL)
{ {
...@@ -1268,8 +1271,6 @@ initialize_data_dependence_relation (struct data_reference *a, ...@@ -1268,8 +1271,6 @@ initialize_data_dependence_relation (struct data_reference *a,
DDR_SUBSCRIPTS (res) = VEC_alloc (subscript_p, heap, DR_NUM_DIMENSIONS (a)); DDR_SUBSCRIPTS (res) = VEC_alloc (subscript_p, heap, DR_NUM_DIMENSIONS (a));
DDR_LOOP_NEST (res) = loop_nest; DDR_LOOP_NEST (res) = loop_nest;
DDR_INNER_LOOP (res) = 0; DDR_INNER_LOOP (res) = 0;
DDR_DIR_VECTS (res) = NULL;
DDR_DIST_VECTS (res) = NULL;
for (i = 0; i < DR_NUM_DIMENSIONS (a); i++) for (i = 0; i < DR_NUM_DIMENSIONS (a); i++)
{ {
...@@ -1333,6 +1334,7 @@ finalize_ddr_dependent (struct data_dependence_relation *ddr, ...@@ -1333,6 +1334,7 @@ finalize_ddr_dependent (struct data_dependence_relation *ddr,
DDR_ARE_DEPENDENT (ddr) = chrec; DDR_ARE_DEPENDENT (ddr) = chrec;
free_subscripts (DDR_SUBSCRIPTS (ddr)); free_subscripts (DDR_SUBSCRIPTS (ddr));
DDR_SUBSCRIPTS (ddr) = NULL;
} }
/* The dependence relation DDR cannot be represented by a distance /* The dependence relation DDR cannot be represented by a distance
...@@ -2961,7 +2963,7 @@ build_classic_dist_vector (struct data_dependence_relation *ddr, ...@@ -2961,7 +2963,7 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
lambda_vector dist_v; lambda_vector dist_v;
if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE) if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE)
return true; return false;
if (same_access_functions (ddr)) if (same_access_functions (ddr))
{ {
...@@ -3013,11 +3015,13 @@ build_classic_dist_vector (struct data_dependence_relation *ddr, ...@@ -3013,11 +3015,13 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
if (!lambda_vector_lexico_pos (dist_v, DDR_NB_LOOPS (ddr))) if (!lambda_vector_lexico_pos (dist_v, DDR_NB_LOOPS (ddr)))
{ {
lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr)); lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr), if (!subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr),
loop_nest); loop_nest))
return false;
compute_subscript_distance (ddr); compute_subscript_distance (ddr);
build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr), if (!build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
save_v, &init_b, &index_carry); save_v, &init_b, &index_carry))
return false;
save_dist_v (ddr, save_v); save_dist_v (ddr, save_v);
DDR_REVERSED_P (ddr) = true; DDR_REVERSED_P (ddr) = true;
...@@ -3047,21 +3051,26 @@ build_classic_dist_vector (struct data_dependence_relation *ddr, ...@@ -3047,21 +3051,26 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
{ {
lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr)); lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr)); lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
save_dist_v (ddr, save_v);
if (DDR_NB_LOOPS (ddr) > 1) if (DDR_NB_LOOPS (ddr) > 1)
{ {
lambda_vector opposite_v = lambda_vector_new (DDR_NB_LOOPS (ddr)); lambda_vector opposite_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr), if (!subscript_dependence_tester_1 (ddr, DDR_B (ddr),
loop_nest); DDR_A (ddr), loop_nest))
return false;
compute_subscript_distance (ddr); compute_subscript_distance (ddr);
build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr), if (!build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
opposite_v, &init_b, &index_carry); opposite_v, &init_b,
&index_carry))
return false;
save_dist_v (ddr, save_v);
add_outer_distances (ddr, dist_v, index_carry); add_outer_distances (ddr, dist_v, index_carry);
add_outer_distances (ddr, opposite_v, index_carry); add_outer_distances (ddr, opposite_v, index_carry);
} }
else
save_dist_v (ddr, save_v);
} }
} }
else else
...@@ -4288,8 +4297,12 @@ free_dependence_relation (struct data_dependence_relation *ddr) ...@@ -4288,8 +4297,12 @@ free_dependence_relation (struct data_dependence_relation *ddr)
if (ddr == NULL) if (ddr == NULL)
return; return;
if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE && DDR_SUBSCRIPTS (ddr)) if (DDR_SUBSCRIPTS (ddr))
free_subscripts (DDR_SUBSCRIPTS (ddr)); free_subscripts (DDR_SUBSCRIPTS (ddr));
if (DDR_DIST_VECTS (ddr))
VEC_free (lambda_vector, heap, DDR_DIST_VECTS (ddr));
if (DDR_DIR_VECTS (ddr))
VEC_free (lambda_vector, heap, DDR_DIR_VECTS (ddr));
free (ddr); free (ddr);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment