https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109592

--- Comment #2 from Feng Wang <wangfeng at eswincomputing dot com> ---
(In reply to Feng Wang from comment #1)
> Hi Jeff,
> 
> I have modified some code according to your suggestion.
> In simplify-rtx.cc I add below part in canonicalize_shift:
>       if ((code == ASHIFTRT)
>           && is_a <scalar_int_mode> (mode, &int_mode)
>           && GET_CODE (op0) == ASHIFT
>           && CONST_INT_P (op1)
>           && is_a <scalar_int_mode> (GET_MODE (op0), &inner_mode)
>           && CONST_INT_P (XEXP (op0, 1))
>           && (INTVAL (XEXP (op0, 1)) == INTVAL (op1)))
>         {
>           tem = XEXP (op0, 0);
>           if (SUBREG_P(XEXP (op0, 0))
>               && is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (XEXP (op0,
> 0))),
>                                          &inner_mode)
>               && GET_MODE_BITSIZE (inner_mode) > GET_MODE_BITSIZE (int_mode))
>           {
>             tem = XEXP (XEXP (op0, 0), 0);
>           }
> 
>           if ((INTVAL (op1) + 8 == 32) || (INTVAL (op1) + 8 == 64))
>           {
>             op0 = lowpart_subreg (E_QImode, tem, GET_MODE(tem));
>             return simplify_gen_unary (SIGN_EXTEND, int_mode, op0, int_mode);
>           }
> 
>           if ((INTVAL (op1) + 16 == 32) || (INTVAL (op1) + 16 == 64))
>           {
>             op0 = lowpart_subreg (E_HImode, tem, GET_MODE(tem));
>             return simplify_gen_unary (SIGN_EXTEND, int_mode, op0, int_mode);
>           }
>         }
> 
> and at the same time in fwprop.cc I add below conditions in classify_result
> to judge whether replacement is PROFITABLE
>     /* If have load byte or load half pattern, we can covert
>      ashiftrt(ashift(object)const)const to load byte or half form object */
>   if (GET_CODE(old_rtx) == ASHIFTRT
>       && GET_CODE(new_rtx) == SIGN_EXTEND
>       && ((GET_MODE(new_rtx) == E_SImode
>            && ((GET_MODE(XEXP(new_rtx, 0)) == E_QImode 
>                 && HAVE_extendqisi2)
>             || (GET_MODE(XEXP(new_rtx, 0)) == E_HImode
>                 && HAVE_extendhisi2)))
>           ||(GET_MODE(new_rtx) == E_DImode
>            && ((GET_MODE(XEXP(new_rtx, 0)) == E_QImode
>                  && HAVE_extendqidi2)
>             || (GET_MODE(XEXP(new_rtx, 0)) == E_HImode
>                  && HAVE_extendhidi2))))
>     return PROFITABLE;
> 
> Please check if it is reasonable and look forward to further discussion with
> you.Thanks!

Reply via email to