summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-structalias.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-29 12:30:09 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-29 12:30:09 +0000
commit726c2801df3c37ba209be9f2052d22e9d098fdb1 (patch)
treea8834fc2b29c7c0312c6fb656e8026cacadceb17 /gcc/tree-ssa-structalias.c
parentb72a7318b78b5b77dfb94bba267b9dad42153586 (diff)
downloadgcc-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.c9
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;
}