diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-07-29 12:30:09 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-07-29 12:30:09 +0000 |
commit | 726c2801df3c37ba209be9f2052d22e9d098fdb1 (patch) | |
tree | a8834fc2b29c7c0312c6fb656e8026cacadceb17 /gcc/tree-ssa-structalias.c | |
parent | b72a7318b78b5b77dfb94bba267b9dad42153586 (diff) | |
download | gcc-726c2801df3c37ba209be9f2052d22e9d098fdb1.tar.gz |
2010-07-29 Richard Guenther <rguenther@suse.de>
PR tree-optimization/45120
* tree-ssa-structalias.c (get_constraint_for_component_ref):
Handle offset in DEREFs properly.
(get_constraint_for_1): Handle MEM_REF offset properly.
* gcc.dg/ipa/ipa-pta-15.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162676 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r-- | gcc/tree-ssa-structalias.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index cf5815f67e5..37fc6f83a38 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -3208,10 +3208,11 @@ get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results, at most one subfiled of any variable. */ if (bitpos == -1 || bitsize != bitmaxsize - || AGGREGATE_TYPE_P (TREE_TYPE (orig_t))) + || AGGREGATE_TYPE_P (TREE_TYPE (orig_t)) + || result->offset == UNKNOWN_OFFSET) result->offset = UNKNOWN_OFFSET; else - result->offset = bitpos; + result->offset += bitpos; } else if (result->type == ADDRESSOF) { @@ -3345,8 +3346,8 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p) { case MEM_REF: { - get_constraint_for_ptr_offset (TREE_OPERAND (t, 0), - TREE_OPERAND (t, 1), results); + tree off = double_int_to_tree (sizetype, mem_ref_offset (t)); + get_constraint_for_ptr_offset (TREE_OPERAND (t, 0), off, results); do_deref (results); return; } |