On 03/29/2011 06:21 AM, Richard Sandiford wrote:
> -  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;
...
> -  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;
> +    }

This smells like a target bug, but I can't quite put my finger
on exactly what's wrong, and I haven't debugged the original.

The backend has said xmode[01] is what it expects.  The only
reason you wouldn't write xmode[01] in the create_input_operand
line is if xmode[01] are VOIDmode.

That seems like mistake number one, particularly for a binop,
but I'll accept that for the nonce.  Which pattern triggered
the problem in the target?

Then we've got the conditionalization in the init of mode[01],
which is presumably to handle CONST_INT as an input.

What about something like

        xmode0 = insn_data...
        if (xmode0 == VOIDmode)
          xmode0 = mode;

        mode0 = GET_MODE (xop0);
        if (mode0 == VOIDmode)
          mode0 = mode;

        if (xmode0 != mode0)
          convert_modes

        create_input_operand(..., xmode0)

?  That seems more obvious than what you have.  And I *think*
it should produce the same results.  If it doesn't, then this
whole block of code needs a lot more explanation.


r~

Reply via email to