This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.
>  > 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]