From: Richard Biener Date: Tue, 14 Jun 2016 10:42:00 +0000 (+0000) Subject: re PR tree-optimization/71522 (Wrong optimization of memcpy through a var of type... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=04976c6e075f10b80376f82a88f9450957c21cc5;p=gcc.git re PR tree-optimization/71522 (Wrong optimization of memcpy through a var of type long double) 2016-06-14 Richard Biener 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1a3e5fdd907..990444312d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-06-14 Richard Biener + + 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 PR tree-optimization/71520 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9b38c06854c..dfe4fb766b1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-06-14 Richard Biener + + PR tree-optimization/71522 + * gcc.dg/torture/pr71522.c: New testcase. + 2016-06-14 Jakub Jelinek PR tree-optimization/71520 diff --git a/gcc/testsuite/gcc.dg/torture/pr71522.c b/gcc/testsuite/gcc.dg/torture/pr71522.c new file mode 100644 index 00000000000..953c4c71100 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr71522.c @@ -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; +} diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 30c6269e345..247fa0717dd 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -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;