https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77833
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- #1 0x0000000000a5937e in plus_constant (mode=SImode, x=0x7ffff6a35fa0, c=-1, inplace=false) at /space/rguenther/src/svn/trunk/gcc/explow.c:87 87 gcc_assert (GET_MODE (x) == VOIDmode || GET_MODE (x) == mode); (gdb) p debug_rtx (x) (const_vector:V2DI [ (const_int 0 [0]) (const_int 1 [0x1]) ]) #3 0x00000000008d737f in init_alias_analysis () at /space/rguenther/src/svn/trunk/gcc/alias.c:3359 3359 INTVAL (XEXP (src, 1))); (gdb) p debug_rtx (insn) (insn 26 25 27 2 (parallel [ (set (reg:SI 115 [ i ]) (plus:SI (reg:SI 92 [ _6 ]) (const_int -1 [0xffffffffffffffff]))) (clobber (reg:CC 17 flags)) ]) t.c:9 211 {*addsi_1} (expr_list:REG_DEAD (reg:SI 92 [ _6 ]) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) (gdb) p debug_rtx (t) (mem/u/c:SI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [1 S4 A128]) so we're running into case MEM: /* If this is a reference to the constant pool, try replacing it with a reference to a new constant. If the resulting address isn't valid, don't return it because we have no way to validize it. */ if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0))) { rtx cst = get_pool_constant (XEXP (x, 0)); if (GET_CODE (cst) == CONST_VECTOR && GET_MODE_INNER (GET_MODE (cst)) == mode) { cst = gen_lowpart (mode, cst); gcc_assert (cst); } with mode == SImode and cst == V2DI. I think the above needs to give up for CONST_VECTOR != VNmode.