Commit 2bf8ae1b by Richard Biener Committed by Richard Biener

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
parent 5916922e
2018-11-28 Richard Biener <rguenther@suse.de> 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 PR tree-optimization/88217
* vr-values.c (vr_values::extract_range_from_phi_node): Make * vr-values.c (vr_values::extract_range_from_phi_node): Make
sure to handle results > +INF and < -INF correctly when sure to handle results > +INF and < -INF correctly when
2018-11-28 Richard Biener <rguenther@suse.de> 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 PR tree-optimization/88217
* g++.dg/pr88217.C: New testcase. * g++.dg/pr88217.C: New testcase.
......
/* { 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_, ...@@ -1927,7 +1927,16 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
VN_WALKREWRITE guard). */ VN_WALKREWRITE guard). */
if (vn_walk_kind == VN_WALKREWRITE if (vn_walk_kind == VN_WALKREWRITE
&& is_gimple_reg_type (TREE_TYPE (lhs)) && 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; tree *saved_last_vuse_ptr = last_vuse_ptr;
/* Do not update last_vuse_ptr in vn_reference_lookup_2. */ /* Do not update last_vuse_ptr in vn_reference_lookup_2. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment