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

            Bug ID: 65117
           Summary: xtensa: With -Os, invalid parameter c1 for
                    reg_class_subset_p() to cause segment fault.
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gang.chen.5i5j at gmail dot com

The related source file:

# cat r100.i

#pragma pack()

struct r100_cs_cube_info {
 char a[17];
 unsigned int width;
 unsigned int height;
};

struct r100_cs_track_texture {
 char a[96];
 struct r100_cs_cube_info cube_info[5];
 unsigned int tex_coord_type;
 unsigned int txdepth;
 char roundup_h;
};

struct r100_cs_track {
 char a[89];
 unsigned int num_cb;
 unsigned int num_texture;
 struct r100_cs_track_texture textures[2];
};

struct radeon_device;
void r100_cs_track_clear(int x, struct r100_cs_track *y)
{
 int i, j;

 for (i = 0; i < y->num_texture; i++) {
  if (x <= 8)
   y->textures[i].txdepth = 0;
  else {
   y->textures[i].txdepth = 9;
   y->textures[i].tex_coord_type = 1;
  }
  y->textures[i].roundup_h = 0;
  if (y->num_cb)
   for (j= 0; j < 5; j++) {
    y->textures[i].cube_info[j].width = 2;
    y->textures[i].cube_info[j].height = 2;
   }
 }
}


The related issue:

# /upstream/release-xtensa/libexec/gcc/xtensa-gchen-elf32/5.0.0/cc1 -Os r100.i  

r100.i: In function 'r100_cs_track_clear':
r100.i:43:1: internal compiler error: Segmentation fault
 }
 ^
0xa4427f crash_signal
    ../../gcc-xtensa/gcc/toplev.c:383
0x9c79c0 reg_class_subset_p(int, int)
    ../../gcc-xtensa/gcc/reginfo.c:1221
0x9d7a0c find_reloads(rtx_insn*, int, int, int, short*)
    ../../gcc-xtensa/gcc/reload.c:3678
0x9e2cbb reload_as_needed
    ../../gcc-xtensa/gcc/reload1.c:4688
0x9e8460 reload(rtx_insn*, int)
    ../../gcc-xtensa/gcc/reload1.c:1092
0x8cdb2d do_reload
    ../../gcc-xtensa/gcc/ira.c:5430
0x8cdb2d execute
    ../../gcc-xtensa/gcc/ira.c:5589


The related version:

# /upstream/release-xtensa/bin/xtensa-gchen-elf32-gcc -v
Using built-in specs.
COLLECT_GCC=/upstream/release-xtensa/bin/xtensa-gchen-elf32-gcc
COLLECT_LTO_WRAPPER=/upstream/release-xtensa/libexec/gcc/xtensa-gchen-elf32/5.0.0/lto-wrapper
Target: xtensa-gchen-elf32
Configured with: ../gcc-xtensa/configure --target=xtensa-gchen-elf32
--prefix=/upstream/release-xtensa --disable-nls --enable-languages=c
--disable-threads --disable-shared --enable-libssp --disable-libquadmath
--disable-libgomp --disable-libatomic
Thread model: single
gcc version 5.0.0 20150219 (experimental) (GCC) 
# /upstream/release-xtensa/bin/xtensa-gchen-elf32-ld -v
GNU ld (GNU Binutils) 2.25.51.20150219


I shall try to fix it within this month, at present, the direct cause is: for
reg_class_subset_p(), the upper caller passes an incorrect parameter c1 which
value is -926186479, and this issue has only effect with -Os (no effect with
-O0, or -O2 ...).

Reply via email to