[Bug tree-optimization/84811] ICE on valid code at -O3 in 64-bit mode on x86_64-linux-gnu: in smallest_mode_for_size, at stor-layout.c:355

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sun Mar 18 11:05:00 GMT 2018


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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|WAITING                     |NEW

--- Comment #21 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Ah, ok, so the difference is in your case for some reason I don't understand
you get:
;; b[2180000000000000000][8] = 1;

(insn 28 27 29 (set (reg/f:DI 104)
        (symbol_ref:DI ("b") [flags 0x2]  <var_decl 0x7f98b10d7ea0 b>))
"small.c":9 -1
     (nil))

(insn 29 28 30 (set (reg:DI 105)
        (const_int 162675373468811328 [0x241f063e9500040])) "small.c":9 -1
     (nil))

(insn 30 29 31 (parallel [
            (set (reg/f:DI 106)
                (plus:DI (reg/f:DI 104)
                    (reg:DI 105)))
            (clobber (reg:CC 17 flags))
        ]) "small.c":9 -1
     (nil))

(insn 31 30 0 (set (mem:DI (reg/f:DI 106) [2 b S8 A128])
        (const_int 1 [0x1])) "small.c":9 -1
     (nil))
while I get:
;; b[2180000000000000000][8] = 1;

(insn 28 27 29 (set (reg/f:DI 104)
        (symbol_ref:DI ("b") [flags 0x2]  <var_decl 0x7f9eb9c05ea0 b>))
"small.c":9 -1
     (nil))

(insn 29 28 30 (set (reg:DI 105)
        (const_int -9060696663385964480 [0x8241f063e9500040])) "small.c":9 -1
     (nil))

(insn 30 29 31 (parallel [
            (set (reg/f:DI 106)
                (plus:DI (reg/f:DI 104)
                    (reg:DI 105)))
            (clobber (reg:CC 17 flags))
        ]) "small.c":9 -1
     (nil))

(insn 31 30 0 (set (mem:DI (reg/f:DI 106) [2 b S8 A128])
        (const_int 1 [0x1])) "small.c":9 -1
     (nil))

Note that the topmost bit is lost.

Anyway, if I write what I see in your dump:
int a;
long b[1][9];
typedef long V __attribute__((vector_size (16), may_alias));

void
foo ()
{ 
  V *c = (V *) ((char *) b + -9060696663385964544);
  *c = (V) { 1, 1 };
  c++;
  *c = (V) { 1, 1 }; 
  c++;
  *c = (V) { 1, 1 };
  c++;
  *c = (V) { 1, 1 }; 
  long __attribute__((may_alias)) *d = (long *) ((char *) b +
162675373468811328);
  *d = 1;
}

then I get the ICE you are getting, so I'll have a look at that.


More information about the Gcc-bugs mailing list