Cleaning up expand optabs code
Mikael Pettersson
mikpe@it.uu.se
Tue Mar 29 14:27:00 GMT 2011
Richard Sandiford writes:
> Mikael Pettersson <mikpe@it.uu.se> writes:
> > Richard Sandiford writes:
> > > Andreas Krebbel <krebbel@linux.vnet.ibm.com> writes:
> > > > On 03/22/2011 06:48 PM, Richard Henderson wrote:
> > > >
> > > >> Ok. Watch out for other target problems this week.
> > > >
> > > > This unfortunately broke bootstrap on s390.
> > >
> > > This is PR 48263. Since it seems to be affecting several targets,
> > > and since my bootstrap seems to be taking a looong time, I'll post
> > > the patch here before testing has finished.
> > >
> > > > Just copying the pre-patch behaviour fixes the problem for me:
> > >
> > > I think we need to undo more of the patch, and leave the conversion
> > > outside of the new interface.
> > >
> > > Sorry for the breakage.
> > >
> > > Richard
> > >
> > >
> > > gcc/
> > > PR rtl-optimization/48263
> > > * optabs.c (expand_binop_directly): Reinstate convert_modes code
> > > and original commutative_p handling. Use maybe_gen_insn.
> >
> > Unfortunately this fix (r171418) broke m68k-linux, see
> > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48332
>
> Please try the attached
>
> Richard
>
>
> 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.
I'm starting a native bootstrap of gcc-4.7 head + this fix on m68k, but
that will take about 5 days to complete...
/Mikael
>
> 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.
>
More information about the Gcc-patches
mailing list