This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Cleaning up expand optabs code
Mikael Pettersson <mikpe@it.uu.se> writes:
> > gcc/
> > PR rtl-optimization/48332
> > * optabs.c (expand_binop_directly): Set xmodeN to the target-mandated
> > mode of input operand N and modeN to its actual mode.
>
> Thanks, this allowed me to build gcc-4.7 as a cross to m68k-linux again.
Good to hear, thanks for testing.
> I'm starting a native bootstrap of gcc-4.7 head + this fix on m68k, but
> that will take about 5 days to complete...
Ouch.
Hopefully this time I've finally got it right. Bootstrapped &
regression-tested on x86_64-linux-gnu. OK to install?
Richard
> >
> > Index: gcc/optabs.c
> > ===================================================================
> > --- gcc/optabs.c 2011-03-24 17:23:05.000000000 +0000
> > +++ gcc/optabs.c 2011-03-29 14:18:02.000000000 +0100
> > @@ -1243,9 +1243,9 @@ expand_binop_directly (enum machine_mode
> > rtx last)
> > {
> > enum insn_code icode = optab_handler (binoptab, mode);
> > - enum machine_mode mode0 = insn_data[(int) icode].operand[1].mode;
> > - enum machine_mode mode1 = insn_data[(int) icode].operand[2].mode;
> > - enum machine_mode tmp_mode;
> > + enum machine_mode xmode0 = insn_data[(int) icode].operand[1].mode;
> > + enum machine_mode xmode1 = insn_data[(int) icode].operand[2].mode;
> > + enum machine_mode mode0, mode1, tmp_mode;
> > struct expand_operand ops[3];
> > bool commutative_p;
> > rtx pat;
> > @@ -1256,8 +1256,8 @@ expand_binop_directly (enum machine_mode
> > if we would swap the operands, we can save the conversions. */
> > commutative_p = commutative_optab_p (binoptab);
> > if (commutative_p
> > - && GET_MODE (xop0) != mode0 && GET_MODE (xop1) != mode1
> > - && GET_MODE (xop0) == mode1 && GET_MODE (xop1) == mode1)
> > + && GET_MODE (xop0) != xmode0 && GET_MODE (xop1) != xmode1
> > + && GET_MODE (xop0) == xmode1 && GET_MODE (xop1) == xmode1)
> > {
> > swap = xop0;
> > xop0 = xop1;
> > @@ -1265,9 +1265,9 @@ expand_binop_directly (enum machine_mode
> > }
> >
> > /* If we are optimizing, force expensive constants into a register. */
> > - xop0 = avoid_expensive_constant (mode0, binoptab, xop0, unsignedp);
> > + xop0 = avoid_expensive_constant (xmode0, binoptab, xop0, unsignedp);
> > if (!shift_optab_p (binoptab))
> > - xop1 = avoid_expensive_constant (mode1, binoptab, xop1, unsignedp);
> > + xop1 = avoid_expensive_constant (xmode1, binoptab, xop1, unsignedp);
> >
> > /* In case the insn wants input operands in modes different from
> > those of the actual operands, convert the operands. It would
> > @@ -1275,19 +1275,19 @@ expand_binop_directly (enum machine_mode
> > that they're properly zero-extended, sign-extended or truncated
> > for their mode. */
> >
> > - if (GET_MODE (xop0) != mode0 && mode0 != VOIDmode)
> > - xop0 = convert_modes (mode0,
> > - GET_MODE (xop0) != VOIDmode
> > - ? GET_MODE (xop0)
> > - : mode,
> > - xop0, unsignedp);
> > -
> > - if (GET_MODE (xop1) != mode1 && mode1 != VOIDmode)
> > - xop1 = convert_modes (mode1,
> > - GET_MODE (xop1) != VOIDmode
> > - ? GET_MODE (xop1)
> > - : mode,
> > - xop1, unsignedp);
> > + mode0 = GET_MODE (xop0) != VOIDmode ? GET_MODE (xop0) : mode;
> > + if (xmode0 != VOIDmode && xmode0 != mode0)
> > + {
> > + xop0 = convert_modes (xmode0, mode0, xop0, unsignedp);
> > + mode0 = xmode0;
> > + }
> > +
> > + mode1 = GET_MODE (xop1) != VOIDmode ? GET_MODE (xop1) : mode;
> > + if (xmode1 != VOIDmode && xmode1 != mode1)
> > + {
> > + xop1 = convert_modes (xmode1, mode1, xop1, unsignedp);
> > + mode1 = xmode1;
> > + }
> >
> > /* If operation is commutative,
> > try to make the first operand a register.
> >