> make[3]: Leaving directory `/mnt/scratch/nightly/2006-07-04/i686'
> Comparing stages 2 and 3
> warning: ./cc1-checksum.o differs
> warning: ./cc1plus-checksum.o differs
> warning: ./cc1obj-checksum.o differs
> Bootstrap comparison failure!
Does the attached patch make any difference?
--
Eric Botcazou
Index: tree-sra.c
===================================================================
--- tree-sra.c (revision 115175)
+++ tree-sra.c (working copy)
@@ -579,6 +579,69 @@ lookup_element (struct sra_elt *parent,
return elt;
}
+/* Return true if [MIN, MAX] is a valid range for ARRAY, an ARRAY_TYPE. */
+
+static bool
+is_valid_array_range (tree min, tree max, tree array)
+{
+ tree t, dom = TYPE_DOMAIN (array);
+
+ /* Watch out for stupid user tricks, indexing outside the array.
+
+ Careful, we're not called only on scalarizable types, so do not
+ assume constant array bounds. We needn't do anything with such
+ cases, since they'll be referring to objects that we should have
+ already rejected for scalarization, so returning false is fine. */
+
+ if (dom == NULL)
+ return false;
+
+ t = TYPE_MIN_VALUE (dom);
+ if (!t || TREE_CODE (t) != INTEGER_CST)
+ return false;
+ if (tree_int_cst_lt (min, t))
+ return false;
+
+ t = TYPE_MAX_VALUE (dom);
+ if (!t || TREE_CODE (t) != INTEGER_CST)
+ return false;
+ if (tree_int_cst_lt (t, max))
+ return false;
+
+ return true;
+}
+
+/* Return true if the ARRAY_REF in EXPR is a constant, in bounds access. */
+
+static bool
+is_valid_const_index (tree expr)
+{
+ tree idx = TREE_OPERAND (expr, 1);
+
+ if (TREE_CODE (idx) != INTEGER_CST)
+ return false;
+
+ return is_valid_array_range (idx, idx, TREE_TYPE (TREE_OPERAND (expr, 0)));
+}
+
+/* Same as above, but for an ARRAY_RANGE_REF. */
+
+static bool
+is_valid_const_range (tree expr)
+{
+ tree min, max, range_type = TYPE_DOMAIN (TREE_TYPE (expr));
+
+ min = TYPE_MIN_VALUE (range_type);
+ max = TYPE_MAX_VALUE (range_type);
+ if (!min
+ || !max
+ || TREE_CODE (min) != INTEGER_CST
+ || TREE_CODE (max) != INTEGER_CST)
+ return false;
+
+ return is_valid_array_range (min, max, TREE_TYPE (TREE_OPERAND (expr, 0)));
+}
+
/* Create or return the SRA_ELT structure for EXPR if the expression
refers to a scalarizable variable. */
@@ -599,7 +662,7 @@ maybe_lookup_element_for_expr (tree expr
case ARRAY_REF:
/* We can't scalarize variable array indices. */
- if (in_array_bounds_p (expr))
+ if (is_valid_const_index (expr))
child = TREE_OPERAND (expr, 1);
else
return NULL;
@@ -607,7 +670,7 @@ maybe_lookup_element_for_expr (tree expr
case ARRAY_RANGE_REF:
/* We can't scalarize variable array indices. */
- if (range_in_array_bounds_p (expr))
+ if (is_valid_const_range (expr))
{
tree domain = TYPE_DOMAIN (TREE_TYPE (expr));
child = build2 (RANGE_EXPR, integer_type_node,
@@ -746,7 +809,7 @@ sra_walk_expr (tree *expr_p, block_stmt_
the effort. */
/* ??? Hack. Figure out how to push this into the scan routines
without duplicating too much code. */
- if (!in_array_bounds_p (inner))
+ if (!is_valid_const_index (inner))
{
disable_scalarization = true;
goto use_all;
@@ -759,7 +822,7 @@ sra_walk_expr (tree *expr_p, block_stmt_
break;
case ARRAY_RANGE_REF:
- if (!range_in_array_bounds_p (inner))
+ if (!is_valid_const_range (inner))
{
disable_scalarization = true;
goto use_all;