aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2005-01-19 22:09:25 +0100
committerZdenek Dvorak <rakdver@gcc.gnu.org>2005-01-19 21:09:25 +0000
commit53dba8028ceabba1ca8b8bf4f3868fcc0c954c24 (patch)
tree107ece69e881b32f2086f7ccab4817eec5fbae98 /gcc
parent04d38c3bc120922088eb3c437c060a04ea255e3f (diff)
downloadgcc-53dba8028ceabba1ca8b8bf4f3868fcc0c954c24.zip
gcc-53dba8028ceabba1ca8b8bf4f3868fcc0c954c24.tar.gz
gcc-53dba8028ceabba1ca8b8bf4f3868fcc0c954c24.tar.bz2
tree-ssa-ccp.c (maybe_fold_offset_to_component_ref): Always subtract the offset of the selected field.
* tree-ssa-ccp.c (maybe_fold_offset_to_component_ref): Always subtract the offset of the selected field. From-SVN: r93918
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-ssa-ccp.c51
2 files changed, 28 insertions, 28 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b7b9b5..77867e8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-19 Zdenek Dvorak <dvorakz@suse.cz>
+
+ * tree-ssa-ccp.c (maybe_fold_offset_to_component_ref): Always subtract
+ the offset of the selected field.
+
2005-01-19 Kazu Hirata <kazu@cs.umass.edu>
* tree-cfg.c (remove_forwarder_block): Fix the check to
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index c530ede..697e97e 100644
--- a/gcc/tree-ssa-ccp.c
+++ b/gcc/tree-ssa-ccp.c
@@ -1449,45 +1449,39 @@ maybe_fold_offset_to_component_ref (tree record_type, tree base, tree offset,
continue;
field_type = TREE_TYPE (f);
- if (cmp < 0)
- {
- /* Don't care about offsets into the middle of scalars. */
- if (!AGGREGATE_TYPE_P (field_type))
- continue;
-
- /* Check for array at the end of the struct. This is often
- used as for flexible array members. We should be able to
- turn this into an array access anyway. */
- if (TREE_CODE (field_type) == ARRAY_TYPE)
- tail_array_field = f;
-
- /* Check the end of the field against the offset. */
- if (!DECL_SIZE_UNIT (f)
- || TREE_CODE (DECL_SIZE_UNIT (f)) != INTEGER_CST)
- continue;
- t = int_const_binop (MINUS_EXPR, offset, DECL_FIELD_OFFSET (f), 1);
- if (!tree_int_cst_lt (t, DECL_SIZE_UNIT (f)))
- continue;
-
- /* If we matched, then set offset to the displacement into
- this field. */
- offset = t;
- }
/* Here we exactly match the offset being checked. If the types match,
then we can return that field. */
- else if (lang_hooks.types_compatible_p (orig_type, field_type))
+ if (cmp == 0
+ && lang_hooks.types_compatible_p (orig_type, field_type))
{
if (base_is_ptr)
base = build1 (INDIRECT_REF, record_type, base);
t = build (COMPONENT_REF, field_type, base, f, NULL_TREE);
return t;
}
+
+ /* Don't care about offsets into the middle of scalars. */
+ if (!AGGREGATE_TYPE_P (field_type))
+ continue;
- /* Don't care about type-punning of scalars. */
- else if (!AGGREGATE_TYPE_P (field_type))
- return NULL_TREE;
+ /* Check for array at the end of the struct. This is often
+ used as for flexible array members. We should be able to
+ turn this into an array access anyway. */
+ if (TREE_CODE (field_type) == ARRAY_TYPE)
+ tail_array_field = f;
+
+ /* Check the end of the field against the offset. */
+ if (!DECL_SIZE_UNIT (f)
+ || TREE_CODE (DECL_SIZE_UNIT (f)) != INTEGER_CST)
+ continue;
+ t = int_const_binop (MINUS_EXPR, offset, field_offset, 1);
+ if (!tree_int_cst_lt (t, DECL_SIZE_UNIT (f)))
+ continue;
+ /* If we matched, then set offset to the displacement into
+ this field. */
+ offset = t;
goto found;
}
@@ -1496,6 +1490,7 @@ maybe_fold_offset_to_component_ref (tree record_type, tree base, tree offset,
f = tail_array_field;
field_type = TREE_TYPE (f);
+ offset = int_const_binop (MINUS_EXPR, offset, byte_position (f), 1);
found:
/* If we get here, we've got an aggregate field, and a possibly