From b72feab889cd7925fab59771269638fcc88bc195 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 23 May 2018 07:08:43 +0000 Subject: tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary memset constants via native_interpret_expr. 2018-05-23 Richard Biener * tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary memset constants via native_interpret_expr. * gcc.dg/tree-ssa/ssa-fre-65.c: New testcase. From-SVN: r260565 --- gcc/tree-ssa-sccvn.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'gcc/tree-ssa-sccvn.c') diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 884cce1..96e80c7 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1959,9 +1959,9 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_, if (is_gimple_reg_type (vr->type) && gimple_call_builtin_p (def_stmt, BUILT_IN_MEMSET) && (integer_zerop (gimple_call_arg (def_stmt, 1)) - || (INTEGRAL_TYPE_P (vr->type) + || ((TREE_CODE (gimple_call_arg (def_stmt, 1)) == INTEGER_CST + || (INTEGRAL_TYPE_P (vr->type) && known_eq (ref->size, 8))) && CHAR_BIT == 8 && BITS_PER_UNIT == 8 - && known_eq (ref->size, 8) && known_eq (ref->size, maxsize) && offset.is_constant (&offseti) && offseti % BITS_PER_UNIT == 0)) @@ -2030,7 +2030,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_, tree val; if (integer_zerop (gimple_call_arg (def_stmt, 1))) val = build_zero_cst (vr->type); - else + else if (INTEGRAL_TYPE_P (vr->type) + && known_eq (ref->size, 8)) { code_helper rcode = NOP_EXPR; tree ops[3] = {}; @@ -2041,6 +2042,16 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_, && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val))) return (void *)-1; } + else + { + unsigned len = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (vr->type)); + unsigned char *buf = XALLOCAVEC (unsigned char, len); + memset (buf, TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 1)), + len); + val = native_interpret_expr (vr->type, buf, len); + if (!val) + return (void *)-1; + } return vn_reference_lookup_or_insert_for_pieces (vuse, vr->set, vr->type, vr->operands, val); } -- cgit v1.1