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:
parent
5916922e34
commit
2bf8ae1b3d
@ -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
|
||||
|
@ -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
|
||||
|
16
gcc/testsuite/gcc.dg/torture/pr88223.c
Normal file
16
gcc/testsuite/gcc.dg/torture/pr88223.c
Normal 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);
|
||||
}
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user