aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr71522.c27
-rw-r--r--gcc/tree-ssa.c4
4 files changed, 42 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1a3e5fd..9904443 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9b38c06..dfe4fb7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/torture/pr71522.c b/gcc/testsuite/gcc.dg/torture/pr71522.c
new file mode 100644
index 0000000..953c4c7
--- /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 30c6269..247fa07 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;