re PR tree-optimization/71522 (Wrong optimization of memcpy through a var of type long double)

2016-06-14  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/71522
	* tree-ssa.c (non_rewritable_lvalue_p): Do not rewrite non-float
	copying into float copying.

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

From-SVN: r237429
This commit is contained in:
Richard Biener 2016-06-14 10:42:00 +00:00 committed by Richard Biener
parent 86c24ba677
commit 04976c6e07
4 changed files with 42 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2016-06-14 Richard Biener <rguenther@suse.de>
PR tree-optimization/71522
* tree-ssa.c (non_rewritable_lvalue_p): Do not rewrite non-float
copying into float copying.
2016-06-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/71520

View File

@ -1,3 +1,8 @@
2016-06-14 Richard Biener <rguenther@suse.de>
PR tree-optimization/71522
* gcc.dg/torture/pr71522.c: New testcase.
2016-06-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/71520

View File

@ -0,0 +1,27 @@
/* { dg-do run } */
#if __SIZEOF_LONG_DOUBLE__ == 16
#define STR "AAAAAAAAAAAAAAA"
#elif __SIZEOF_LONG_DOUBLE__ == 12
#define STR "AAAAAAAAAAA"
#elif __SIZEOF_LONG_DOUBLE__ == 8
#define STR "AAAAAAA"
#elif __SIZEOF_LONG_DOUBLE__ == 4
#define STR "AAA"
#else
#define STR "A"
#endif
int main()
{
long double d;
char s[sizeof d];
__builtin_memcpy(&d, STR, sizeof d);
__builtin_memcpy(&s, &d, sizeof s);
if (__builtin_strncmp (s, STR, sizeof s) != 0)
__builtin_abort ();
return 0;
}

View File

@ -1300,6 +1300,10 @@ non_rewritable_lvalue_p (tree lhs)
|| (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
&& (TYPE_PRECISION (TREE_TYPE (decl))
>= TYPE_PRECISION (TREE_TYPE (lhs)))))
/* Make sure we are not re-writing non-float copying into float
copying as that can incur normalization. */
&& (! FLOAT_TYPE_P (TREE_TYPE (decl))
|| types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
&& (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
return false;