diff options
author | Richard Biener <rguenther@suse.de> | 2013-05-07 11:26:58 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-05-07 11:26:58 +0000 |
commit | 39e843e8a7a15d93c6a23ec007e70738505291b3 (patch) | |
tree | 91a77a6eacde49e871b7513dea7db0186678681a /gcc/tree-ssa-sccvn.c | |
parent | 0a1a83cba32006411c4ce4793ca516406489cfae (diff) | |
download | gcc-39e843e8a7a15d93c6a23ec007e70738505291b3.zip gcc-39e843e8a7a15d93c6a23ec007e70738505291b3.tar.gz gcc-39e843e8a7a15d93c6a23ec007e70738505291b3.tar.bz2 |
double-int.h (rshift): New overload.
2013-05-07 Richard Biener <rguenther@suse.de>
* double-int.h (rshift): New overload.
* double-int.c (rshift): New function.
* tree-ssa-sccvn.c (copy_reference_ops_from_ref): Optimize.
(create_reference_ops_from_ref): Remove.
(vn_reference_insert): Use shared ops for constructing the
reference and copy it.
From-SVN: r198676
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 30 |
1 files changed, 10 insertions, 20 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 07bfdccc..49d61b0 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -728,6 +728,8 @@ copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result) { vn_reference_op_s temp; + result->reserve (3); + memset (&temp, 0, sizeof (temp)); temp.type = TREE_TYPE (ref); temp.opcode = TREE_CODE (ref); @@ -735,21 +737,21 @@ copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result) temp.op1 = TMR_STEP (ref); temp.op2 = TMR_OFFSET (ref); temp.off = -1; - result->safe_push (temp); + result->quick_push (temp); memset (&temp, 0, sizeof (temp)); temp.type = NULL_TREE; temp.opcode = ERROR_MARK; temp.op0 = TMR_INDEX2 (ref); temp.off = -1; - result->safe_push (temp); + result->quick_push (temp); memset (&temp, 0, sizeof (temp)); temp.type = NULL_TREE; temp.opcode = TREE_CODE (TMR_BASE (ref)); temp.op0 = TMR_BASE (ref); temp.off = -1; - result->safe_push (temp); + result->quick_push (temp); return; } @@ -802,9 +804,8 @@ copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result) double_int off = tree_to_double_int (this_offset) + tree_to_double_int (bit_offset) - .arshift (BITS_PER_UNIT == 8 - ? 3 : exact_log2 (BITS_PER_UNIT), - HOST_BITS_PER_DOUBLE_INT); + .rshift (BITS_PER_UNIT == 8 + ? 3 : exact_log2 (BITS_PER_UNIT)); if (off.fits_shwi ()) temp.off = off.low; } @@ -846,7 +847,7 @@ copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result) temp.off = 0; result->safe_push (temp); temp.opcode = ADDR_EXPR; - temp.op0 = build_fold_addr_expr (ref); + temp.op0 = build1 (ADDR_EXPR, TREE_TYPE (temp.op0), ref); temp.type = TREE_TYPE (temp.op0); temp.off = -1; break; @@ -1114,18 +1115,6 @@ copy_reference_ops_from_call (gimple call, } } -/* Create a vector of vn_reference_op_s structures from REF, a - REFERENCE_CLASS_P tree. The vector is not shared. */ - -static vec<vn_reference_op_s> -create_reference_ops_from_ref (tree ref) -{ - vec<vn_reference_op_s> result = vNULL; - - copy_reference_ops_from_ref (ref, &result); - return result; -} - /* Create a vector of vn_reference_op_s structures from CALL, a call statement. The vector is not shared. */ @@ -2096,6 +2085,7 @@ vn_reference_insert (tree op, tree result, tree vuse, tree vdef) { vn_reference_s **slot; vn_reference_t vr1; + bool tem; vr1 = (vn_reference_t) pool_alloc (current_info->references_pool); if (TREE_CODE (result) == SSA_NAME) @@ -2103,7 +2093,7 @@ vn_reference_insert (tree op, tree result, tree vuse, tree vdef) else vr1->value_id = get_or_alloc_constant_value_id (result); vr1->vuse = vuse ? SSA_VAL (vuse) : NULL_TREE; - vr1->operands = valueize_refs (create_reference_ops_from_ref (op)); + vr1->operands = valueize_shared_reference_ops_from_ref (op, &tem).copy (); vr1->type = TREE_TYPE (op); vr1->set = get_alias_set (op); vr1->hashcode = vn_reference_compute_hash (vr1); |