Commit 0a500dd3 by Richard Guenther Committed by Richard Biener

re PR tree-optimization/50838 (ice in refs_may_alias_p_1 with -O3)

2011-10-24  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/50838
	* tree-data-ref.c (dr_analyze_indices): Properly canonicalize
	a MEM_REF base if we change it.

	* gcc.dg/torture/pr50838.c: New testcase.

From-SVN: r180381
parent 30e1709c
2011-10-24 Richard Guenther <rguenther@suse.de>
PR tree-optimization/50838
* tree-data-ref.c (dr_analyze_indices): Properly canonicalize
a MEM_REF base if we change it.
2011-10-24 Bernd Schmidt <bernds@codesourcery.com> 2011-10-24 Bernd Schmidt <bernds@codesourcery.com>
PR bootstrap/50836 PR bootstrap/50836
2011-10-24 Richard Guenther <rguenther@suse.de>
PR tree-optimization/50838
* gcc.dg/torture/pr50838.c: New testcase.
2011-10-24 Ira Rosen <ira.rosen@linaro.org> 2011-10-24 Ira Rosen <ira.rosen@linaro.org>
PR tree-optimization/50730 PR tree-optimization/50730
......
/* { dg-do compile } */
typedef void * gcv_object_t;
typedef gcv_object_t object;
typedef const void * Pseudofun;
extern struct pseudocode_tab_ {
Pseudofun pseudo_eql;
Pseudofun pseudo_iconv_wcslen;
Pseudofun pseudo_iconv_wcstombs;
Pseudofun pseudo_iconv_range;
}
pseudocode_tab;
extern struct symbol_tab_ {
object pointer[1024];
} pseudofun_tab;
int
init_memory (void)
{
object* ptr2 = &pseudofun_tab.pointer[0];
const Pseudofun* ptr1 = (const Pseudofun*)&pseudocode_tab;
unsigned int count = (sizeof(pseudocode_tab)/sizeof(Pseudofun));
while (count--)
{
*ptr2++ = (gcv_object_t)(((unsigned char *)((*ptr1))));
ptr1++;
}
}
...@@ -855,7 +855,7 @@ static void ...@@ -855,7 +855,7 @@ static void
dr_analyze_indices (struct data_reference *dr, loop_p nest, loop_p loop) dr_analyze_indices (struct data_reference *dr, loop_p nest, loop_p loop)
{ {
VEC (tree, heap) *access_fns = NULL; VEC (tree, heap) *access_fns = NULL;
tree ref, aref, op; tree ref, *aref, op;
tree base, off, access_fn; tree base, off, access_fn;
basic_block before_loop; basic_block before_loop;
...@@ -886,50 +886,58 @@ dr_analyze_indices (struct data_reference *dr, loop_p nest, loop_p loop) ...@@ -886,50 +886,58 @@ dr_analyze_indices (struct data_reference *dr, loop_p nest, loop_p loop)
} }
/* Analyze access functions of dimensions we know to be independent. */ /* Analyze access functions of dimensions we know to be independent. */
aref = ref; aref = &ref;
while (handled_component_p (aref)) while (handled_component_p (*aref))
{ {
if (TREE_CODE (aref) == ARRAY_REF) if (TREE_CODE (*aref) == ARRAY_REF)
{ {
op = TREE_OPERAND (aref, 1); op = TREE_OPERAND (*aref, 1);
access_fn = analyze_scalar_evolution (loop, op); access_fn = analyze_scalar_evolution (loop, op);
access_fn = instantiate_scev (before_loop, loop, access_fn); access_fn = instantiate_scev (before_loop, loop, access_fn);
VEC_safe_push (tree, heap, access_fns, access_fn); VEC_safe_push (tree, heap, access_fns, access_fn);
/* For ARRAY_REFs the base is the reference with the index replaced /* For ARRAY_REFs the base is the reference with the index replaced
by zero if we can not strip it as the outermost component. */ by zero if we can not strip it as the outermost component. */
if (aref == ref) if (*aref == ref)
ref = TREE_OPERAND (ref, 0); {
*aref = TREE_OPERAND (*aref, 0);
continue;
}
else else
TREE_OPERAND (aref, 1) = build_int_cst (TREE_TYPE (op), 0); TREE_OPERAND (*aref, 1) = build_int_cst (TREE_TYPE (op), 0);
} }
aref = TREE_OPERAND (aref, 0); aref = &TREE_OPERAND (*aref, 0);
} }
/* If the address operand of a MEM_REF base has an evolution in the /* If the address operand of a MEM_REF base has an evolution in the
analyzed nest, add it as an additional independent access-function. */ analyzed nest, add it as an additional independent access-function. */
if (TREE_CODE (aref) == MEM_REF) if (TREE_CODE (*aref) == MEM_REF)
{ {
op = TREE_OPERAND (aref, 0); op = TREE_OPERAND (*aref, 0);
access_fn = analyze_scalar_evolution (loop, op); access_fn = analyze_scalar_evolution (loop, op);
access_fn = instantiate_scev (before_loop, loop, access_fn); access_fn = instantiate_scev (before_loop, loop, access_fn);
if (TREE_CODE (access_fn) == POLYNOMIAL_CHREC) if (TREE_CODE (access_fn) == POLYNOMIAL_CHREC)
{ {
tree orig_type;
base = initial_condition (access_fn); base = initial_condition (access_fn);
orig_type = TREE_TYPE (base);
STRIP_USELESS_TYPE_CONVERSION (base);
split_constant_offset (base, &base, &off); split_constant_offset (base, &base, &off);
/* Fold the MEM_REF offset into the evolutions initial /* Fold the MEM_REF offset into the evolutions initial
value to make more bases comparable. */ value to make more bases comparable. */
if (!integer_zerop (TREE_OPERAND (aref, 1))) if (!integer_zerop (TREE_OPERAND (*aref, 1)))
{ {
off = size_binop (PLUS_EXPR, off, off = size_binop (PLUS_EXPR, off,
fold_convert (ssizetype, fold_convert (ssizetype,
TREE_OPERAND (aref, 1))); TREE_OPERAND (*aref, 1)));
TREE_OPERAND (aref, 1) TREE_OPERAND (*aref, 1)
= build_int_cst (TREE_TYPE (TREE_OPERAND (aref, 1)), 0); = build_int_cst (TREE_TYPE (TREE_OPERAND (*aref, 1)), 0);
} }
access_fn = chrec_replace_initial_condition access_fn = chrec_replace_initial_condition
(access_fn, fold_convert (TREE_TYPE (base), off)); (access_fn, fold_convert (orig_type, off));
TREE_OPERAND (aref, 0) = base; *aref = fold_build2_loc (EXPR_LOCATION (*aref),
MEM_REF, TREE_TYPE (*aref),
base, TREE_OPERAND (*aref, 1));
VEC_safe_push (tree, heap, access_fns, access_fn); VEC_safe_push (tree, heap, access_fns, access_fn);
} }
} }
......
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