I am testing the following to fix PR71522. Bootstrap / regtest running on x86_64-unknown-linux-gnu.
Richard. 2016-06-14 Richard Biener <rguent...@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. Index: gcc/tree-ssa.c =================================================================== *** gcc/tree-ssa.c (revision 237426) --- gcc/tree-ssa.c (working copy) *************** non_rewritable_lvalue_p (tree lhs) *** 1300,1305 **** --- 1328,1337 ---- || (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; Index: gcc/testsuite/gcc.dg/torture/pr71522.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr71522.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr71522.c (working copy) *************** *** 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; + }