The following patch fixes a SSA rewrite issue in gimple_regimplify_operands (some bigger rewrite is IMHO necessary here or in the caller in this case, the inliner, but that's not appropriate now or for branches).
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2016-04-05 Richard Biener <rguent...@suse.de> PR middle-end/70499 * gimplify-me.c (gimple_regimplify_operands): Do not rewrite non-register type temporaries into SSA. * g++.dg/torture/pr70499.C: New testcase. Index: gcc/gimplify-me.c =================================================================== *** gcc/gimplify-me.c (revision 234705) --- gcc/gimplify-me.c (working copy) *************** gimple_regimplify_operands (gimple *stmt *** 299,305 **** if (need_temp) { tree temp = create_tmp_reg (TREE_TYPE (lhs)); ! if (gimple_in_ssa_p (cfun)) temp = make_ssa_name (temp); gimple_set_lhs (stmt, temp); post_stmt = gimple_build_assign (lhs, temp); --- 299,306 ---- if (need_temp) { tree temp = create_tmp_reg (TREE_TYPE (lhs)); ! if (gimple_in_ssa_p (cfun) ! && is_gimple_reg_type (TREE_TYPE (lhs))) temp = make_ssa_name (temp); gimple_set_lhs (stmt, temp); post_stmt = gimple_build_assign (lhs, temp); Index: gcc/testsuite/g++.dg/torture/pr70499.C =================================================================== *** gcc/testsuite/g++.dg/torture/pr70499.C (revision 0) --- gcc/testsuite/g++.dg/torture/pr70499.C (working copy) *************** *** 0 **** --- 1,39 ---- + // { dg-do compile } + // { dg-additional-options "-w -Wno-psabi" } + // { dg-additional-options "-mavx" { target x86_64-*-* i?86-*-* } } + + typedef double __m256d __attribute__ ((__vector_size__ (32), __may_alias__)); + + struct SIMD { + __m256d data; + SIMD() {}; + SIMD (double val) { } + SIMD(__m256d _data) { data = _data; } + SIMD operator* (SIMD a) { return a; } + }; + + struct Foo { + SIMD val; + SIMD dval[2]; + __attribute__((__always_inline__)) SIMD & Value() throw() { return val; } + __attribute__((__always_inline__)) Foo operator* ( const Foo & y) throw() + { + Foo res; + SIMD hx; + SIMD hy; + res.Value() = hx*hy; + res.dval[0] = hx*hy; + return res; + } + }; + + template<typename Tx> + __attribute__((__always_inline__)) inline void inlineFunc(Tx hx[]) { + Tx x = hx[0], y = hx[1]; + Tx lam[1] = (x*y); + } + + void FooBarFunc () { + Foo adp[2]; + inlineFunc (adp); + }