On Mon, Jul 1, 2024 at 6:14 AM Roger Sayle <[email protected]> wrote:
>
>
> As promised here's the final ternlog clean-up, that deletes the now
> obsolete legacy patterns and mode iterators from sse.md. It also updates
> the surviving ternlog patterns to consistently use decimal immediate
> operands (instead of hexadecimal), and updates one last test case to
> match this change.
>
> This patch has been tested on x86_64-pc-linux-gnu with make bootstrap
> and make -k check, both with and without --target_board=unix{-m32}
> with no new failures. Ok for mainline?
>
>
> 2024-06-30 Roger Sayle <[email protected]>
>
> gcc/ChangeLog
> * config/i386/sse.md (*vmov<mode>_constm1_pternlog_false_dep):
> Use decimal instead hexadecimal.
> (*<avx512>_cvtmask2<ssemodesuffix><mode>): Likewise.
> (*<avx512>_cvtmask2<ssemodesuffix><mode>_pternlog_false_dep):
> Likewise.
> (any_logic1): Delete define_code_iterator.
> (any_logic2): Likewise.
> (logic_op): Delete define_code_attr.
> (*<avx512>_vpternlog<mode>_1): Delete define_insn_and_split.
> (*<avx512>_vpternlog<mode>_2): Likewise.
> (*<avx512>_vpternlog<mode>_3): Likewise.
> (<mask_codefor>one_cmpl<mode>2<mask_name>): Use decimal.
> (*one_cmpl<mode>2_pternlog_false_dep): Likewise.
> (*andnot<mode>3): Likewise.
> (*iornot<mode>3): Delete define_insn.
> (*xnor<mode>3): Likewise.
> (andor): Delete define_code_iterator.
> (nlogic): Delete define_code_attr.
> (ternlog_nlogic): Likewise.
> (*<nlogic><mode>3): Delete define_insn.
>
> gcc/testsuite/ChangeLog
> * gcc.target/i386/pr100711-6.c: Update to check for decimal
> immediate operand in ternlog, not hexadecimal.
I got an ICE when bootstrapped with --enable-checking=yes,rtl,extra
../pternlog/libgcc/libgcc2.c: In function ‘__multc3’:
../pternlog/libgcc/libgcc2.c:2760:1: internal compiler error: RTL
check: access of elt 1 of 'not' with last elt 0 in recog_269, at
config/i386/sse.md:25221
2760 | }
| ^
0x3826791 internal_error(char const*, ...)
../pternlog/gcc/diagnostic-global-context.cc:491
0x17be383 rtl_check_failed_bounds(rtx_def const*, int, char const*,
int, char const*)
../pternlog/gcc/rtl.cc:741
0x31e8b6e recog_269
../pternlog/gcc/config/i386/sse.md:25221
0x32b6c8b recog_376
../gcc/config/i386/i386.md:1251
0x32bdc29 recog(rtx_def*, rtx_insn*, int*)
../pternlog/gcc/config/i386/sse.md:30262
0x344f1d4 recog_for_combine_1
../pternlog/gcc/combine.cc:11414
0x3453858 recog_for_combine
../pternlog/gcc/combine.cc:11684
0x33f4043 try_combine
../pternlog/gcc/combine.cc:3877
0x33e2539 combine_instructions
../pternlog/gcc/combine.cc:1300
0x34711f2 rest_of_handle_combine
../pternlog/gcc/combine.cc:15127
0x34712ae execute
../pternlog/gcc/combine.cc:15171
Please submit a full bug report, with preprocessed source (by using
-freport-bug).
Please include the complete backtrace with any bug report.
static int
recog_269 (rtx x1 ATTRIBUTE_UNUSED,
rtx_insn *insn ATTRIBUTE_UNUSED,
int *pnum_clobbers ATTRIBUTE_UNUSED)
{
rtx * const operands ATTRIBUTE_UNUSED = &recog_data.operand[0];
rtx x2, x3, x4, x5;
int res ATTRIBUTE_UNUSED;
x2 = XEXP (x1, 0);
operands[0] = x2;
x3 = XEXP (x1, 1);
x4 = XEXP (x3, 1); ----> ICE here, x3 is ((not:TF (reg:TF (306))
operands[2] = x4;
...
case AND:
case IOR:
case XOR:
case NOT:
return recog_269 (x1, insn, pnum_clobbers);
x1 is like
(set (reg:TF 201)
(not:TF (reg:TF 306))
IMHO, x4 = XEXP (x3, 1); operands[2] = x4; should only be used under
specific CASE: inside recog_269, but it's hoisted out and caused ICE.
>
>
> Thanks again,
> Roger
> --
>
--
BR,
Hongtao