re PR middle-end/69715 (ICE: in store_bit_field_1, at expmed.c:839)
authorRichard Biener <rguenther@suse.de>
Tue, 9 Feb 2016 08:35:22 +0000 (08:35 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 9 Feb 2016 08:35:22 +0000 (08:35 +0000)
2016-02-09  Richard Biener  <rguenther@suse.de>

PR tree-optimization/69715
* tree-ssa.c (execute_update_addresses_taken): Mark non-decl
LHS on calls as non-rewritable.

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

From-SVN: r233239

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr69715.c [new file with mode: 0644]
gcc/tree-ssa.c

index 8006790a0f83754db59773c4a5cae50706d5c26a..27272446b68465ed18a76a88a78246cefee0a651 100644 (file)
@@ -1,3 +1,9 @@
+2016-02-09  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69715
+       * tree-ssa.c (execute_update_addresses_taken): Mark non-decl
+       LHS on calls as non-rewritable.
+
 2016-02-09  Tom de Vries  <tom@codesourcery.com>
 
        PR lto/69707
index 700ba0e28c485aa9bb75ae48115d51d3f10ede76..b5146996bf38c53dc8a5e9ecee3455eb397d5014 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-09  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69715
+       * gcc.dg/torture/pr69715.c: New testcase.
+
 2016-02-08  Patrick Palka  <ppalka@gcc.gnu.org>
 
        PR c++/69139
diff --git a/gcc/testsuite/gcc.dg/torture/pr69715.c b/gcc/testsuite/gcc.dg/torture/pr69715.c
new file mode 100644 (file)
index 0000000..cecc82c
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+struct __attribute__((may_alias)) S { long long low; int high; };
+struct S foo (void);
+long double
+bar (void)
+{
+  long double a;
+  *(struct S *)&a = foo ();
+  return a;
+}
index adba2d8187012a82405b49d3d768224bda35c0a3..6a16d268e69bb3697e1ae11b6fc3eb91710a341b 100644 (file)
@@ -1436,7 +1436,8 @@ execute_update_addresses_taken (void)
               tree lhs = gimple_get_lhs (stmt);
               if (lhs
                  && TREE_CODE (lhs) != SSA_NAME
-                 && non_rewritable_lvalue_p (lhs))
+                 && ((code == GIMPLE_CALL && ! DECL_P (lhs))
+                     || non_rewritable_lvalue_p (lhs)))
                {
                  decl = get_base_address (lhs);
                  if (DECL_P (decl))