diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-05-03 08:37:18 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-05-03 08:37:18 +0000 |
commit | a4f94d422f3209a51fd1aaf5fba5bf9ece9adcb8 (patch) | |
tree | 9d7afca6248cc5f2f0dd21ae9d21d770f795dce4 /gcc/tree-ssa-sccvn.c | |
parent | fb0e6fe320aa5f252240c94da2d858f5e04074b5 (diff) | |
download | gcc-a4f94d422f3209a51fd1aaf5fba5bf9ece9adcb8.tar.gz |
2012-05-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/53144
* tree-ssa-sccvn.c (vn_reference_lookup_or_insert_constant_for_pieces):
Rename to ...
(vn_reference_lookup_or_insert_for_pieces): ... this. Properly deal
with SSA name values.
(vn_reference_lookup_3): Adjust callers.
* gcc.dg/torture/pr53144.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187078 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index e9e6bfa7c70..ad9460b9411 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1348,18 +1348,19 @@ vn_reference_lookup_2 (ao_ref *op ATTRIBUTE_UNUSED, tree vuse, void *vr_) /* Lookup an existing or insert a new vn_reference entry into the value table for the VUSE, SET, TYPE, OPERANDS reference which - has the constant value CST. */ + has the value VALUE which is either a constant or an SSA name. */ static vn_reference_t -vn_reference_lookup_or_insert_constant_for_pieces (tree vuse, - alias_set_type set, - tree type, - VEC (vn_reference_op_s, - heap) *operands, - tree cst) +vn_reference_lookup_or_insert_for_pieces (tree vuse, + alias_set_type set, + tree type, + VEC (vn_reference_op_s, + heap) *operands, + tree value) { struct vn_reference_s vr1; vn_reference_t result; + unsigned value_id; vr1.vuse = vuse; vr1.operands = operands; vr1.type = type; @@ -1367,10 +1368,13 @@ vn_reference_lookup_or_insert_constant_for_pieces (tree vuse, vr1.hashcode = vn_reference_compute_hash (&vr1); if (vn_reference_lookup_1 (&vr1, &result)) return result; + if (TREE_CODE (value) == SSA_NAME) + value_id = VN_INFO (value)->value_id; + else + value_id = get_or_alloc_constant_value_id (value); return vn_reference_insert_pieces (vuse, set, type, VEC_copy (vn_reference_op_s, heap, - operands), cst, - get_or_alloc_constant_value_id (cst)); + operands), value, value_id); } /* Callback for walk_non_aliased_vuses. Tries to perform a lookup @@ -1452,7 +1456,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) && offset2 + size2 >= offset + maxsize) { tree val = build_zero_cst (vr->type); - return vn_reference_lookup_or_insert_constant_for_pieces + return vn_reference_lookup_or_insert_for_pieces (vuse, vr->set, vr->type, vr->operands, val); } } @@ -1473,7 +1477,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) && offset2 + size2 >= offset + maxsize) { tree val = build_zero_cst (vr->type); - return vn_reference_lookup_or_insert_constant_for_pieces + return vn_reference_lookup_or_insert_for_pieces (vuse, vr->set, vr->type, vr->operands, val); } } @@ -1514,7 +1518,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) / BITS_PER_UNIT), ref->size / BITS_PER_UNIT); if (val) - return vn_reference_lookup_or_insert_constant_for_pieces + return vn_reference_lookup_or_insert_for_pieces (vuse, vr->set, vr->type, vr->operands, val); } } @@ -1568,7 +1572,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) } } if (val) - return vn_reference_lookup_or_insert_constant_for_pieces + return vn_reference_lookup_or_insert_for_pieces (vuse, vr->set, vr->type, vr->operands, val); } } |