On Thu, Sep 27, 2012 at 08:04:58PM +0200, Uros Bizjak wrote:
> After some off-line discussion with Richard, attached is v2 of the patch.
> 
> 2012-09-27  Uros Bizjak  <ubiz...@gmail.com>
> 
>         PR rtl-optimization/54457
>         * simplify-rtx.c (simplify_subreg):
>       Simplify (subreg:SI (op:DI ((x:DI) (y:DI)), 0)
>       to (op:SI (subreg:SI (x:DI) 0) (subreg:SI (x:DI) 0)).

Is that a good idea even for WORD_REGISTER_OPERATIONS targets?

> --- simplify-rtx.c    (revision 191808)
> +++ simplify-rtx.c    (working copy)
> @@ -5689,6 +5689,28 @@ simplify_subreg (enum machine_mode outermode, rtx
>       return CONST0_RTX (outermode);
>      }
>  
> +  /* Simplify (subreg:SI (op:DI ((x:DI) (y:DI)), 0)
> +     to (op:SI (subreg:SI (x:DI) 0) (subreg:SI (x:DI) 0)), where
> +     the outer subreg is effectively a truncation to the original mode.  */
> +  if ((GET_CODE (op) == PLUS
> +       || GET_CODE (op) == MINUS
> +       || GET_CODE (op) == MULT)
> +      && SCALAR_INT_MODE_P (outermode)
> +      && SCALAR_INT_MODE_P (innermode)
> +      && GET_MODE_PRECISION (outermode) < GET_MODE_PRECISION (innermode)
> +      && byte == subreg_lowpart_offset (outermode, innermode))
> +    {
> +      rtx op0 = simplify_gen_subreg (outermode, XEXP (op, 0),
> +                                     innermode, byte);
> +      if (op0)
> +        {
> +          rtx op1 = simplify_gen_subreg (outermode, XEXP (op, 1),
> +                                         innermode, byte);
> +          if (op1)
> +            return simplify_gen_binary (GET_CODE (op), outermode, op0, op1);
> +        }
> +    }
> +
>    /* Simplify (subreg:QI (lshiftrt:SI (sign_extend:SI (x:QI)) C), 0) into
>       to (ashiftrt:QI (x:QI) C), where C is a suitable small constant and
>       the outer subreg is effectively a truncation to the original mode.  */

        Jakub

Reply via email to