re PR tree-optimization/42956 (internal compiler error: Segmentation fault with -O1)

2010-04-08  Richard Guenther  <rguenther@suse.de>

	PR middle-end/42956
	* gimplify.c (gimple_fold_indirect_ref): Avoid generating
	new ARRAY_REFs on variable size element or minimal index arrays.
	* tree-ssa-loop-ivopts.c (find_interesting_uses_address): Use
	gimple_fold_indirect_ref.

	* gcc.c-torture/compile/pr42956.c: New testcase.

From-SVN: r158123
This commit is contained in:
Richard Guenther 2010-04-08 11:47:13 +00:00 committed by Richard Biener
parent ee516e9680
commit aae1d7ccf9
5 changed files with 57 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2010-04-08 Richard Guenther <rguenther@suse.de>
PR middle-end/42956
* gimplify.c (gimple_fold_indirect_ref): Avoid generating
new ARRAY_REFs on variable size element or minimal index arrays.
* tree-ssa-loop-ivopts.c (find_interesting_uses_address): Use
gimple_fold_indirect_ref.
2010-04-08 Wolfgang Gellerich <gellerich@de.ibm.com>
* config/s390/s390.c (override_options): Adjust the z10

View File

@ -3919,18 +3919,21 @@ gimple_fold_indirect_ref (tree t)
/* *(foo *)&fooarray => fooarray[0] */
if (TREE_CODE (optype) == ARRAY_TYPE
&& TREE_CODE (TYPE_SIZE (TREE_TYPE (optype))) == INTEGER_CST
&& useless_type_conversion_p (type, TREE_TYPE (optype)))
{
tree type_domain = TYPE_DOMAIN (optype);
tree min_val = size_zero_node;
if (type_domain && TYPE_MIN_VALUE (type_domain))
min_val = TYPE_MIN_VALUE (type_domain);
return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
if (TREE_CODE (min_val) == INTEGER_CST)
return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
}
}
/* *(foo *)fooarrptr => (*fooarrptr)[0] */
if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
&& TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (subtype)))) == INTEGER_CST
&& useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (subtype))))
{
tree type_domain;
@ -3942,7 +3945,8 @@ gimple_fold_indirect_ref (tree t)
type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
if (type_domain && TYPE_MIN_VALUE (type_domain))
min_val = TYPE_MIN_VALUE (type_domain);
return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
if (TREE_CODE (min_val) == INTEGER_CST)
return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
}
return NULL_TREE;

View File

@ -1,3 +1,8 @@
2010-04-08 Richard Guenther <rguenther@suse.de>
PR middle-end/42956
* gcc.c-torture/compile/pr42956.c: New testcase.
2010-04-08 Jakub Jelinek <jakub@redhat.com>
Backport from mainline:

View File

@ -0,0 +1,33 @@
typedef const int cint;
typedef struct {
} Bounds;
int ndim_, ncomp_, selectedcomp_, nregions_;
void *voidregion_;
typedef struct {
double diff, err, spread;
} Errors;
typedef const Errors cErrors;
void Split(int iregion, int depth, int xregion)
{
typedef struct {
double avg, err, spread, chisq;
double xmin[ndim_], xmax[ndim_];
} Result;
typedef struct region {
Result result[ncomp_];
} Region;
Errors errors[ncomp_];
int comp, ireg, xreg;
for( ireg = iregion, xreg = xregion; ireg < nregions_; ireg = xreg++ )
{
Result *result = ((Region *)voidregion_)[ireg].result;
for( comp = 0; comp < ncomp_; ++comp )
{
Result *r = &result[comp];
cErrors *e = &errors[comp];
double c = e->diff;
if( r->err > 0 ) r->err = r->err*e->err + c;
}
}
}

View File

@ -1674,7 +1674,11 @@ find_interesting_uses_address (struct ivopts_data *data, gimple stmt, tree *op_p
while (handled_component_p (*ref))
ref = &TREE_OPERAND (*ref, 0);
if (TREE_CODE (*ref) == INDIRECT_REF)
*ref = fold_indirect_ref (*ref);
{
tree tem = gimple_fold_indirect_ref (TREE_OPERAND (*ref, 0));
if (tem)
*ref = tem;
}
}
}