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!