diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-10-14 21:36:58 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-10-14 21:36:58 +0200 |
commit | 9a822fc79deecdc3bad1bcca0bb1ffebdd3b404c (patch) | |
tree | 36bed8b0d91b88b82bc830d5b4b61a43f841f21d /gcc/expr.c | |
parent | 6af11d2bf41df9baf3fda28f4a270d6d4de65341 (diff) | |
download | gcc-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.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -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: |