aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-sccvn.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-02-27 13:46:34 +0100
committerRichard Biener <rguenther@suse.de>2020-02-27 13:47:50 +0100
commite431546ff9f1367538ed1307a1c98fa32fec7a8a (patch)
treeae39a5ce6b1bfd253c4f637ff1d309e0f5df0654 /gcc/tree-ssa-sccvn.c
parente840185b31e40466e1575507200e1600e2343454 (diff)
downloadgcc-e431546ff9f1367538ed1307a1c98fa32fec7a8a.zip
gcc-e431546ff9f1367538ed1307a1c98fa32fec7a8a.tar.gz
gcc-e431546ff9f1367538ed1307a1c98fa32fec7a8a.tar.bz2
tree-optimization/93508 - make VN translate through _chk and valueize length
Value-numbering failed to handle __builtin_{memcpy,memset,...}_chk variants when removing abstraction and also failed to use the value-numbering lattice when requiring the length argument of the call to be constant. 2020-02-27 Richard Biener <rguenther@suse.de> PR tree-optimization/93508 * tree-ssa-sccvn.c (vn_reference_lookup_3): Handle _CHK like non-_CHK variants. Valueize their length arguments. * gcc.dg/tree-ssa/ssa-fre-85.c: New testcase.
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r--gcc/tree-ssa-sccvn.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 0487f59..e260ca4 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -2537,7 +2537,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
from that definition.
1) Memset. */
if (is_gimple_reg_type (vr->type)
- && gimple_call_builtin_p (def_stmt, BUILT_IN_MEMSET)
+ && (gimple_call_builtin_p (def_stmt, BUILT_IN_MEMSET)
+ || gimple_call_builtin_p (def_stmt, BUILT_IN_MEMSET_CHK))
&& (integer_zerop (gimple_call_arg (def_stmt, 1))
|| ((TREE_CODE (gimple_call_arg (def_stmt, 1)) == INTEGER_CST
|| (INTEGRAL_TYPE_P (vr->type) && known_eq (ref->size, 8)))
@@ -2548,7 +2549,9 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
&& ref->size.is_constant (&sizei)
&& (offseti % BITS_PER_UNIT == 0
|| TREE_CODE (gimple_call_arg (def_stmt, 1)) == INTEGER_CST)))
- && poly_int_tree_p (gimple_call_arg (def_stmt, 2))
+ && (poly_int_tree_p (gimple_call_arg (def_stmt, 2))
+ || (TREE_CODE (gimple_call_arg (def_stmt, 2)) == SSA_NAME
+ && poly_int_tree_p (SSA_VAL (gimple_call_arg (def_stmt, 2)))))
&& (TREE_CODE (gimple_call_arg (def_stmt, 0)) == ADDR_EXPR
|| TREE_CODE (gimple_call_arg (def_stmt, 0)) == SSA_NAME))
{
@@ -2609,6 +2612,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
return (void *)-1;
tree len = gimple_call_arg (def_stmt, 2);
HOST_WIDE_INT leni, offset2i;
+ if (TREE_CODE (len) == SSA_NAME)
+ len = SSA_VAL (len);
/* Sometimes the above trickery is smarter than alias analysis. Take
advantage of that. */
if (!ranges_maybe_overlap_p (offset, maxsize, offset2,
@@ -3149,13 +3154,19 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
&& is_gimple_reg_type (vr->type)
/* ??? Handle BCOPY as well. */
&& (gimple_call_builtin_p (def_stmt, BUILT_IN_MEMCPY)
+ || gimple_call_builtin_p (def_stmt, BUILT_IN_MEMCPY_CHK)
|| gimple_call_builtin_p (def_stmt, BUILT_IN_MEMPCPY)
- || gimple_call_builtin_p (def_stmt, BUILT_IN_MEMMOVE))
+ || gimple_call_builtin_p (def_stmt, BUILT_IN_MEMPCPY_CHK)
+ || gimple_call_builtin_p (def_stmt, BUILT_IN_MEMMOVE)
+ || gimple_call_builtin_p (def_stmt, BUILT_IN_MEMMOVE_CHK))
&& (TREE_CODE (gimple_call_arg (def_stmt, 0)) == ADDR_EXPR
|| TREE_CODE (gimple_call_arg (def_stmt, 0)) == SSA_NAME)
&& (TREE_CODE (gimple_call_arg (def_stmt, 1)) == ADDR_EXPR
|| TREE_CODE (gimple_call_arg (def_stmt, 1)) == SSA_NAME)
- && poly_int_tree_p (gimple_call_arg (def_stmt, 2), &copy_size)
+ && (poly_int_tree_p (gimple_call_arg (def_stmt, 2), &copy_size)
+ || (TREE_CODE (gimple_call_arg (def_stmt, 2)) == SSA_NAME
+ && poly_int_tree_p (SSA_VAL (gimple_call_arg (def_stmt, 2)),
+ &copy_size)))
/* Handling this is more complicated, give up for now. */
&& data->partial_defs.is_empty ())
{