diff options
author | Christian Bruel <christian.bruel@st.com> | 2016-01-22 15:16:47 +0100 |
---|---|---|
committer | Christian Bruel <chrbr@gcc.gnu.org> | 2016-01-22 15:16:47 +0100 |
commit | 7c816d0f462a6ef8b1613928bd68928d232620cb (patch) | |
tree | 80a6e36f10b35eb5f573e1f07a79f7ef15a859ad /gcc/expr.c | |
parent | fce661e8d5495d871e01b4bf6afd26203ed8fa7a (diff) | |
download | gcc-7c816d0f462a6ef8b1613928bd68928d232620cb.zip gcc-7c816d0f462a6ef8b1613928bd68928d232620cb.tar.gz gcc-7c816d0f462a6ef8b1613928bd68928d232620cb.tar.bz2 |
[multiple changes]
2016-01-22 Christian Bruel <christian.bruel@st.com>
PR target/68674
* expr.c (expand_expr_real_1): Reset DECL_MODE if VECTOR_TYPE_P changed.
// testsuite
2016-01-21 Christian Bruel <christian.bruel@st.com>
PR target/68674
* gcc.target/i386/pr68674.c
* gcc.target/aarch64/pr68674.c
* gcc.target/arm/pr68674.c
From-SVN: r232728
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -9597,7 +9597,16 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode tmode, decl_rtl = DECL_RTL (exp); expand_decl_rtl: gcc_assert (decl_rtl); - decl_rtl = copy_rtx (decl_rtl); + + /* DECL_MODE might change when TYPE_MODE depends on attribute target + settings for VECTOR_TYPE_P that might switch for the function. */ + if (currently_expanding_to_rtl + && code == VAR_DECL && MEM_P (decl_rtl) + && VECTOR_TYPE_P (type) && exp && DECL_MODE (exp) != mode) + decl_rtl = change_address (decl_rtl, TYPE_MODE (type), 0); + else + decl_rtl = copy_rtx (decl_rtl); + /* Record writes to register variables. */ if (modifier == EXPAND_WRITE && REG_P (decl_rtl) |