expr.c line 8139 has this:
/* Attempt to return something suitable for generating an indexed address, for machines that support that. */ if (modifier == EXPAND_SUM && mode == ptr_mode && host_integerp (treeop1, 0)) { tree exp1 = treeop1; op0 = expand_expr (treeop0, subtarget, VOIDmode, EXPAND_SUM); if (!REG_P (op0)) op0 = force_operand (op0, NULL_RTX); if (!REG_P (op0)) op0 = copy_to_mode_reg (mode, op0); return REDUCE_BIT_FIELD (gen_rtx_MULT (mode, op0, gen_int_mode (tree_low_cst (exp1, 0), TYPE_MODE (TREE_TYPE (exp1))))); } Why isn't there a check to see if the machine actually supports that MULT before blindly generating it? The expand_mult() that follows is able to handle that case if the machine doesn't have indexed addresses or a real MUL insn.