re PR tree-optimization/88223 (Wrong code for intrinsic memmove)

2018-11-28  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/88223
	* tree-ssa-sccvn.c (vn_reference_lookup_3): When skipping
	over a stored-same value may-alias store make sure to consider
	partial overlaps which are valid when TBAA reasonings do not
	apply and byte-granular overlaps are possible at all.

	* gcc.dg/torture/pr88223.c: New testcase.

From-SVN: r266560
This commit is contained in:
Richard Biener 2018-11-28 13:51:42 +00:00 committed by Richard Biener
parent 5916922e34
commit 2bf8ae1b3d
4 changed files with 39 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2018-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/88223
* tree-ssa-sccvn.c (vn_reference_lookup_3): When skipping
over a stored-same value may-alias store make sure to consider
partial overlaps which are valid when TBAA reasonings do not
apply and byte-granular overlaps are possible at all.
2018-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/88217

View File

@ -1,3 +1,8 @@
2018-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/88223
* gcc.dg/torture/pr88223.c: New testcase.
2018-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/88217

View File

@ -0,0 +1,16 @@
/* { dg-do run } */
extern void *memmove(void *, const void *, __SIZE_TYPE__);
extern void abort(void);
extern int
main(void)
{
char s[] = "12345";
memmove(s + 1, s, 4);
memmove(s + 1, s, 4);
memmove(s + 1, s, 4);
if (s[0] != '1' || s[1] != '1' || s[2] != '1' || s[3] != '1' || s[4] != '2')
abort ();
return (0);
}

View File

@ -1927,7 +1927,16 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
VN_WALKREWRITE guard). */
if (vn_walk_kind == VN_WALKREWRITE
&& is_gimple_reg_type (TREE_TYPE (lhs))
&& types_compatible_p (TREE_TYPE (lhs), vr->type))
&& types_compatible_p (TREE_TYPE (lhs), vr->type)
/* The overlap restriction breaks down when either access
alias-set is zero. Still for accesses of the size of
an addressable unit there can be no overlaps. Overlaps
between different union members are not an issue since
activation of a union member via a store makes the
values of untouched bytes unspecified. */
&& (known_eq (ref->size, BITS_PER_UNIT)
|| (get_alias_set (lhs) != 0
&& ao_ref_alias_set (ref) != 0)))
{
tree *saved_last_vuse_ptr = last_vuse_ptr;
/* Do not update last_vuse_ptr in vn_reference_lookup_2. */