aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorChristian Bruel <christian.bruel@st.com>2016-01-22 15:16:47 +0100
committerChristian Bruel <chrbr@gcc.gnu.org>2016-01-22 15:16:47 +0100
commit7c816d0f462a6ef8b1613928bd68928d232620cb (patch)
tree80a6e36f10b35eb5f573e1f07a79f7ef15a859ad /gcc/expr.c
parentfce661e8d5495d871e01b4bf6afd26203ed8fa7a (diff)
downloadgcc-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.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 0ce5936..3b7f135 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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)