diff options
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/expr.c | 20 | ||||
-rw-r--r-- | gcc/tree.c | 11 |
3 files changed, 33 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 00f5745..00e61c6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2004-08-30 Richard Henderson <rth@redhat.com> + + * expr.c (array_ref_element_size): Force aligned_size back to + sizetype. + (component_ref_field_offset): Similarly for aligned_offset. + * tree.c (recompute_tree_invarant_for_addr_expr): Mark raw + low-bound, element-size, field-offset fields rather than + computed values. + 2004-08-30 Joseph S. Myers <jsm@polyomino.org.uk> * c-parse.in (parmlist_or_identifiers_1): Remove unreachable and @@ -5481,8 +5481,14 @@ array_ref_element_size (tree exp) /* If a size was specified in the ARRAY_REF, it's the size measured in alignment units of the element type. So multiply by that value. */ if (aligned_size) - return size_binop (MULT_EXPR, aligned_size, - size_int (TYPE_ALIGN (elmt_type) / BITS_PER_UNIT)); + { + /* ??? tree_ssa_useless_type_conversion will eliminate casts to + sizetype from another type of the same width and signedness. */ + if (TREE_TYPE (aligned_size) != sizetype) + aligned_size = fold_convert (sizetype, aligned_size); + return size_binop (MULT_EXPR, aligned_size, + size_int (TYPE_ALIGN (elmt_type) / BITS_PER_UNIT)); + } /* Otherwise, take the size from that of the element type. Substitute any PLACEHOLDER_EXPR that we have. */ @@ -5541,8 +5547,14 @@ component_ref_field_offset (tree exp) in units of DECL_OFFSET_ALIGN / BITS_PER_UNIT. So multiply by that value. */ if (aligned_offset) - return size_binop (MULT_EXPR, aligned_offset, - size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT)); + { + /* ??? tree_ssa_useless_type_conversion will eliminate casts to + sizetype from another type of the same width and signedness. */ + if (TREE_TYPE (aligned_offset) != sizetype) + aligned_offset = fold_convert (sizetype, aligned_offset); + return size_binop (MULT_EXPR, aligned_offset, + size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT)); + } /* Otherwise, take the offset from that of the field. Substitute any PLACEHOLDER_EXPR that we have. */ @@ -2252,15 +2252,20 @@ do { tree _node = (NODE); \ && TREE_CODE (TREE_TYPE (TREE_OPERAND (node, 0))) == ARRAY_TYPE) { UPDATE_TITCSE (TREE_OPERAND (node, 1)); - UPDATE_TITCSE (array_ref_low_bound (node)); - UPDATE_TITCSE (array_ref_element_size (node)); + if (TREE_OPERAND (node, 2)) + UPDATE_TITCSE (TREE_OPERAND (node, 2)); + if (TREE_OPERAND (node, 3)) + UPDATE_TITCSE (TREE_OPERAND (node, 3)); } /* Likewise, just because this is a COMPONENT_REF doesn't mean we have a FIELD_DECL, apparently. The G++ front end can put something else there, at least temporarily. */ else if (TREE_CODE (node) == COMPONENT_REF && TREE_CODE (TREE_OPERAND (node, 1)) == FIELD_DECL) - UPDATE_TITCSE (component_ref_field_offset (node)); + { + if (TREE_OPERAND (node, 2)) + UPDATE_TITCSE (TREE_OPERAND (node, 2)); + } else if (TREE_CODE (node) == BIT_FIELD_REF) UPDATE_TITCSE (TREE_OPERAND (node, 2)); } |