From: jakub Date: Tue, 16 Feb 2016 15:15:40 +0000 (+0000) Subject: PR rtl-optimization/69764 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3ae1cc909273683bc08e3a03b67984d8de035237;p=thirdparty%2Fgcc.git PR rtl-optimization/69764 PR rtl-optimization/69771 * optabs.c (expand_binop): Ensure for shift optabs invalid CONST_INT op1 is valid for GET_MODE_INNER (mode) and force it into a reg. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233456 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7fd48ec3ab0e..5eb87544b680 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-02-16 Jakub Jelinek + + PR rtl-optimization/69764 + PR rtl-optimization/69771 + * optabs.c (expand_binop): Ensure for shift optabs invalid CONST_INT + op1 is valid for GET_MODE_INNER (mode) and force it into a reg. + 2016-02-16 Richard Biener PR tree-optimization/69776 diff --git a/gcc/optabs.c b/gcc/optabs.c index b651878b7250..a6d8822b87ed 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -1125,6 +1125,16 @@ expand_binop (machine_mode mode, optab binoptab, rtx op0, rtx op1, op1 = negate_rtx (mode, op1); binoptab = add_optab; } + /* For shifts, constant invalid op1 might be expanded from different + mode than MODE. As those are invalid, force them to a register + to avoid further problems during expansion. */ + else if (CONST_INT_P (op1) + && shift_optab_p (binoptab) + && UINTVAL (op1) >= GET_MODE_BITSIZE (GET_MODE_INNER (mode))) + { + op1 = gen_int_mode (INTVAL (op1), GET_MODE_INNER (mode)); + op1 = force_reg (GET_MODE_INNER (mode), op1); + } /* Record where to delete back to if we backtrack. */ last = get_last_insn ();