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

            Bug ID: 112871
           Summary: [14 Regression] RISCV ICE: in extract_insn, at
                    recog.cc:2804 (unrecognizable insn) with -03
                    rv32gc_zicond
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: patrick at rivosinc dot com
  Target Milestone: ---

Created attachment 56808
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56808&action=edit
-freport-bug output

Output:
> /scratch/tc-testing/tc-dec-4-trunk/build-rv64gcv/bin/riscv64-unknown-linux-gnu-gcc
>  -mabi=ilp32d -march=rv32gc_zicond -O3 red.c -freport-bug
red.c: In function 'k':
red.c:17:1: error: unrecognizable insn:
   17 | }
      | ^
(insn 104 103 105 14 (set (reg:SI 214)
        (if_then_else:SI (ne:SI (reg:SI 134 [ i.5_1 ])
                (const_int 0 [0]))
            (reg:SI 134 [ i.5_1 ])
            (reg:SI 215))) "red.c":13:7 discrim 6 -1
     (nil))
during RTL pass: vregs
red.c:17:1: internal compiler error: in extract_insn, at recog.cc:2804
0xa27c0b _fatal_insn(char const*, rtx_def const*, char const*, int, char
const*)
        ../../../gcc/gcc/rtl-error.cc:108
0xa27c2d _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
        ../../../gcc/gcc/rtl-error.cc:116
0xa26501 extract_insn(rtx_insn*)
        ../../../gcc/gcc/recog.cc:2804
0xedc05e instantiate_virtual_regs_in_insn
        ../../../gcc/gcc/function.cc:1610
0xedc05e instantiate_virtual_regs
        ../../../gcc/gcc/function.cc:1993
0xedc05e execute
        ../../../gcc/gcc/function.cc:2040
Please submit a full bug report, with preprocessed source.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
Preprocessed source stored into /scratch/tmp/ccEMDYFG.out file, please attach
this to your bugreport.

Testcase:
short a, c;
int b, d, i;
volatile char e;
static int f[] = {1, 1};
long g;
int volatile h;
short(j)() { return b ? a : 0; }
void k() {
l:
  h;
  g = 0;
  for (; g <= 2; g++) {
    d | ((i || j() & (0 == f[g])) ^ i) && e;
    if (c)
      goto l;
  }
}

Godbolt:
https://godbolt.org/z/31TYfjevE

Reply via email to