aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-sccvn.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-05-23 07:08:43 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-05-23 07:08:43 +0000
commitb72feab889cd7925fab59771269638fcc88bc195 (patch)
tree18db96dd908525e794b421bc94164a84d7bb9c1c /gcc/tree-ssa-sccvn.c
parent3423a64d46de09a8625db4c2ec2b6a1586f40c56 (diff)
downloadgcc-b72feab889cd7925fab59771269638fcc88bc195.zip
gcc-b72feab889cd7925fab59771269638fcc88bc195.tar.gz
gcc-b72feab889cd7925fab59771269638fcc88bc195.tar.bz2
tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary memset constants via native_interpret_expr.
2018-05-23 Richard Biener <rguenther@suse.de> * 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
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r--gcc/tree-ssa-sccvn.c17
1 files changed, 14 insertions, 3 deletions
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);
}