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

Ian Lance Taylor <ian at airs dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ian at airs dot com

--- Comment #8 from Ian Lance Taylor <ian at airs dot com> ---
This program should print

0
1

but when I run it on gcc112.fsffrance.org, compiling with -O2, it prints

1
824633846216


package main

func main() {
        for _, test := range []struct {
                x, y, want []int
        }{
                {[]int{}, []int{}, nil},
                {[]int{0}, []int{0}, []int{0}},
        } {
                p := test.x
                F(p)
        }
}

func F(v interface{}) {
     recover()
     println(cap(v.([]int)))
}

This can be compiled (though not run) using a cross-compiler without building
libgo.

The code coming into 280r.dse1 seems to be indexing from the end of the array. 
I see

code_label 96 126 55 4 118 (nil) [0 uses])
(note 55 96 56 4 [bb 4] NOTE_INSN_BASIC_BLOCK)
(insn 56 55 57 4 (set (reg:DI 144)
        (mult:DI (reg:DI 121 [ ivtmp_47 ])
            (const_int -72 [0xffffffffffffffb8]))) "foo.go":4:2 154 {muldi3}
     (nil))
(insn 57 56 59 4 (set (reg/f:DI 145)
        (plus:DI (reg/f:DI 173)
            (reg:DI 144))) "foo.go":4:2 66 {*adddi3}
     (expr_list:REG_DEAD (reg/f:DI 173)
        (expr_list:REG_DEAD (reg:DI 144)
            (nil))))

where earlier I see

(insn 17 16 19 2 (set (mem/f/c:DI (plus:DI (reg/f:DI 110 sfp)
                (const_int 32 [0x20])) [8 GOTMP.5[0].x.__values+0 S8 A128])
        (reg/f:DI 117 [ _11 ])) "foo.go":4:23 670 {*movdi_internal64}
     (expr_list:REG_DEAD (reg/f:DI 117 [ _11 ])
        (nil)))

and

(insn 120 4 121 2 (set (reg/f:DI 173)
        (plus:DI (reg/f:DI 110 sfp)
            (const_int 32 [0x20]))) 66 {*adddi3}
     (nil))

So register 173 is &GOTMP.5 although insn 120 doesn't indicate that.  Then the
280r.dse1 pass drops out all the assignments to GOTMP.5, presumably because it
doesn't understand that register 173 points to it.

Reply via email to