On Mon, Sep 13, 2021 at 5:15 PM Richard Biener <richard.guent...@gmail.com> wrote: > > On Mon, Sep 13, 2021 at 8:26 AM Hongtao Liu <crazy...@gmail.com> wrote: > > > > On Mon, Sep 13, 2021 at 2:11 PM Richard Biener via Gcc-patches > > <gcc-patches@gcc.gnu.org> wrote: > > > > > > On Fri, Sep 10, 2021 at 2:58 PM liuhongt <hongtao....@intel.com> wrote: > > > > > > > > gcc/ChangeLog: > > > > > > > > * expmed.c (extract_bit_field_using_extv): validate_subreg > > > > before call gen_lowpart. > > > > --- > > > > gcc/expmed.c | 6 +++++- > > > > 1 file changed, 5 insertions(+), 1 deletion(-) > > > > > > > > diff --git a/gcc/expmed.c b/gcc/expmed.c > > > > index 3143f38e057..10d62d857a8 100644 > > > > --- a/gcc/expmed.c > > > > +++ b/gcc/expmed.c > > > > @@ -1571,12 +1571,16 @@ extract_bit_field_using_extv (const > > > > extraction_insn *extv, rtx op0, > > > > > > > > if (GET_MODE (target) != ext_mode) > > > > { > > > > + machine_mode tmode = GET_MODE (target); > > > > /* Don't use LHS paradoxical subreg if explicit truncation is > > > > needed > > > > between the mode of the extraction (word_mode) and the target > > > > mode. Instead, create a temporary and use convert_move to set > > > > the target. */ > > > > if (REG_P (target) > > > > - && TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (target), > > > > ext_mode)) > > > > + && TRULY_NOOP_TRUNCATION_MODES_P (tmode, ext_mode) > > > > + && validate_subreg (ext_mode, tmode, > > > > + target, > > > > + subreg_lowpart_offset (ext_mode, tmode))) > > > > { > > > > target = gen_lowpart (ext_mode, target); > > > > > > That would be equivalent to use gen_lowpart_if_possible? > > No, target will be changed to NULL_RTX. > > But it does avoid ICE since maybe_expand_insn can legitimate operands, > > but I doubt it will introduce other bugs since the target has been > > changed here. > > > > I think the validate_subreg solution is plain and straightforward, > > just like it's done in > > r11-7515-g0ad6de3883a1641f7ec0bd9cf56d41fa5b313dae. > > That guards an explicit gen_rtx_SUBREG, here we're using gen_lowpart. > It's not an obvious match to validate gen_lowpart with validate_subreg, > I thought that gen_lowpart_if_possible would be prefered. You obviously > have to adjust the code, like > > rtx tem; > if (... > && (tem = gen_lowpart_if_possible (ext_mode, target)) > { Yes, update patch
bootstrapped and regtested on x86_64-linux-gnu{-m32,}. Ok for trunk? gcc/ChangeLog: * expmed.c (extract_bit_field_using_extv): Use gen_lowpart_if_possible instead of gen_lowpart to avoid ICE. --- gcc/expmed.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gcc/expmed.c b/gcc/expmed.c index 3143f38e057..59734d4841c 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -1571,14 +1571,16 @@ extract_bit_field_using_extv (const extraction_insn *extv, rtx op0, if (GET_MODE (target) != ext_mode) { + rtx temp; /* Don't use LHS paradoxical subreg if explicit truncation is needed between the mode of the extraction (word_mode) and the target mode. Instead, create a temporary and use convert_move to set the target. */ if (REG_P (target) - && TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (target), ext_mode)) + && TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (target), ext_mode) + && (temp = gen_lowpart_if_possible (ext_mode, target))) { - target = gen_lowpart (ext_mode, target); + target = temp; if (partial_subreg_p (GET_MODE (spec_target), ext_mode)) spec_target_subreg = target; } -- 2.27.0 > target = tem; > ... > > Richard. > > > > > > > > > > if (partial_subreg_p (GET_MODE (spec_target), ext_mode)) > > > > -- > > > > 2.27.0 > > > > > > > > > > > > -- > > BR, > > Hongtao -- BR, Hongtao