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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |needs-bisection
      Known to fail|                            |13.3.0, 15.0, 7.5.0

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
it's RTL DSE, -fno-dse fixes it.

> diff -u a-t.c.299r.cse2 a-t.c.300r.dse1
...
@@ -565,13 +176,6 @@
       REG_BR_PROB 429500
    15: NOTE_INSN_BASIC_BLOCK 3
    17: [0x288000]=0
-   19: [0x288001]=0
-   21: [0x288002]=0
-   23: [0x288003]=0
-   25: [0x288004]=0
-   27: [0x288005]=0
-   29: [0x288006]=0
-   31: [0x288007]=0
    33: r99:DI=[0x288000]
    34: flags:CCZ=cmp(r99:DI,0)
    35: pc={(flags:CCZ==0)?L38:pc}
@@ -584,13 +188,6 @@
    39: NOTE_INSN_BASIC_BLOCK 6
    41: [0x288000]=0x100
    43: [0x288000]=0
-   45: [0x288001]=0
-   47: [0x288002]=0
-   49: [0x288003]=0
-   51: [0x288004]=0
-   53: [0x288005]=0
-   55: [0x288006]=0
-   57: [0x288007]=0
    59: r101:DI=[0x288000]
    60: flags:CCZ=cmp(r101:DI,0)
    61: pc={(flags:CCZ==0)?L64:pc}

DSE fails to realize that insn 33 loads from insn 19.  This is

(insn 17 15 19 3 (set (mem:QI (const_int 2654208 [0x288000]) [0 MEM[(char
*)2654208B]+0 S1 A128])
        (const_int 0 [0])) "t.c":37:19 98 {*movqi_internal}
     (nil)) 
(insn 19 17 21 3 (set (mem:QI (const_int 2654209 [0x288001]) [0 MEM[(char
*)2654209B]+0 S1 A8])
        (const_int 0 [0])) "t.c":37:19 98 {*movqi_internal}
     (nil)) 
...
(insn 33 31 34 3 (set (reg/f:DI 99 [ _14 ])
        (mem/f:DI (const_int 2654208 [0x288000]) [1 MEM[(struct S
*)2654208B].next+0 S8 A128])) "t.c":39:14 95 {*movdi_internal}
     (nil))

it's likely that somehow the constant addresses confuse it.  Seems to be
a long-standing issue.

Reply via email to