aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-10-14 21:36:58 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-10-14 21:36:58 +0200
commit9a822fc79deecdc3bad1bcca0bb1ffebdd3b404c (patch)
tree36bed8b0d91b88b82bc830d5b4b61a43f841f21d /gcc/expr.c
parent6af11d2bf41df9baf3fda28f4a270d6d4de65341 (diff)
downloadgcc-9a822fc79deecdc3bad1bcca0bb1ffebdd3b404c.zip
gcc-9a822fc79deecdc3bad1bcca0bb1ffebdd3b404c.tar.gz
gcc-9a822fc79deecdc3bad1bcca0bb1ffebdd3b404c.tar.bz2
re PR middle-end/77959 (ICE in ix86_decompose_address, at i386/i386.c:14954)
PR middle-end/77959 * expr.c (expand_expr_real_1) <case CONST_DECL>: For EXPAND_WRITE return a MEM. * gfortran.dg/pr77959.f90: New test. From-SVN: r241182
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index b587da8..28242b2 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -9915,6 +9915,19 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode tmode,
}
case CONST_DECL:
+ if (modifier == EXPAND_WRITE)
+ {
+ /* Writing into CONST_DECL is always invalid, but handle it
+ gracefully. */
+ addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (exp));
+ machine_mode address_mode = targetm.addr_space.address_mode (as);
+ op0 = expand_expr_addr_expr_1 (exp, NULL_RTX, address_mode,
+ EXPAND_NORMAL, as);
+ op0 = memory_address_addr_space (mode, op0, as);
+ temp = gen_rtx_MEM (mode, op0);
+ set_mem_addr_space (temp, as);
+ return temp;
+ }
return expand_expr (DECL_INITIAL (exp), target, VOIDmode, modifier);
case REAL_CST: