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

            Bug ID: 89996
           Summary: [avr] ICE in expand_expr_real_2 with -O3
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gandalf at winds dot org
  Target Milestone: ---

The following fails with GCC 8.2 and 8.3 on AVR. The below output is from 8.3:

# avr-gcc -v -O3 -mmcu=atmega1284p -c test2.c -o test2.o
Using built-in specs.
Reading specs from
/usr/local/avr/lib/gcc/avr/8.3.0/device-specs/specs-atmega1284p
COLLECT_GCC=avr-gcc
Target: avr
Configured with: ../configure --target=avr --prefix=/usr/local/avr
--disable-nls --enable-languages=c --disable-bootstrap --disable-libssp
Thread model: single
gcc version 8.3.0 (GCC) 
COLLECT_GCC_OPTIONS='-v' '-O3'  '-c' '-o' 'test2.o'
'-specs=device-specs/specs-atmega1284p' '-mmcu=avr51'
 /usr/local/avr/libexec/gcc/avr/8.3.0/cc1 -quiet -v -imultilib avr51
-D__AVR_ATmega1284P__ -D__AVR_DEVICE_NAME__=atmega1284p test2.c -mn-flash=2
-mno-skip-bug -quiet -dumpbase test2.c -mmcu=avr51 -auxbase-strip test2.o -O3
-version -o /tmp/ccYds885.s
GNU C17 (GCC) version 8.3.0 (avr)
        compiled by GNU C version 8.3.0, GMP version 6.1.2, MPFR version 4.0.2,
MPC version 1.1.0, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory
"/usr/local/avr/lib/gcc/avr/8.3.0/../../../../avr/sys-include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/avr/lib/gcc/avr/8.3.0/include
 /usr/local/avr/lib/gcc/avr/8.3.0/include-fixed
 /usr/local/avr/lib/gcc/avr/8.3.0/../../../../avr/include
End of search list.
GNU C17 (GCC) version 8.3.0 (avr)
        compiled by GNU C version 8.3.0, GMP version 6.1.2, MPFR version 4.0.2,
MPC version 1.1.0, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: e17ca263eb8b0996b4ab7dcf63f27ece
during RTL pass: expand
test2.c: In function 'send_document.isra.0.constprop':
test2.c:33:11: internal compiler error: in expand_expr_real_2, at expr.c:8573
0x51269b expand_expr_real_2(separate_ops*, rtx_def*, machine_mode,
expand_modifier)
        ../../gcc/expr.c:8573
0x70e9a0 expand_expr_real_1(tree_node*, rtx_def*, machine_mode,
expand_modifier, rtx_def**, bool)
        ../../gcc/expr.c:9968
0x71c001 expand_expr
        ../../gcc/expr.h:280
0x71c001 expand_expr_real_2(separate_ops*, rtx_def*, machine_mode,
expand_modifier)
        ../../gcc/expr.c:8575
0x70e9a0 expand_expr_real_1(tree_node*, rtx_def*, machine_mode,
expand_modifier, rtx_def**, bool)
        ../../gcc/expr.c:9968
0x6195f1 expand_normal
        ../../gcc/expr.h:286
0x6195f1 precompute_register_parameters
        ../../gcc/calls.c:989
0x6195f1 expand_call(tree_node*, rtx_def*, int)
        ../../gcc/calls.c:4127
0x70e2e6 expand_expr_real_1(tree_node*, rtx_def*, machine_mode,
expand_modifier, rtx_def**, bool)
        ../../gcc/expr.c:11050
0x71734b store_expr_with_bounds(tree_node*, rtx_def*, int, bool, bool,
tree_node*)
        ../../gcc/expr.c:5651
0x718189 expand_assignment(tree_node*, tree_node*, bool)
        ../../gcc/expr.c:5419
0x718189 expand_assignment(tree_node*, tree_node*, bool)
        ../../gcc/expr.c:4954
0x626e38 expand_call_stmt
        ../../gcc/cfgexpand.c:2702
0x626e38 expand_gimple_stmt_1
        ../../gcc/cfgexpand.c:3638
0x626e38 expand_gimple_stmt
        ../../gcc/cfgexpand.c:3804
0x628c4f expand_gimple_basic_block
        ../../gcc/cfgexpand.c:5833
0x62dcc6 execute
        ../../gcc/cfgexpand.c:6439
Please submit a full bug report.



Code to reproduce:

extern char *strrchr(const char *, int) __attribute__((__pure__));
extern int strcasecmp_P(const char *, const char *) __attribute__((__pure__));

static const struct {
  char ext[5];
  const char __flash *desc;
  _Bool subst;
} __flash mime_types[]={
  {"txt", ((const char __flash []){("text/plain; charset=utf-8")}), 1},
  {"html", ((const char __flash []){("text/html; charset=utf-8")}), 1},
  {"htm", ((const char __flash []){("text/html; charset=utf-8")}), 1},
};

struct http {
  char uri[128];
  _Bool sendfile_subst;
};

typedef struct {
  unsigned char user[sizeof(struct http)];
} DESC;

static void send_document(DESC *d, short err, const char __flash *err_string,
                          const char *file, _Bool conn_close)
{
  struct http *hd=(void *)d->user;
  const char *ext;
  unsigned char i;
  _Bool subst=0;

  if((ext=strrchr(file, '.'))) {
    for(i=0;i < (int)(sizeof(mime_types)/sizeof(mime_types[0]));i++)
      if(!strcasecmp_P(ext, mime_types[i].ext)) {
        subst=mime_types[i].subst;
        break;
      }
  }

  hd->sendfile_subst=subst;
}

static void http_do_uri_request(DESC *d)
{
  struct http *hd=(void *)d->user;
  char *uri=hd->uri;

  if(*uri != '/') {
    send_document(d, 400, ({ static const char __flash _str[]=("Bad Request");
_str; }), "error/400.html", 1);
    return;
  }

  send_document(d, 403, ({ static const char __flash _str[]=("Forbidden");
_str; }), "error/403.html", 0);
}

int main()
{
  http_do_uri_request((void *)123);
}


Notes:

The ICE does not happen if flag -O2 is used instead of -O3.

Also no ICE happens if the __flash keyword is removed from before
"mime_types[]={".

Also no ICE happens if the number of entries in mime_types[] is less than 3.

Reply via email to