The following fixes update-address-taken to properly reject rewriting decls into SSA that require fixup of call lhs because that's not done.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2016-02-09 Richard Biener <rguent...@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. Index: gcc/tree-ssa.c =================================================================== *** gcc/tree-ssa.c (revision 233211) --- gcc/tree-ssa.c (working copy) *************** execute_update_addresses_taken (void) *** 1436,1442 **** tree lhs = gimple_get_lhs (stmt); if (lhs && TREE_CODE (lhs) != SSA_NAME ! && non_rewritable_lvalue_p (lhs)) { decl = get_base_address (lhs); if (DECL_P (decl)) --- 1443,1450 ---- tree lhs = gimple_get_lhs (stmt); if (lhs && TREE_CODE (lhs) != SSA_NAME ! && ((code == GIMPLE_CALL && ! DECL_P (lhs)) ! || non_rewritable_lvalue_p (lhs))) { decl = get_base_address (lhs); if (DECL_P (decl)) Index: gcc/testsuite/gcc.dg/torture/pr69715.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr69715.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr69715.c (working copy) *************** *** 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; + }