diff options
| author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-30 21:39:42 +0000 |
|---|---|---|
| committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-30 21:39:42 +0000 |
| commit | 20506a1d32afc8ac0bf7ed8ff183032cddd82cee (patch) | |
| tree | 8fba8975eb49eb9a3a44b03ca04682c55bad8378 /gcc/expr.c | |
| parent | 5d4b6e9c06cae8242813f303f804f31222500c65 (diff) | |
| download | ppe42-gcc-20506a1d32afc8ac0bf7ed8ff183032cddd82cee.tar.gz ppe42-gcc-20506a1d32afc8ac0bf7ed8ff183032cddd82cee.zip | |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86803 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/expr.c')
| -rw-r--r-- | gcc/expr.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/gcc/expr.c b/gcc/expr.c index d3c3e89799c..ca19b7a62c1 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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. */ |

