On Mon, Aug 7, 2023 at 4:54 PM liuhongt <hongtao....@intel.com> wrote: > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/libgfortran/generated/matmul_i1.c: > In function ‘matmul_i1_avx512f’: > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/libgfortran/generated/matmul_i1.c:1781:1: > internal compiler error: RTL check: expected elt 0 type 'i' or 'n', have 'w' > (rtx const_int) in vpternlog_redundant_operand_mask, at > config/i386/i386.cc:19460 > 1781 | } > | ^ > 0x5559de26dc2d rtl_check_failed_type2(rtx_def const*, int, int, int, char > const*, int, char const*) > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/gcc/rtl.cc:761 > 0x5559de340bfe vpternlog_redundant_operand_mask(rtx_def**) > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/gcc/config/i386/i386.cc:19460 > 0x5559dfec67a6 split_44 > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/gcc/config/i386/sse.md:12730 > 0x5559dfec67a6 split_63 > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/gcc/config/i386/sse.md:28428 > 0x5559deb8a682 try_split(rtx_def*, rtx_insn*, int) > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/gcc/emit-rtl.cc:3800 > 0x5559deb8adf2 try_split(rtx_def*, rtx_insn*, int) > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/gcc/emit-rtl.cc:3972 > 0x5559def69194 split_insn > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/gcc/recog.cc:3385 > 0x5559def70c57 split_all_insns() > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/gcc/recog.cc:3489 > 0x5559def70d0c execute > > /var/tmp/portage/sys-devel/gcc-14.0.0_pre20230806/work/gcc-14-20230806/gcc/recog.cc:4413 > > Use INTVAL (imm_op) instead of XINT (imm_op, 0). > > Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}. > Ok for trunk? Pushed to trunk as an obvious fix. > > gcc/ChangeLog: > > * config/i386/i386-protos.h (vpternlog_redundant_operand_mask): > Adjust parameter type. > * config/i386/i386.cc (vpternlog_redundant_operand_mask): Use > INTVAL instead of XINT, also adjust parameter type from rtx* to > rtx since the function only needs operands[4] in vpternlog > pattern. > (substitute_vpternlog_operands): Pass operands[4] instead of > operands to vpternlog_redundant_operand_mask > * config/i386/sse.md: Ditto. > --- > gcc/config/i386/i386-protos.h | 2 +- > gcc/config/i386/i386.cc | 6 +++--- > gcc/config/i386/sse.md | 4 ++-- > 3 files changed, 6 insertions(+), 6 deletions(-) > > diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h > index e547ee64587..fc2f1f13b78 100644 > --- a/gcc/config/i386/i386-protos.h > +++ b/gcc/config/i386/i386-protos.h > @@ -70,7 +70,7 @@ extern machine_mode ix86_cc_mode (enum rtx_code, rtx, rtx); > extern int avx_vpermilp_parallel (rtx par, machine_mode mode); > extern int avx_vperm2f128_parallel (rtx par, machine_mode mode); > > -extern int vpternlog_redundant_operand_mask (rtx[]); > +extern int vpternlog_redundant_operand_mask (rtx); > extern void substitute_vpternlog_operands (rtx[]); > > extern bool ix86_expand_strlen (rtx, rtx, rtx, rtx); > diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc > index 8cd26eb54fa..50860050049 100644 > --- a/gcc/config/i386/i386.cc > +++ b/gcc/config/i386/i386.cc > @@ -19454,10 +19454,10 @@ avx_vperm2f128_parallel (rtx par, machine_mode mode) > /* Return a mask of VPTERNLOG operands that do not affect output. */ > > int > -vpternlog_redundant_operand_mask (rtx *operands) > +vpternlog_redundant_operand_mask (rtx pternlog_imm) > { > int mask = 0; > - int imm8 = XINT (operands[4], 0); > + int imm8 = INTVAL (pternlog_imm); > > if (((imm8 >> 4) & 0x0F) == (imm8 & 0x0F)) > mask |= 1; > @@ -19475,7 +19475,7 @@ vpternlog_redundant_operand_mask (rtx *operands) > void > substitute_vpternlog_operands (rtx *operands) > { > - int mask = vpternlog_redundant_operand_mask (operands); > + int mask = vpternlog_redundant_operand_mask (operands[4]); > > if (mask & 1) /* The first operand is redundant. */ > operands[1] = operands[2]; > diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md > index 7e2aa3f995c..c53450fd965 100644 > --- a/gcc/config/i386/sse.md > +++ b/gcc/config/i386/sse.md > @@ -12706,7 +12706,7 @@ (define_split > (match_operand:V 3 "memory_operand") > (match_operand:SI 4 "const_0_to_255_operand")] > UNSPEC_VTERNLOG))] > - "!reload_completed && vpternlog_redundant_operand_mask (operands) == 3" > + "!reload_completed && vpternlog_redundant_operand_mask (operands[4]) == 3" > [(set (match_dup 0) > (match_dup 3)) > (set (match_dup 0) > @@ -12727,7 +12727,7 @@ (define_split > (match_operand:V 3 "nonimmediate_operand") > (match_operand:SI 4 "const_0_to_255_operand")] > UNSPEC_VTERNLOG))] > - "!reload_completed && vpternlog_redundant_operand_mask (operands) != 0" > + "!reload_completed && vpternlog_redundant_operand_mask (operands[4]) != 0" > [(set (match_dup 0) > (unspec:V > [(match_dup 1) > -- > 2.31.1 >
-- BR, Hongtao