Commit 22fc64b4 by Martin Jambor Committed by Martin Jambor

re PR tree-optimization/41112 (ACATS c43205b fails at -O2 (tree-sra))

2009-09-04  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/41112
	* tree-sra.c (build_ref_for_offset_1): Signal that we cannot
	handle variable-bounded arrays.
	(expr_with_var_bounded_array_refs_p): New function.
	(analyze_access_subtree): Call expr_with_var_bounded_array_refs_p.

	* testsuite/gnat.dg/array8.adb: New test.

From-SVN: r151420
parent 2cdece44
2009-09-04 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/41112
* tree-sra.c (build_ref_for_offset_1): Signal that we cannot
handle variable-bounded arrays.
(expr_with_var_bounded_array_refs_p): New function.
(analyze_access_subtree): Call expr_with_var_bounded_array_refs_p.
2009-09-04 Wolfgang Gellerich <gellerich@de.ibm.com> 2009-09-04 Wolfgang Gellerich <gellerich@de.ibm.com>
* config/s390/2097.md: Removed two incorrect bypasses. * config/s390/2097.md: Removed two incorrect bypasses.
......
2009-09-04 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/41112
* gnat.dg/array8.adb: New test.
2009-09-03 Jakub Jelinek <jakub@redhat.com> 2009-09-03 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/guality/guality.exp: Only run guality tests if a trivial * gcc.dg/guality/guality.exp: Only run guality tests if a trivial
......
-- { dg-do compile }
-- { dg-options "-O2" }
PROCEDURE Array8 IS
function ID (I : Integer) return Integer is
begin
return I;
end;
SUBTYPE STB IS INTEGER RANGE ID(-8) .. -5;
TYPE TB IS ARRAY (STB RANGE <>) OF INTEGER;
GENERIC
B1 : TB;
PROCEDURE PROC1;
PROCEDURE PROC1 IS
BEGIN
IF B1'FIRST /= -8 THEN
raise Program_Error;
ELSIF B1'LAST /= ID(-5) THEN
raise Program_Error;
ELSIF B1 /= (7, 6, 5, 4) THEN
raise Program_Error;
END IF;
END;
PROCEDURE PROC2 IS NEW PROC1 ((7, 6, ID(5), 4));
BEGIN
PROC2;
END;
...@@ -1039,7 +1039,7 @@ build_ref_for_offset_1 (tree *res, tree type, HOST_WIDE_INT offset, ...@@ -1039,7 +1039,7 @@ build_ref_for_offset_1 (tree *res, tree type, HOST_WIDE_INT offset,
while (1) while (1)
{ {
tree fld; tree fld;
tree tr_size, index; tree tr_size, index, minidx;
HOST_WIDE_INT el_size; HOST_WIDE_INT el_size;
if (offset == 0 && exp_type if (offset == 0 && exp_type
...@@ -1090,13 +1090,14 @@ build_ref_for_offset_1 (tree *res, tree type, HOST_WIDE_INT offset, ...@@ -1090,13 +1090,14 @@ build_ref_for_offset_1 (tree *res, tree type, HOST_WIDE_INT offset,
return false; return false;
el_size = tree_low_cst (tr_size, 1); el_size = tree_low_cst (tr_size, 1);
minidx = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
if (TREE_CODE (minidx) != INTEGER_CST)
return false;
if (res) if (res)
{ {
index = build_int_cst (TYPE_DOMAIN (type), offset / el_size); index = build_int_cst (TYPE_DOMAIN (type), offset / el_size);
if (!integer_zerop (TYPE_MIN_VALUE (TYPE_DOMAIN (type)))) if (!integer_zerop (minidx))
index = int_const_binop (PLUS_EXPR, index, index = int_const_binop (PLUS_EXPR, index, minidx, 0);
TYPE_MIN_VALUE (TYPE_DOMAIN (type)),
0);
*res = build4 (ARRAY_REF, TREE_TYPE (type), *res, index, *res = build4 (ARRAY_REF, TREE_TYPE (type), *res, index,
NULL_TREE, NULL_TREE); NULL_TREE, NULL_TREE);
} }
...@@ -1378,6 +1379,22 @@ build_access_trees (struct access *access) ...@@ -1378,6 +1379,22 @@ build_access_trees (struct access *access)
} }
} }
/* Return true if expr contains some ARRAY_REFs into a variable bounded
array. */
static bool
expr_with_var_bounded_array_refs_p (tree expr)
{
while (handled_component_p (expr))
{
if (TREE_CODE (expr) == ARRAY_REF
&& !host_integerp (array_ref_low_bound (expr), 0))
return true;
expr = TREE_OPERAND (expr, 0);
}
return false;
}
/* Analyze the subtree of accesses rooted in ROOT, scheduling replacements when /* Analyze the subtree of accesses rooted in ROOT, scheduling replacements when
both seeming beneficial and when ALLOW_REPLACEMENTS allows it. Also set both seeming beneficial and when ALLOW_REPLACEMENTS allows it. Also set
all sorts of access flags appropriately along the way, notably always ser all sorts of access flags appropriately along the way, notably always ser
...@@ -1407,6 +1424,9 @@ analyze_access_subtree (struct access *root, bool allow_replacements, ...@@ -1407,6 +1424,9 @@ analyze_access_subtree (struct access *root, bool allow_replacements,
if (root->grp_unscalarizable_region) if (root->grp_unscalarizable_region)
allow_replacements = false; allow_replacements = false;
if (allow_replacements && expr_with_var_bounded_array_refs_p (root->expr))
allow_replacements = false;
for (child = root->first_child; child; child = child->next_sibling) for (child = root->first_child; child; child = child->next_sibling)
{ {
if (!hole && child->offset < covered_to) if (!hole && child->offset < covered_to)
......
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